Vydáno:
Řekněme, že máme nějaký katalog zboží. Každé zboží má svůj obrázek, popisek, identifikační číslo a cenu. Správce webu bude cenu zadávat bez DPH, ale my budeme chtít, aby se v meta description objevila cena s DPH. Pravděpodobně nejjednodušší řešení je si ji vypočíst a vložit do description pomocí tokenu. Takový token je bezva věc, jedná se vlastně o nahrazovací řetězec, který svou výslednou podobu dostane až při vypsání na základě kontextu. Např. token [node:title]
nám při vytisknutí vloží název nodu apod.
Vytvoříme si jednoduchý modul, který nazveme price_vat
/** * Implements hook_token_info(). */ function price_vat_token_info() { return array( 'tokens' => array( 'node' => array( 'vat-price' => array( 'name' => t('Price including VAT'), 'description' => t('Price including current VAT'), ), ), ), ); }
Vracíme asociativní pole tokenů pro node
. Naprosto stejným způsobem bychom mohli vytvořit token pro uživatele (user
) apod. Kdybychom vytvořili token, který by vracel uživatele, hodil by se nám ještě klíč type
. Ten by nám zaručil, že by se tokeny na sebe mohly krásně vázat - např. bychom vytvořili token muj-uzivatel
typu user
. Potom bychom mohli přistoupit k e-mailu tohoto uživatele pomocí [node:muj-uzivatel:mail]
/** * Implements hook_tokens(). */ function price_vat_tokens($type, $tokens, $data = array(), $options = array()) { $replacements = array(); if($type=='node'&&!empty($data['node'])) { $node = $data['node']; foreach($tokens as $name => $original) { if($name=='vat-price') { $price = $node->field_product_price['und'][0]['value']; $replacements[$original] = $price*variable_get('vat_rate',1); } } } return $replacements; }
Ve funkci hook_tokens()
už provádíme samotné nahrazení řetězce [vat-price]
za reálnou hodnotu. Co se argumentů funkce týče, budou nás zajímat první tři. $type
nese informaci o tom, která skupina tokenů se spracovává - node, user atd. Proměnná $tokens
obsahuje asociativní pole, kde klíčem je samotný název tokenu a hodnota jeho zápis. Třetím argumentem je proměnná $data
, obsahující pole objektů z kontextu. Např. v $data['node']
v tomto případě nalezneme celý objekt node, pro který se bude provádět překlad.
Uvnitř hooku si projdeme všechny položky proměnné $tokens
a podle jména zjistíme, jestli ji obsluhujeme my, nebo ne. Pokud ano, přidáme si do vytvořeného pole $replacements
tuto položku již s přeloženým řetězcem. $replacements
je opět asociativní pole, které tentokrát jako klíč obsahuje celý zápis tokenu (proměnná $original
) a hodnota je přeložený řetězec. Z hooku vrátíme pole přeložených řetězců a máme vystaráno.
Tokeny jsou jednoduchý a elegantní způsob, jak vytvořit nahrazovací vzorky a ušetřit si námahu tam, kde bychom jinak pro úpravu meta content museli vymýšlet různé krkolomné cesty - třeba zpracovávat hook_before_render()
apod.