Drupal development: Vlastní tokeny

Vydáno:

Jiří Kupka

Ř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.