Gestire gruppi e categorie di link con PHP

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
63
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.
 
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!
 

Discussioni simili