Piero V.

Cosa sono gli hook

Spesso quando parlo dello sviluppo dei plugin di Flatoress o in generale dello sviluppo di un sito web dico sempre qualcosa riguardante gli hook, che però non sono un concetto noto a tutti, perciò ho deciso di fare questo post di spiegazione.

Innanzitutto un programma o uno script possono essere divisi in blocchi (più o meno grandi), come inizializzazione, preparazione del contenuto, output del contenuto, chiusura delle risorse utilizzate (connessioni al database etc…).

Lo scopo degli hook è di poter inserire dinamicamente una porzione di codice (per esempio una funzione) in questi blocchi, infatti hook in italiano vuol dire gancio. Talvolta gli hook possono anche sostituire i comportamenti di default di un programma.

Gli hook sono praticamente ciò che rende un programma estendibile.

Per esempio grazie agli hook si può commutare da un sistema di indirizzi che si basa su variabili GET ad un sistema di indirizzi basato sul mod_rewrite più SEO-compatibile: si inserisce una funzione che all’inizializzazione dei parametri “raccoglie” gli URL riscritti e poi si usa un altro hook per creare i link.

Usano gli hook anche grandi progetti come Wordpress o Dokuwiki.

Le caratteristiche pratiche dal punto di vista della programmazione degli hook sono:

  • presenza di funzioni che permettono di aggiungerli, modificarli, rimuoverli o eseguirli
  • un sistema di priorità per eseguire delle porzioni di codice prima o dopo di altre
  • la possibilità di essere chiamati molte volte
  • la possibilità di poterne creare di nuovi dinamicamente

Un primordiale sistema di hook è abbastanza semplice da implementare: è una lista di callback da eseguire. Perciò, per esempio, basta creare un array multidimensionale: nel primo array si inserisce la priorità per chiave e il valore un array con il nome delle funzioni da chiamare (per esempio, in PHP tramite call_user_func).

Spero di essere stato il più chiaro possibile, altrimenti fatemelo sapere via commento.

Plugin Tag (v2.1) [Flatpress]

Italiano

Ho aggiornato il plugin Tag (ora alla versione 2.1).

È stato riscritto in modo che fosse più leggero e che gravasse meno sul server.

Inoltre ho commentato tutto il codice per rendere più facile la vita agli sviluppatori e ho corretto il malfunzionamento con le pagine e PrettyURLs (grazie a Hubert).

L’algoritmo dei widget è stato riscritto: ora la grandezza dei tag non è più per classi, ma calcola la dimensione per ogni tag. Questa può essere personalizzata nel file plugin.tag.php. Le classi sono state comunque mantenute per poter colorare i tag. Bisogna rimuovere la cache dei widget o eliminando la cache, o modificando un post o eliminando il file fp-content/cache/tag-widget.tmp.

Mancano un pannello di amministrazione per i tag perché non lo ritengo necessario e i post simili che usano il meccanismo dei tag (è una cosa troppo difficile da fare senza SQL).

C’è invece una lista dei tag già usati nell’editor dei post ma è disattivata di default perché ingombra troppo. Invece fare una soluzione tipo Facebook mi pareva troppo pesante e complicato.

Anche se alla versione 2.1 e funziona (vedi il mio sito) è ancora in fase beta. … [Leggi il resto]

Quando si dice brutto codice

Questo post lo capirà solo chi sa il PHP 😀 .

Ogni tanto sul web ci sono degli script molto quotati, che magari funzionano anche bene.

Però quando leggi questa chicca qua veramente ci ripensi se alla fine il codice è così fatto bene…

Direttamente dal web questo esempio:

    $data = preg_replace("/'/","'",$data);
    $data = preg_replace("/[\n\r]/","",$data);

Si vede come l’autore ha usato un’espressione regolare per tirare via dei caratteri, cosa che avrebbe potuto semplicemente fare con str_replace che è molto più veloce ed è la funzione per fare questa cosa qui…

