Jelenlegi hely

Szintlépés: egy argumentumból többet

CSÉCSY László képe

Adott egy többszintű, egyszeres öröklődésű taxonómia-szótár, például egy szervezet egységei (igazgatótanács, területek, kirendeltségek, üzletek). Adott egy kilistázandó tartalomtípus (emberek), melyhez hozzá van rendelve az előző szótár (igazgatók, területi vezetők, kirendeltségvezetők, beosztottak). Feladat: egy adott egységhez ki kell listázni az összes dolgozót, bármilyen szinten is legyenek. Íme egy egyszerű, bár elsőre nem triviális megoldás.

A trükktarisznya egyTaxonómia: Kifejezés azonosító argumentumért kiált - csakhogy ez alapesetben csak azon tartalmakat fogja listázni, melyekhez közvetlenül van hozzárendelve az azonosítóval megadott kifejezés. Ötlet: használjuk ki a Több kifejezés elfogadása argumentumonként lehetőséget annak bekapcsolásával, így a feladat egyszerűsödik: a kapott argumentumot (kifejezés azonosítót) cseréljük le önmagára és összes leszármazottjára.

Erre a Views 2-ben az argumentum ellenőrzőjét lehet használni. Itt a PHP kód lehetőséget választva megjelenik a PHP ellenőrző kód szövegmező, ahová az alábbi kódot másoljuk be:

$vid = 1;
$term = taxonomy_get_term($argument);
if (!$term || ($term->vid != $vid)) {
  return FALSE;
}
$output = array();
$list = array($term->tid);
while (!empty($list)) {
  $tid = array_shift($list);
  $output[] = $tid;
  $terms = taxonomy_get_children($tid, $vid);
  foreach ($terms as $term) {
    $list[] = $term->tid;
  }
}
$handler->argument = implode('+', $output);
return TRUE;

A legelső sorban a $vid változó a taxonómia-szótár azonosítója, ezt cseréljük le a sajátunkra. Mivel ez a kódrészlet egy ellenőrző, célszerűnek tűnik az ellenőrzést is elvégezni: megpróbáljuk betölteni a kifejezést az argumentumból kapott azonosítója alapján, és ha nem létezik, vagy nem ebbe a szótárba tartozik, az ellenőrzést hibával lezárjuk.

A trükk innentől kezdődik: gyűjtsük össze a kifejezésnek és leszármazottainak azonosítóit a $output tömbben, majd a nézet argumentumát cseréljük le a pluszjelekkel elválasztott kifejezés azonosítók listájára. Ehhez a $list tömböt használjuk segítségül, és a klasszikus szélességi bejárás szerint haladunk.

Ha ez még nem elég magyarázat, a következőként járunk el: betesszük a segédlistába az argumentumként kapott kifejezés azonosítót, majd a következő lépéseket addig ismételjük, míg a segédlista ki nem ürül. Először is vegyünk ki a segédlistából egy kifejezést, ezt csapjuk hozzá az eredménylistához, majd a segédlistához csapjuk hozzá az imént kivett kifejezés közvetlen leszármazottait. Mire a segédlista kiürül, az eredménylistát már csak a megfelelő módon össze kell fűzni ahhoz, hogy a Views a kívánt eredményt szolgáltassa.

Technológia: 

Hozzászólások

Nekem ez a fabejárás tetszik igazán. Nekem ezzel régebben voltak problémáim (rekurzív függvények), szerencsére ez ma már triviális.

Az első 4 sort lehet ám így is, csak hogy tudjuk, hogy létezik ilyen is az apiban:

$node->vid = $argument;
$term = taxonomy_node_get_terms_by_vocabulary($node, '1');