Pokročilejší přetěžování funkcí vzhledu
Každý vývojář Drupalu jistě ví, jak přetížit všechny theme funkce v tématu vzhledu. Tento postup je ve valné většině případů dostačující. Já jsem se však setkal se situací, kdy tento postup nestačí.
Mám totiž více vlastních modulů, ve kterých potřebuji přetěžovat některé konkrétní theme funkce. Bohužel Drupal neumožňuje přetěžování pomocí názvu vlastního modulu, ale pouze názvu tématu či šablonovacího systému. A je jasné, že definovat stejnou funkci prostě není možné.
Nejprve jsem si myslel, že to prostě jinak nepůjde, ale nakonec jsem nalezl jeden postup, který využívá hook hook_theme_registry_alter, díky kterému je to možné. Nicméně přetížení tímto způsobem není zcela stoprocentní z toho důvodu, že takto přetíženou theme funkce již nelze dále přetěžovat klasickým způsobem. To z toho důvodu, že je tento hook volán až po provedení všech přetížení – obsahuje vlastně všechna data o všech zaregistrovaných theme funkcích. Jeho volání však není náročné, protože je vyvolán je po vymazání cache.
Já jsem si tento postup ještě vylepšil o možnost dalšího klasického přetěžování. Dosáhl jsem toho zcela jednoduše definováním nových theme funkcí a použíti mezikroku. Celé to bude jistě patrnější z příkladu.
Příklad (registrace a definice theme funkcí nejsou zahrnuty):
<?php
function uc_dph_theme_registry_alter(&$theme_registry) {
$theme_registry['uc_catalog_product_grid']['function'] = 'uc_dph_catalog_product_grid';
$theme_registry['uc_cart_block_items']['function'] = 'uc_dph_cart_block_items';
$theme_registry['uc_cart_block_summary']['function'] = 'uc_dph_cart_block_summary';
}
function uc_dph_catalog_product_grid($products) {
return theme('uc_dph_catalog_product_grid', $products);
}
function uc_dph_cart_block_items($items) {
return theme('uc_dph_cart_block_items', $items);
}
function uc_dph_cart_block_summary($item_count, $item_text, $total, $summary_links) {
return theme('uc_dph_cart_block_summary', $item_count, $item_text, $total, $summary_links);
}
?>
Netuším, jestli je tento postup doporučený, či nezpůsobuje nějaké problémy, každopádně funguje velice dobře a nenutí pak uživatele modulu dokopírovávat nějaké template soubory pro správnou funkčnost (tímto způsobem lze samozřejmě přetížit i funkce, které volají soubory a preprocess funkci), či dopisovat nějaké funkce do template.php souboru (např. advanced_catalog).
Poslat nový komentář