Funzione "input" per Smarty

Ho creato una funzione per creare in automatico degli input su smarty, di tutti i tipi.

Forse quello più incompleto è il checkbox, che però per il momento non mi risulta utile cambiare.

Un’altra caratteristica di questa funzione è quella di fissare un value se presente in $_POST o in $_REQUEST ad esclusione dell’input type="password".

Il codice PHP è:

function smarty_tplinput($params, &$smarty) {

	$name=wp_specialchars(isset($params['name']) ? $params['name'] : '');
	$type=wp_specialchars(isset($params['type']) ? $params['type'] : 'text');
	$other=empty($params['other']) ? '' : ' '.$params['other'];

	if(isset($params['noautocompile'])) $params['autocompile']=false;
	if(!isset($params['autocompile']) && $type!='password') $params['autocompile']=true;
	elseif(!isset($params['autocompile'])) $params['autocompile']=false;

	$value='';
	if(!empty($params['value'])) {
		$value=wp_specialchars($params['value']);
	} elseif($type=='file') {
	} elseif($params['autocompile']==false) {
	} else {
		if(!empty($_POST[$name])) $value=wp_specialchars($_POST[$name]);
		elseif(!empty($_REQUEST[$name])) $value=wp_specialchars($_REQUEST[$name]);
	}

	$checked='';
	if(isset($params['checked'])) {
		$checked=$params['checked']==true ? ' checked="checked"' : '';
	} elseif($type=='checkbox') {
		$checked=$value=='on' ? ' checked="checked"' : '';
		$value='';
	} elseif($type=='radio') {
		if(!empty($_POST[$name])) $checked=$_POST[$name]==$value;
		elseif(!empty($_REQUEST[$name])) $checked=$_REQUEST[$name]==$value;
		$checked=$checked ? ' checked="checked"' : '';
	}

	switch($type) {
		case 'textarea':
			echo "<textarea{$other} name="{$name}" id="{$name}">n{$value}</textarea>";
			break;
		default:
			$value=empty($value) ? '' : " value="{$value}"";
			echo "<input type="{$type}" name="{$name}" id="{$name}"{$value}{$checked}{$other} />";
			break;
	}

}
$smarty->registerPlugin('function', 'input', 'smarty_tplinput');

È fatta per smarty 3 ma con qualche piccolo cambiamento dovrebbe essere compatibile anche con smarty 2. … [Leggi il resto]

Strrpos

Per velocizzare la nuova versione di rewriteurls, volevo fare uso della funzione strrpos di PHP.

Tra l’altro non pensavo esistesse la funzione che facesse al caso mio, invece eccola là 😊 .

Tuttavia la tega arriva comunque: su PHP 4 il valore ricercato deve essere una stringa di 1 carattere che poi è trasformata in numero, quello del carattere.

Invece in PHP 5 tutto ok.

Non è la prima volta che mi trovo di fronte a una scelta simile, ma visto che sto lavorando per Flatpress ho preferito tenermi compatibile con PHP 4, così ho fatto una funzione che potesse avere lo stesso esito, ed eccola qua.

Anche gli offset negativi sono supportati 😁 .

function strrpos_hack($haystack, $needle, $offset=0) {
	if(version_compare(PHP_VERSION, '5.0.0', '<')) {
		# PHP 4
		$oldpos=false;
		$len=strlen($needle);
		if($offset<0) {
			$haystack=substr($haystack, 0, $offset);
			$offset=0;
		}
		$off=$offset;
		while(($pos=strpos($haystack, $needle, $off))!==false) {
			$off=$pos+$len;
			$oldpos=$pos;
		}
		return $oldpos;
	} else {
		return strrpos($haystack, $needle, $offset);
	}
}

La prima cosa che fa è controllare se è PHP 5, tuttavia all’inizio io che non dispongo di un PHP4 (troppe noie ad attivarlo su Altervista), così risparmia un bel po’ di lavoro a noi. … [Leggi il resto]