2012/09/13

Block beágyazása - de elegánsan ám!

Amikor blockot kell kódból beágyazni, nem is lehet elegánsabb a sminkfüggvényen kívül előállítani a block html kódját. Íme egy saját "hook_". :)

function hook_rendered_block($modul, $block_id) {
  $block = block_load($modul, $block_id);
  $block_rendered = 
_block_get_renderable_array(_block_render_blocks(array($block)));
  $html_block = drupal_render($block_rendered);
  return $html_block;
}


Ezután a smink függvényben, tpl-ben, akárhol, csak meg kell hívni és visszaadja ami a megjelenítésbe kell. A block_load függvény rafinált, mert $bid-t vár, de sokszor nem egyértelmű, hogy mi a 'bid' értéke. Ha a block szerkesztés oldalon megnézed a block url-t, akkor megtalálsz benne mindent, amire szükséged lehet.

admin/structure/block/manage/$module/$block_id/configure

Persze a block objektumból ki is tudod puskázni, hogy pontosan mi a 'bid' értéke, és akkor azt is megadhatod. A félreértések elkerülése végett a $bid az eredeti paraméter neve a block_load függvénynek. Én azért hívom $blokk_id -nek, mert a tid, nid, bid -ről nekem mindig szám jut eszembe, ami itt elég pontatlan lenne.

Közben CsG kollégámtól jött egy újabb ötlet, az elegancia fokozására...

Mivel a .tpl fájlokban nem illik függvényeket hívogatni, D8-ban - ha minden igaz - a valóságban is így lesz (a mostani render() állapothoz képest), így a fenti függvény hívását áttettük a template.php-be, az adott preprocess függvénybe. Mivel a $variables értékén nem csak változtatni tudunk, de hozzáadni is, így ez már gyerekjáték...

 $variables['blokk_neve'] = hook_rendered_block($modul, $block_id);

Ezután nincs más dolgunk mint a .tpl fájlban kiprintelni a tartalmat. A .tpl fájlhoz a $variables indexei kerülnek át egyszerűen meghívható változóként. Tehát a kiíratás a következőképpen fog történni...

print $blokk_neve;

Köszönet a segítségért!