Blok uvnitr bloku

Zdravim, mam takovy problemek. Mam klasicke tema vzhledu s regiony left sidebar, content, right sidebar a pod. No a do Content se standardne vypisuje blok Obsah hlavni stranky. A jelikoz je timto obsahem pouze jedna staticka stranka (Node) tak bych potreboval aby se k tomu vypisoval jeste blok s jednim View (kalendar). To jde udelat standardne, ale tak se vypisou oba bloky "pod sebe" a ja bych potreboval aby ten kalendar byl uvnitr toho bloku obsah (tedy blok uvnitr bloku). A to vse jen pro titulni stranku.

 

A tady uz tapu zda zkust nejake upravy templates nebo snad nejakou preprocess funkci????

 

Diky

 

TC

Profile picture for user Jan Polzer

Dobrý den, v tomto případě bych o řešil tak, že výpis bloku s Views bych dal do nového regionu, který budu volat v šabloně node.tpl.php.

Vypsání bloků v konkrétním regionu (použitelné kdekoli):

print render(block_get_blocks_by_region('strojovy_nazev_regionu'));

Případně v kombinaci template.php a node.tpl.php:

Do template.php dáte/upravíte:

function nazev_tematu_vzhledu_preprocess_node(&$variables) {
if ($blocks = block_get_blocks_by_region(
'strojovy_nazev_regionu')) {
$variables['muj_region'] = $blocks;
}
}

a do node.tpl.php toto:

<?php print render($muj_region); ?>

návštěvník

Dekuji, je to naprosto srozumitelne - tez me to dle teoretickych znalosti z knizky napadlo, ale nebyl jsem si jisty praktickoy realizaci ;-) Navic jsem me dojem ze by mela byt nejaka funkce primo na vypis bloku aniz bych musel pridavat region.

 

TC

návštěvník

Tedy - jak se tak na to jeste divam tak uz mi to vsude jasne neprijde - co vlastne delat ten IF v preprocess funkci pro node? Ja tomu rozumim tak ze otestuje zda ten muj novy region obsahuje nejake bloky (bude vzdy splneno - to je to co udelam) a potom si tyto bloky (v mem pripade jeden) ulozi do promene, kterou pote v node.tpl.php zobrazi.

Ale v cem je to jine nez kdybych jak je napsano na zacatku v node.tpl.php rovnou dal print render(block_get_blocks_by_region('strojovy_nazev_regionu'));  ??

Dale predpokladam ze bude nutne si v node.tpl.php osetrit vypis toho regionu pouze na titulni strance (pocitam pres test promenne $is_front).

Diky

TC

Profile picture for user Jan Polzer

Šetří to paměť, jestli to chápu správně. Pokud nejsou k vypsání žádné bloky, pak se nebude předávat nic do node.tpl.php.

Když si nastavíte, že blok má v daném regionu být jen na titulce, tak jinde se vám i po výpisu regionu nezobrazí. Respektive nejde k vypsání toho regionu na vnitřních stranách.

Jinak, vypsat jde i přímo blok, nejenom regiony, a to takto:

$block = module_invoke('block','block_view','delta');
$block_display = render($block['content']);

Za delta si dejte příslušný identifikátor bloku. Spoustu dalších příkladů a jiných volání najdete na drupal.org/node/1034524.

návštěvník

Zkousel jsem vsechny mozne varianty z uvedeneho odkazu a vzdy to konci s 2x opakovanou hlaskou:

Notice: Trying to get property of non-object ve funkci block_block_view() (řádek: 245 v souboru /users/zalohovane/zusorchidea.com/test/modules/block/block.module).

Na to sem nasel jediny odkaz na jakousi upravu v block.module ale ta zpusobila jen ze hlaska zmizela ale block se porad nezobrazuje :(

TC

 

návštěvník

Tak nakonec zafungovalo vicero variant:

1) Pouziti zmineneho zpusobu pridani bloku do noveho regionu a vypsani pres <em>print render(block_get_blocks_by_region('nazev_regionu'));</em>

2) Pouziti varianty

<code>

<?php
          $block = module_invoke('views', 'block_view', 'nazev_bloku');
          print render($block);
?>

</code>

Tady ovsem byly vypsany jednotlive objekty ktere prosly filtrem daneho view, ale bez napr. nazvu toho view nebo obalujicich znacek a class - coz neni problem doresit rucne.

3) Pripadne jeste zafungovalo

<code>

<?php
$block = block_load('views', '
nazev_bloku');
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
?>

</code>

Coz vypsalo i titulek view, ale moc jasne mi ty funkce neprijdou.

 

Nakonec zustavam u varianty 1) coz me prijde jako nejcistsi reseni.

 

TC

návštěvník

A tohle mi taky nejde :( Normalne jsem do .info souboru pridal novy rade:

regions[calendar]       = Calendar

V administraci bloku se objevil normalne dostupnu, takze jsem do nej presunul ten blok s kalendarem (nastaveni zobrazit vsude)

A v node.tpl.php jsem pridal:

// Puvodni

print render($content);

// Pridano

print "DEBUG:";
print render(block_get_blocks_by_region('calendar'));

 

 

 

návštěvník

dodat ze pak u kazdeho Node se zobrazuje jen DEBUG: a nic vic.

návštěvník

Mam zatim neustale zapnutou volbu: Rebuild theme registry on every page.

Takze tady by problem byt nemel.

Odpovědět

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru