Gestire gruppi e categorie di link con PHP

MarcoGrazia

Utente Attivo
15 Dic 2009
788
16
18
59
Udine
www.stilisticamente.com
Ciao.
Ho un problema forum :)
Ecco, sto costruendo un sistema di link (una sitografia a fine del sito); questi vengono memorizzati in un database e poi da questo presi da una pagina per mostrarli a chi guarda.
I link in questione sino categorizzati, ovvero esistono link che riguardano il PHP, altri per il MySQL, e altri ancora CSS... eccetera. Quest categorie potete vederle come dei tag.
La questione però è questa, nel mostrarli e quindi per raggrupparli ho usato liste di definizione (DL) in modo da poter raggruppare i link in questo modo:
HTML:
<dl>
  <dt>CSS</dt>
  <dd>...link...</dd>
  <dd>... link ....</dd>
  <dt>Javascript</dt>
  <dd>...link...</dd>
</dl>
Ora detto così sembra semplice e intuitivo, il problema è che non riesco a trovare un metodo semplice in PHP che funzioni, in pratica una volta tirati fuori i record dal database li processo così:
PHP:
        function data($data) {
		$mesi = array('', 'January','February','March','April','May','June','July','August','September','October','November','December');
		$giorno = substr($data, -2);
		$mese = substr($data, 5, 2);
		$anno = substr($data, 0, 4);
	return "{$mesi[$mese]} $giorno, $anno";
	}	//	data()
	
	if ($res) {	//	Esiste una bibliografia
		echo "\n\t\t\t\t<dl>\n";
		$definitionList = '';
		for ($i=0;$i < $len;$i++) {
			$flag[$res[$i]['gruppo']] = false;
		}
		
		for ($i=0;$i < $len;$i++) {
			if (!$flag[$res[$i]['gruppo']]) {
				$definitionList .= "\t<dt itemprop=\"articleSection\"><strong>{$res[$i]['gruppo']}</strong><dt>\n";
				$flag[$res[$i]['gruppo']] = true;
			}
			switch($res[$i]['lingua']) {
				case 'en': case 'en-UK': case 'en-US': $title = 'the browser opens another page (english)'; break;
				case 'it': case 'it-IT': case 'it-CH': $title = 'il browser apre un\'altra pagina (italiano)'; break;
				default: $title = 'the browser opens another page (english)'; break;
			}
			try {
				$st = $handle->prepare('SELECT id, nome, cognome, nickname FROM autori WHERE id = :ident');
				$st->bindParam(':ident', $res[$i]['autore_id'], PDO::PARAM_STR);
				$st->execute();
				$a = false; $a = $st->fetch(PDO::FETCH_ASSOC);
				$st->closeCursor();
			}
			catch (PDOException $e) {
				echo 'Connection failed: (lettura autore)' . $e->getMessage();
			}
			catch (Exception $e) {
				echo 'Connection failed: (lettura autore)' . $e->getMessage();
			}
			$autore = ucfirst($a['nome'] . ' ' . $a['cognome']);
			$data = data($res[$i]['data']);
			$definitionList .= "\t\t\t\t\t\t<dd><a target=\"_blank\" href=\"{$res[$i]['url']}\" title=\"$title\" lang=\"{$res[$i]['lingua']}\"><span itemprop=\"name\">{$res[$i]['testo']}</span></a>. posted by <span itemprop=\"author\" itemscope itemtype=\"http://schema.org/Person\"><cite itemprop=\"name\">$autore</cite></span> <time itemprop=\"dateCreated\" datetime=\"{$res[$i]['data']}\">$data</time></dd>\n";
			//	$definitionList .= ' - ' . var_dump($flag);
		}
		echo "\t\t\t\t\t$definitionList\n\t\t\t\t</dl>\n\n";
	}
Il risultato è questo: http://stilisticamente.biz/bibliography.php sembra perfetto ma non è così.
Il sistema mi pare che mette le classificazioni in ordine casuale e basta pocp per accorgesene, infatti prendo a caso il link che parla di rounded corner che però lo dovrei trovare sotto CSS3 mentre si trova sotto DOM. Nel database appartiene al gruppo CSS3 quindi il problema è nel metodo di scrittura del codice.
Io proprio non so cosa inventarmi al momento anche perché non da errori su cui lavorare il bastardo :incazz2:
Sono quasi certo che il problema è nel metodo a flag ma non so come sostituire il metodo.
 

MarcoGrazia

Utente Attivo
15 Dic 2009
788
16
18
59
Udine
www.stilisticamente.com
Risolto cambiando completamente approccio.
chiedo una queri ordinandola per gruppi, quindi creo un ciclo che mette in <dt>il nome del gruppo</dt> e poi va avanti a inserire link; come cambia il nome del gruppo rispetto al precedente, cambia anche il dato in <dt>.
Siccome la query è ordinata per gruppi appunto, non capiterà mai che un gruppo si ripeta dopo e quindi non capiterà mai che un gruppo si ripeta anche nella definition list, ma saranno perfettamente ordinati.
Più facile a guardare il codice che a spiegarlo :D ecco qui.
PHP:
        //	BIBLIOGRAFIA
	try {
		$st = $handle->prepare('SELECT * FROM biblio ORDER BY gruppo ASC');
		$st->execute();
		$res = false;
		$res = $st->fetchAll(PDO::FETCH_ASSOC);
		$len = $st->rowCount();
		$st->closeCursor();
	}
	catch (PDOException $e) {
		echo 'Connection failed: (salvataggio)' . $e->getMessage();
	}
	catch (Exception $e) {
		echo 'Connection failed: (salvataggio)' . $e->getMessage();
	}

        function data($data) {
		$mesi = array('', 'January','February','March','April','May','June','July','August','September','October','November','December');
		$giorno = substr($data, -2);
		$mese = substr($data, 5, 2);
		$anno = substr($data, 0, 4);
	return "{$mesi[$mese]} $giorno, $anno";
	}	//	data()
	
	if ($res) {	//	Esiste una bibliografia
		$definitionList = "\n\t\t\t\t<dl>\n\t\t\t\t\t<dt itemprop=\"articleSection\"><strong>{$res[0]['gruppo']}</strong></dt>\n";
		$gruppo = $res[0]['gruppo'];
		for ($i = 0; $i < $len; $i++) {
			switch($res[$i]['lingua']) {
				case 'en': case 'en-UK': case 'en-US': $title = 'the browser opens another page (english)'; break;
				case 'it': case 'it-IT': case 'it-CH': $title = 'il browser apre un\'altra pagina (italiano)'; break;
				default: $title = 'the browser opens another page (english)'; break;
			}
			try {
				$st = $handle->prepare('SELECT id, nome, cognome, nickname FROM autori WHERE id = :ident');
				$st->bindParam(':ident', $res[$i]['autore_id'], PDO::PARAM_STR);
				$st->execute();
				$a = false; $a = $st->fetch(PDO::FETCH_ASSOC);
				$st->closeCursor();
			}
			catch (PDOException $e) {
				echo 'Connection failed: (salvataggio)' . $e->getMessage();
			}
			catch (Exception $e) {
				echo 'Connection failed: (salvataggio)' . $e->getMessage();
			}
			$autore = ucfirst($a['nome'] . ' ' . $a['cognome']);
			$data = data($res[$i]['data']);
			
			if ($res[$i]['gruppo'] != $gruppo) {
				$definitionList .= "\n\t\t\t\t\t<dt itemprop=\"articleSection\"><strong>{$res[$i]['gruppo']}</strong></dt>\n";
				$gruppo = $res[$i]['gruppo'];
			}
			$definitionList .= "\t\t\t\t\t\t<dd><a target=\"_blank\" href=\"{$res[$i]['url']}\" title=\"$title\" lang=\"{$res[$i]['lingua']}\"><span itemprop=\"name\">{$res[$i]['testo']}</span></a>. posted by <span itemprop=\"author\" itemscope itemtype=\"http://schema.org/Person\"><cite itemprop=\"name\">$autore</cite></span> <time itemprop=\"dateCreated\" datetime=\"{$res[$i]['data']}\">$data</time></dd>\n";
		}
		echo "\t\t\t\t\t$definitionList\n\t\t\t\t</dl>\n\n";
	}
Fatto!