Piero V.

Where Clause con Array in PHP

Una delle più belle funzioni dei DB relazionali è senz’altro la “Where Clause”.

Però nei database di testo purtroppo non è presente ☹️

Ecco una funzione che serve per trovare da un array multidimensionale dei suoi valori o delle sue chiavi (ovvero ‘values’ o ‘key’ nel parametro $what) dicendo che valore ($value) si vuole trovare per quale chiave ($key).

È possibile limitare la ricerca a un numero di valori o a tutti i valori specificandola in $num.

La rilascio in pubblico dominio, ovvero potete farne quello che volete!

function whereClause($array, $key, $value, $num=-1, $what='values') {
	if(!is_array($array) || count($array)==0) return false;
	$r=array();
	$i=0;
	foreach($array as $k=>$v) {
		# TODO: Just equal?
		if($v[$key]==$value) {
			$r[]=($what=='keys') ? $k : $v;
			$i++;
			if($i>=$num && $num>0) break;
		}
	}
	return $r;
}

Creare un file SWF per riprodurre un suono

Mi servirebbe un effetto sonoro per una pagina web perciò la scelta migliore è purtroppo il flash.

Con l’estensione ming di php e il codice di gazbming.com ho potuto creare questo file php che salva il file prova.swf che riproduce il file MP3 prova.mp3:

<?php

  Ming_setScale(20.0000000);

  $m = new SWFMovie();
  $m->setDimension(1, 1);
  $m->setBackground(0x00, 0x00, 0x00);

  $m->setRate(31);

  $mp3=fopen('prova.mp3', 'rb');

  $numofframes=$m->streamMp3($mp3);
  while($numofframes-->0){
    $m->nextFrame();
  }

  #header('Content-type: application/x-shockwave-flash');
  #$m->output();
  set_time_limit(3600);
  $m->save('prova.swf');

Per chiarezza: la quartultima e la terzultima riga sono commentate perché darebbero l’output su schermo.

Ciò che fa questo codice è creare un movie SWF di dimensioni 1×1 e sfondo nero, riprodurre il file prova.mp3 e salvare il movie prodotto nel file prova.swf.

La penultima riga è solo di precauzione: ho provato con una canzone da 4 minuti e la prima volta mi ha dato errore perché i 30 secondi erano passati, poi ho aggiunto un limite di un’ora (3600 secondi) e non ho più avuto problemi.

Il test lo dovrete fare in locale quasi al 100% perché non penso che molti provvedano a dare l’estensione ming di PHP e perché è più comodo avere un file generato una volta per alleggerire il webserver.

Ringrazio di nuovo il sito sopra citato e spero vi sia di aiuto.

Flatpress: Next/Prev Page link and PrettyURLs

Italiano

(See below for English)

Come ho già detto in qualche post fa, sto facendo un plugin per implementare i tag su flatpress.

Dopo alcuni giorni di lavoro, pensando di averlo finito, mi accorgo di un bug: dalla seconda pagina non funziona più il filtro dei tag (e me ne sono accorto per puro caso!!)

La colpa è di Pretty URLs, che gestisce gli url delle pagine ricreandoli dall’inizio.

Le soluzioni sono quattro:

  1. Fare un plugin che non supporta PrettyURLs
  2. Fare un plugin che usi delle estensioni PECL
  3. Fare un plugin solo per PHP 4 (e io uso PHP5 😊 )
  4. Fare una classe sostitutiva a pretty urls

L’unica che mi pare accettabile è la quarta, ed ecco il codice (testato, sembra funzionare):

