[ GDRCD 5.4 ] Menù in gerarchia automatica: mostrare tutti i risultati
[ GDRCD 5.4 ] Menù in gerarchia automatica: mostrare tutti i risultati postato il 15/03/2018 02:42:50 nel forum programmazione, open source e hosting e modificato da sadly-noob il 15/03/2018 02:44:46
Buonasera a tutti .. Salto la parte triste: ho un magnifico menù (gentilmente fornito da un'affatto nota entità divina) il cui ordinamento gerarchico degli articoli viene automaticamente gestito dal codice, con questa struttura:
CATEGORIA 1 (MACRO GRUPPO)
- Articolo Principale A
-- Sotto-articolo A-I
-- Sotto-articolo A-II
-- Sotto-articolo A-III
CATEGORIA 2 (MACRO GRUPPO)
- Articolo Principale B
-- Sotto-articolo B-I
- Articolo Principale C
-- Sotto-articolo C-I
Etc.
ESEMPIO:
SOCIETA'
- Religioni
-- Culto della Fuffa
-- Fuffanesimo
- Tecnologia
-- Industria
-- Medicina
GEOGRAFIA
- Capitali
- Terre Desolate
-- Confini
-- Pericoli
Qui lascio lo stamp del menù in questione:

(LINK DIRETTO: https://i.stack.imgur.com/IhYjv.png)
Il mio problema è il seguente: quando gli articoli principali non hanno sotto-articoli, i primi non vengono mostrati. Ogni macro-gruppo, se non ha un sotto-articolo (che per forza di cose deve stare sotto un articolo principale) da qualche parte, non viene mostrato.
Insomma, se non c'è il sotto-articolo vengono a mancare gli elementi ad esso superiori.
Qui il codice della paginetta in cui il menù viene generato:
<!-- MENU REGOLAMENTO -->
<div class="container_bg_amb">
<?php
// EFFETTUO LA RICERCA DEGLI ARTICOLI CON ORDINAMENTO GERARCHICO MAGICO
$result = gdrcd_query(
"SELECT t1.menu_id AS section_id,
t1.menu_name AS section_name,
t1.link AS section_link,
t1.ordering AS section_ordering,
t2.menu_id AS category_id,
t2.menu_name AS category_name,
t2.link AS category_link,
t2.ordering AS category_ordering,
t3.menu_id AS child_id,
t3.menu_name AS child_name,
t3.link AS child_link,
t3.ordering AS child_ordering
FROM menu AS t1
INNER JOIN menu AS t2 ON(t2.parent_id = t1.menu_id)
INNER JOIN menu AS t3 ON(t3.parent_id = t2.menu_id)
WHERE t1.parent_id IS NULL
AND t1.status LIKE '1'
AND t2.status LIKE '1'
AND t3.status LIKE '1'
ORDER BY t1.ordering, t1.menu_name, t2.ordering, t2.menu_name, t3.ordering, t3.menu_name",
'result'
);
// COSTRUISCO IL MENU CON ORDINAMENTO GERARCHICO MAGICO & ARRAY
$menu = array();
if (gdrcd_query($result, 'num_rows')) {
while ($record = gdrcd_query($result, 'fetch')) {
if (!isset($menu[$record['section_id']])) {
$menu[$record['section_id']] = array(
'id' => $record['section_id'],
'name' => $record['section_name'],
'link' => $record['section_link'],
'categories' => array()
);
}
if (!isset($menu[$record['section_id']]['categories'][$record['category_id']])) {
$menu[$record['section_id']]['categories'][$record['category_id']] = array(
'id' => $record['category_id'],
'name' => $record['category_name'],
'link' => $record['category_link'],
'childs' => array()
);
}
$menu[$record['section_id']]['categories'][$record['category_id']]['childs'][] = array(
'id' => $record['child_id'],
'name' => $record['child_name'],
'link' => $record['child_link']
);
}
gdrcd_query($result, 'free');
}
?>
<div class="box1">
<?php
// STAMPO IL MENU' GENERATO PRECEDENTEMENTE
if (!empty($menu)) {
foreach ($menu as $section_id => $section_data) { ?>
<div class="titolo_categoria_sinistra">
<?php echo $section_data['name']; ?>
</div>
<div class="container_articoli_s">
<?php foreach ($section_data['categories'] as $category_id => $category_data) {
echo '<div class="menuReg_art"><a class="hvr-underline-reveal" href="'. (!empty($category_data['link'])? $category_data['link'] : 'popup.php?page=regolamentoiframe&menu_id='. $category_id) .'" target="regolamentoiframe">'. $category_data['name'] .'</a></div>';
foreach($category_data['childs'] as $child_data){
echo '<div class="menuReg_subArt">▸ <a class="link_sottoart_menu" href="'. (!empty($child_data['link'])? $child_data['link'] : 'popup.php?page=regolamentoiframe&menu_id=' . $child_data['id']) .'" target="regolamentoiframe">'. $child_data['name'] .'</a></div>';
}
} ?>
</div>
<?php } // foreach
} // if ?>
</div>
<!-- /******************/ frameborder="none" -->
<div class="box3">
<iframe name="regolamentoiframe" src="popup.php?page=regolamentoiframe" style="border:none;" scrolling="yes" height="550" width="570"></iframe>
</div>
</div>
Dal tenore dei commenti potrete probabilmente intuire il mio livello di dimestichezza con questo tipo di struttura. Perdo 5D10 punti sanità mentale ogni volta che provo a metterci le mani e non capisco come modificare per far apparire sia macro-categorie che articoli principali anche in assenza di sotto-articoli.
Ho tentato in primis di sistemare un po' tabella&query di partenza:
- Ho aggiunto una colonna ENUM ('empty_subArt') per identificare 'a manina' le macro-categorie/articoli principali prive di sottoarticoli:

(https://s10.postimg.org/tw2qymint/tabella.png)
- Ho modificato la query con un sacco di fantasia (e scarsissimi risultati) per farmi mostrare almeno le macro-categorie 'vuote':
SELECT
t1.menu_id AS section_id,
t1.menu_name AS section_name,
t1.link AS section_link,
t1.ordering AS section_ordering,
t1.empty_subArt AS section_hasSubArt,
t2.menu_id AS category_id,
t2.menu_name AS category_name,
t2.link AS category_link,
t2.ordering AS category_ordering,
t2.empty_subArt AS category_hasSubArt,
t3.menu_id AS child_id,
t3.menu_name AS child_name,
t3.link AS child_link,
t3.ordering AS child_ordering
FROM menu AS t1
INNER JOIN menu AS t2 ON(t2.parent_id = t1.menu_id) OR (t2.parent_id = t1.menu_id AND t2.empty_subArt = '1')
INNER JOIN menu AS t3 ON(t3.parent_id = t2.menu_id)
WHERE t1.parent_id IS NULL OR t1.empty_subArt = '1'
AND t1.status LIKE '1'
AND t2.status LIKE '1'
AND t3.status LIKE '1'
ORDER BY t1.ordering, t1.menu_name, t2.ordering, t2.menu_name, t3.ordering, t3.menu_name
.. Come dicevo, non ottengo niente di buono.
E questo è solo il recupero dati dal DB - la parte PHP magari la prenderei in considererei in un secondo momento, visto che manco riesco ad imbroccare il primo pezzo.
Grazie in anticipo per qualunque suggerimento/pat-sulla-testa/considerazione e .. Chiedo venia per il titolo un po' criptico - non sono stata in grado di fare di meglio con l'attuale limite dei caratteri.
Continuerò nel frattempo a smaneggiare su questa cosa, sighsob.

Pagine → 1
15/03/2018 08:32:02
INNER JOIN menu AS t2 ON(t2.parent_id = t1.menu_id)
INNER JOIN menu AS t3 ON(t3.parent_id = t2.menu_id)
WHERE t1.parent_id IS NULL
AND t1.status LIKE '1'
AND t2.status LIKE '1'
AND t3.status LIKE '1'
A naso e senza aver ancora preso il caffé credo che i tre AND con lo status possano essere il problema... se il child non c'è, non credo possa avere status LIKE '1'...
15/03/2018 15:34:46 e modificato da sadly-noob il 15/03/2018 15:35:19
seralia ha scritto:
INNER JOIN menu AS t2 ON(t2.parent_id = t1.menu_id)
INNER JOIN menu AS t3 ON(t3.parent_id = t2.menu_id)
WHERE t1.parent_id IS NULL
AND t1.status LIKE '1'
AND t2.status LIKE '1'
AND t3.status LIKE '1'
A naso e senza aver ancora preso il caffé credo che i tre AND con lo status possano essere il problema... se il child non c'è, non credo possa avere status LIKE '1'...
Ha assolutamente senso .. Ma pur tentando di riscriverla aggiungendo un OR con IS NULL e NOT EXISTS (che diventa lunghetta ..) non riesco a tirare fuori tutti i risultati che mi interessano. Non sono cose che uso granché quindi probabilmente è giusto che le scrivo male-male-male.
.. Comunque nel frattempo una mezza soluzione da scappati di casa m'è venuta in mente - visto che non si combina a disfarci completamente di sti' sotto-articoli .. Si può però almeno riuscire a nasconderli dall'interfaccia.
Sfrutto allora la nuova colonnina empty_subArt per identificare solo i sotto-articoli che servono a far visualizzare il resto (quindi vuoti) e faccio una piccola aggiunta alla query di partenza per recuperare questa informazione:
SELECT t1.menu_id AS section_id,
t1.menu_name AS section_name,
t1.link AS section_link,
t1.ordering AS section_ordering,
t2.menu_id AS category_id,
t2.menu_name AS category_name,
t2.link AS category_link,
t2.ordering AS category_ordering,
t3.menu_id AS child_id,
t3.menu_name AS child_name,
t3.link AS child_link,
t3.ordering AS child_ordering,
t3.empty_subArt AS child_visibility
Che va a finire successivamente nella parte PHP che riguarda i sotto-articoli:
$menu[$record['section_id']]['categories'][$record['category_id']]['childs'][] = array(
'id' => $record['child_id'],
'name' => $record['child_name'],
'link' => $record['child_link'],
'hidden' => $record['child_visibility']
);
Quando poi stampo tutto, uso una variabile stupida per cambiare classe al div che contiene il sotto-articolo ed un if per determinare se c'è bisogno di nascondere il sotto-articolo o meno - infine, la stampa del link interessato:
foreach($category_data['childs'] as $child_data) {
// CREO LA CONDIZIONE PER CUI SE IL SOTTO-ARTICOLO SERVE SOLO A FAR APPARIRE GLI ELEMENTI SUPERIORI ASSEGNO ALLO STESSO UNA CLASSE CSS PER NASCONDERLO
if ($child_data['hidden']=='1') {
[b]$hideOrNot = "menuReg_HIDEsubArt";
} else {
$hideOrNot = "menuReg_subArt";
}[/b]
echo '<div class="' . $hideOrNot . '">▸ <a class="link_sottoart_menu" href="'. (!empty($child_data['link'])? $child_data['link'] : 'popup.php?page=regolamentoiframe&menu_id=' . $child_data['id']) .'" target="regolamentoiframe">'. $child_data['name'] .'</a></div>';
}
E la banalissima istruzione CSS:
.menuReg_HIDEsubArt {
display: none;
}
Fa venire i brividi, per il momento però non riesco a cavare niente di meglio.
Non mi sembra proprio il caso di considerare questa un'effettiva soluzione, evito quindi di marcare il thread come effettivamente risolto.
Grazie ancora seralia per il tuo contributo!
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
RAID Shadow Legends ↗
Enlisted ↗
State of Survival ↗