Mindenek előtt szeretném pontosítani a félreértések elkerülése végett, hogy elérési út alatt a path-t – vagyis az url-ben a host neve után megadott útvonalat – értem (Clean URL használata mellett). Készítek egy Dupal motorral hajtott honlapot. A template a tartalomnak megfelelő módon változik, vagyis a site egyes aloldalai és a főoldal eltérő layouttal rendelkezik a standard oldalakhoz képest. Az eltérő oldalakon belül azonban vannak azonosak, tehát egyes oldalak A típusú (standard) layoutot használnak, míg más oldalak B típusút. A főoldal pedig egy C típusú. A Drupal lehetőséget biztosít a megfelelő névkonvenciók alkalmazásával, hogy az egyes oldalak más template-et használjanak. Például a page-front.tpl.php a főoldalhoz, a page-node-sorszam.tpl.php pedig a sorszám számú node-hoz biztosítja a megfelelő sablont. (Persze csak ha léteznek ezek az állományok).
Mivel a 4-es és 8-as node-jaim ugyanabból a B típusú oldalsablonból építkeznek ezért nem szerettem volna ismételni a page-node-8.tpl.php állományban lévő sablont a page-node-4.tpl.php-ban is. A legkézenfekvőbb megoldásnak tűnt, hogy készítek egy a-template.tpl.php és egy b-template.tpl.php nevű sablont, majd a megfelelő page-node template-ben egy include() segítségével hivatkozom be a megfelelő állományt. A fentiekre visszautalva a page-node sablonokba a következő tartalom kerülhetett volna:
include('b-template.tpl.php');
Csavartam azonban egyet a dolgon (többnyelvű site-ról lévén szó nem akartam elveszni a node azonosítók rengetegében), és a következő koncepció szerint építettem fel az oldalsablonokat. Van egy page-node.tpl.php controllerem ami ugye minden egyes node típusú tartalom esetén betöltődik. Szándékosan nem sablont írtam, mert ebben az esetben ez az állomány nem sablonként, hanem vezérlőként fog funkcionálni, mégpedig oly módon, hogy az oldal elérési útjának megfelelő sablont tölti be. Tehát a www.example.com/sample1 esetén az A, míg a www.example.com/sample2 és www.example.com/sample3 esetén a B sablonokkal jeleníti meg az oldalt, valahogy így:
<?php switch ($node->path) { case "sample2": case "sample3": include_once('b-template.tpl.php'); break; case "frontpage": include_once('c-template.tpl.php'); break; default: include_once('a-template.tpl.php'); break; } ?>
A dolog szépséghibája, hogy a $node->path csak hitelesített felhasználók esetén ad vissza értéket, anonim látogatók esetén a $node nem is tartalmaz path elemet. Az alábbi trükköt alkalmaztam:
<?php $nid = arg(1); $path = drupal_get_path_alias("node/$nid"); switch ($path) { case "sample2": case "sample3": include_once('b-template.tpl.php'); break; case "frontpage": include_once('c-template.tpl.php'); break; default: include_once('a-template.tpl.php'); break; } ?>
A drupal_get_path_alias() függvény és a node azonosító [arg(1)] segítségével szerencsére kinyerhető az adott oldal elérési útja és a template megfelelően működik. A trükk eredete: Path / Clean URLs not showing up – anonymous users don’t get a path.
One Response to Drupal elérési út
MINDEN VÉLEMÉNY SZÁMÍT! Kilépés a válaszból
Fotók



Hasznos leírás!
Kipróbálom a http://www.matracos.hu oldalon. Ha jobbat találok ki akkor beírom ide:))