Přeskočit přímo na text


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ář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • You can use Texy! to format and alter entered content.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <p> <br> <b> <i> <h2> <img> <pre> <sup> <sub> <pre class="php"> <span class="php-keyword1"> <span class="php-var"> <span class="php-num"> <img class="screenshot"> <p class="beginner"> <a class="greybox"> <h3> <h4>

Více informací o možnostech formátování

Type the characters you see in this picture. (verify using audio)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated. Not case sensitive.

Hledat

Přihlášení

Bezpečnost Drupalu

Z hlediska bezpečnosti je Drupal na velmi vysoké úrovni, díky propracovanému systému hlášení, prověřování a řešení možných problémů.

Čtěte více a odebírejte bezpečnostní aktuality

Poslední komentáře

Kdo je online

Momentálně je online 0 uživatelů a 0 hostů.