Post

Archivio di August, 2007

PHP: interfaccia per indentare il codice

Se avete del codice scritto velocemente tempo fa, o se dovete leggere codice non vostro e non indentato correttamente, questa interfaccia permette di migliorare l’aspetto del codice, impostando le indentazioni, le parentesi e gli spazi secondo le linee guida di PEAR:

http://www.tote-taste.de/X-Project/beautify/ 

Si possono anche scaricare le librerie che permettono di fare “il trucco” :)

PHP+Ajax: tendina province e comuni

Per fare selezionare un comune dal database servirebbe una tendina di 8000 voci… una possibilità è fare due tendine, una per provincia e una per comune, facendo popolare la seconda in base alla scelta fatta nella prima. Serve:

Una funzione Javascript per il popolamento:

<script type="text/javascript">
function change(ref)
{
  var selid = ref.selectedIndex;
  var value = ref.options[selid].value;  var url = "popola.php";
  var pars="id_provincia="+value;

var myAjax = new Ajax.Request(  url,
  {
    method: 'get',
    parameters: pars,
    onComplete: function (data)
   {
      $('selectComune').innerHTML = data.responseText;
    }
  });
}
</script>

Uno script PHP che esegua la query per il popolamento:

<?
  if (isset($_GET["id_provincia"])){  $strSQL="SELECT * FROM comuni";
  if (is_numeric($_GET["id_provincia"]) AND $_GET["id_provincia"]>0) $strSQL.=" WHERE     id_provincia=".$_GET["id_provincia"];
  $strSQL.=" ORDER BY comune";

// connessione al db
  $connessione=mysql_connect("localhost", "utente", "password");
  $db=mysql_select_db("nomedb") OR DIE ("Impossibile connettersi al database");

$risultati=mysql_query($strSQL) OR DIE ("Impossibile eseguire la query");

  // scrivo la select per intero
  echo "<select class=\"testo_input\" style=\"width: 147px; float: left;\" title=\"selezionare il comune\"
        name=\"comune_mod\" id=\"comune_mod\"><option value=\"0\">Scegli un
        comune</option>";

  while ($rs=mysql_fetch_array($risultati)){
      if($rs["id_comune"] == $_POST[comune_mod]) $selected = "selected"; else $selected = "";
      echo "<option value=\"".$rs["id_comune"]."\">".htmlentities($rs["comune"])."</option>";
    }

    echo "</select>";
    $chiudi=mysql_close($connessione);
  }
?>

Il form:

<form action="index.php?page=lista&amp;sezione=turismo&amp;lang=<?=$lang?>" enctype="multipart/form-data" method="POST" target="_self">
<select style="width:147px; float:left;" class="testo_input" title="selezionare la provincia di appartenenza" name="comune_mod_p" id=
"comune_mod_p" onchange="change(this);">
<option value="">Prima scegli la provincia</option>
<?
$strProvince="SELECT id_provincia, nomeprovincia FROM province";
$risultati=mysql_query($strProvince) OR DIE ("Impossibile eseguire la query");
// scrivo la select per intero
while ($rs=mysql_fetch_array($risultati)){
  //    if($rs["id_provincia"] == $_POST[comune_mod_p]) $selected = "selected"; else $selected = "";
  echo "<option value=\"".$rs["id_provincia"]."\"".$selected.">".$rs["nomeprovincia"]."</option>";
}
?>
</select>
<br/>
<span id="selectComune">
<select class="testo_input" style="visibility: hidden;width:147px; float:left;"></select>
</span><input type="submit" value=<? echo $l_cerca["$lang"]?> class="tasto_cerca" name="cerca_comune">
</form>

PHP: come evidenziare i risultati di una ricerca in una pagina HTML

Avete presente Google quando visualizzate in HTML una pagina PDF risultato di una ricerca, che vi fa vedere evidenziate le parole chiave che avete scelto? Beh, si può fare abbastanza velocemente in PHP!

Per farlo si possono usare le funzioni ob_start() e ob_end_flush() che permettono di bufferizzare l’output generato tra di esse e di passarlo ad una funzione di callback prima di visualizzarlo. Nella funzione di callback si può usare allora eregi_replace() per sostituire le parti di testo che ci interessano con la stessa parte evidenziata.

Ecco il codice:

// funzione che sostituisce il contenuto del buffer
function callback($buffer) {
global $cerca;
// sostituisce tutto quello che non è in un tag con la stessa cosa evidenziata in CSS
if($cerca) return (eregi_replace("(>[^<]*)($cerca)([^>]*<)", "\\1<span class=\"highlighted\">\\2</span>\\3", $buffer));
return $buffer;
}


if($cerca) ob_start("callback"); // inizia il buffer
print "Il mio contenuto";
if($cerca) ob_end_flush(); // termina il buffer

Fatto! L’espressione regolare è case insensitive (eregi_replace() invece di ereg_replace()) e corrisponde a tutto quello che sta fuori di <>, non sostituendo quindi parole chiave ad esempio all’interno di url nei tag <a>.

Basterà impostare una classe nel CSS che evidenzi ad esempio in giallo:

.highlighted {
background-color: yellow;
}

Archivi e link