Ako na vlastné hooky
Celý koncept Drupalu je postavený na hookoch, čo sú vlastne predom definované funkcie, ktoré majú tú vlastnosť, že umožňujú iným funkciám meniť ich návratovú hodnotu. Hook funkcia je funkcia zapisovaná v tvare hook_hook(), respektíve nazovmodulu_nazovhooku($argumenty) . Každý takýto hook definuje samotný Drupal. Pri volaní tejto hlavnej funkcie si táto sama zistí, či ju "nehookuje" niektorý z modulov. Tie to robia tak, že obsahujú funkciu so špecifickým názvom. Čiže napríklad hook funkcia hook_form_alter by bola pre modul test v takomto tvare test_form_alter().
Vždy keď sa udeje nejaká akcia a súčasťou tej akcie je niektorý hook, ten načíta logiku zo všetkých modulov implementujúcich tento hook a na základe postupného spracovania dát týmito hookmi vráti výsledný kód, s ktorým už systém ďalej pracuje. Hookov je veľa a pokrývajú prakticky každú akciu, ktorá v Drupale môže nastať. Napríklad sú hooky umožňujúce vykonať kód pred načítaním stránky, upravovať formy pred vygenerovaním, meniť štruktúru stránky a podobne.
Každý Drupalsita vie čo hooky sú, takže ich nebudem ďalej rozpisovať. Navyše mám pocit, že nezasvätený aj tak z uvedeného nepochopil, čo hooky sú 
Anyway, v tomto blogu chcem uviesť, ako si definovať vlastné hooky. Niekedy sa totiž stane, že máte niekoľko vlastných modulov a potrebujete aby medzi sebou navzájom interagovali.
Dajme tomu, že chcem vypísať tabuľku s platebnými metódami. Hlavný modul nazvime napríklad payment. Ten bude obsahovať hlavnú logiku pre manipuláciu s týmito metódami a dve základné metódy dobierka a bankový prevod. Iný modul, nazvime ho paypal bude implementovať platebnú metódu PayPal.
Aby som túto novú metódu PayPal dostal do zoznamu platebných metód v module payment, potrebujem paymentu povedať, že nejaký modul definuje ďalšie spôsoby platby. A to spravím práve prostredníctvom vlastného hooku.
Najprv si vytvorím stránku s výpisom platebných metód. Zo začiatku bude obsahovať len spomínané metódy dobierka a bankový prevod. Tie sú definované vo funkcii payment_payment(). Payment je v tomto prípade názov hooku, ktorý som si preň zvolil. Môže to byť ľubovolný názov, napríklad hook_list_of_payments, hook_payment_methods a podobne. Taktiež si môžem definovať ľubovolné argumenty, v tomto prípade ale žiadne nepoužijem.
Takže "hlavný" hook bude vyzerať takto:
function payment_payment() { $out[] = array('name' => t('Cash on Delivery'), 'settings' => 'settings/payment/cod', 'pid' => 'cod'); $out[] = array('name' => t('Bank Transfer'), 'settings' => 'settings/payment/bt', 'pid' => 'bt'); return $out; }
Funkcia hook_payment pre PayPal bude vyzerať takto:
function paypal_payment() { return array('name' => t('PayPal'), 'settings' => 'payment/paypal', 'pid' => 'paypal'); }
Stránka s výpisom metód bude vyzerať takto:
function payment_admin_page() { $return = array(); foreach (module_implements('payment') as $module) { $function = $module .'_payment'; $result = $function(); foreach ($result AS $method) { $settings = l('<img src="/'. drupal_get_path('module', 'payment') .'/settings.png" width="16" height="16" />', $method['settings'], array('html' => TRUE)); $image = $GLOBALS['conf']['payment_'. $method['pid']]['filepath'] ? l(theme('imagecache', 'payment', $GLOBALS['conf']['payment_'. $method['pid']]['filepath']), $method['settings'], array('html' => TRUE)) : t('No image'); $rows[]['data'] = array($method['name'], $settings, $image); } } $header = array(t('Method'), t('Settings'), t('Image')); $table = theme('table', $header, $rows, array('id' => 'payment-list')); return $table; }
Všimnite si funkciu module_implements(). To je funkcia, ktorá prebehne všetky inštalované moduly a zistí, čí neimplementujú daný hook. Jej návratová hodnota je pole s názvami modulov, ktoré tento hook implementujú. Čiže na zistenie, či nejaký modul implementuje môj hook_payment použijem module_implements('payment'). Cez foreach si prebehnem všetky hooky a ich návratové hodnoty si uložím do riadku tabuľky zoznamu platebných metód.
A to je všetko. Veľmi jednoduché. Samozrejme sa môžete pohrať s argumentmi, respektíve namiesto výpisu návratových hodnôt môžete ľubovolne manipulovať s dátami, skrátka sa môžete do sýtosti vyhrať s aplikačnou logikou.
- prečítané 284x
- Verzia pre tlač
- PDF verzia









Poslať nový komentár