## Replacement Class for PrettyURLs Plugin
if(class_exists('Plugin_PrettyURLs')) {
	class class_name {
		function class_name(&$original) { # Constructor
			$this->original=&$original;
			$this->baseurl=&$original->baseurl;
		}
		function permalink($str, $id) {
			return $this->original->permalink($str, $id);
		}
		function commentlink($str, $id) {
			return $this->original->commentlink($str, $id);
		}
		function feedlink($str, $type) {
			return $this->original->feedlink($str, $type);
		}
		function commentsfeedlink($str, $type, $id) {
			return $this->original->commentsfeedlink($str, $type, $id);
		}
		function staticlink($str, $id) {
			return $this->original->staticlink($str, $id);
		}
		function categorylink($str, $catid) {
			return $this->original->categorylink($str, $catid);
		}
		function yearlink($str, $y) {
			return $this->original->yearlink($str, $y);
		}
		function monthlink($str, $y, $m) {
			return $this->original->monthlink($str, $y, $m);
		}
		function daylink($str, $y, $m, $d) {
			return $this->original->daylink($str, $y, $m, $d);
		}
		function nextprevlink($nextprev, $v) {
			if(!empty($fp_params['myparam'])) {
				## My code here
			} else
				return $this->original->nextprevlink($nextprev, $v);
		}
	}
}

Si fa il backup di $plugin_prettyurls, quindi si dà a $plugin_prettyurls questa classe: … [Leggi il resto]

Flatpress: far vedere post non (apparentemente) collegati

Italiano

Scrivendo un plugin per i tag mi sono chiesto: “Come si potrebbe far vedere tutti i post con uno stesso tag?”

Andando avanti a pensare mi sono detto: “una specie di categoria”: ed ecco qui la risposta: quando ce n’è il bisogno, si fa creare una falsa categoria durante il filtro init.

Le categorie sono gestite dalla classe FPDB che le carica solo una volta e flatpress ne crea solo un’istanza.

Ecco il codice di base:

class plugin_tag_walker {
	var $valid=true;
	function current_key() {
		return current($this->array);
	}
	function next() {
		$n=next($this->array);
		if($n==false)
			$this->valid=false;
		return $n;
	}
}

class plugin_tag_fpdb {
	function length() {
		return $this->len;
	}
	function walker($p1=null) {
		$a=new plugin_tag_walker();
		$a->array=$this->array;
		return $a;
	}
}

function prova_cat() {
	global $fpdb, $fp_params;
	if(isset($_GET['tag'])) {       ### Solo se c'è il parametro GET tag
		$fp_params['cat']=-50;  ### L'id della categoria
		$p=new plugin_tag_fpdb();
		$p->array=array(
			'100715151839', ### Quali sono i post
			'100715163207',
			'100808220001'
		);
		$p->len=count($p->array);
		if($fp_params['count']>$p->len)
			$fp_params['count']=$p->len;
		$fpdb->_indexer[$fp_params['cat']]=&amp;$p;
	}
	return true;
}

add_filter('init', 'prova_cat');

Praticamente la funzione prova_cat assegna alla categoria -50 un oggetto che ne restituisce un altro che una volta chiamato dal codice di flatpress restituisce i post. … [Leggi il resto]

Plugin Redirect (v1.0) [Flatpress]

Italiano

Ho scritto questo plugin che serve per effettuare dei redirect di un indirizzo ad un post qualsiasi.

I redirect vanno modificati nel pannello di amministrazione apposito (Plugins -> Redirect) e poi sono subito attivi.

Se usate prettyURLs sarà possibile raggiungerli con fp-url/redirect/my_redirect altrimenti dovete passare via GET o POST il parametro redirect.

Come nome del redirect sono accettati i caratteri alfanumerici più i simboli . @ - _.

Licenza: GNU GPL v2.0

Download: redirect_v1.0.tar.gz.

Esempio: Plugin Redirect

English

I’m sorry for my macheronic Englsh.

I’ve written a plugin that allows to make redirects from an address to an entry.

To activate a redirect you have to go in the Plugin section of Administration Panel then go to Redirect.

If you have activated PrettyURLs Plugin (from NoWhereMan, bundled with flatpress) fp-url/redirect/my_redirect otherwise you have to pass redirect parameter with GET or POST method (es index.php?redirect=my_redirect).

Name of redirect can contain alphanumeric characters and these symbols: . @ - _.

Licence: GNU GPL v2.0

Download: redirect_v1.0.tar.gz.

Example: Redirect Plugin