Autor | Zpráva | ||
---|---|---|---|
Dante85 Profil * |
Dobrý den.
Nějakou dobu programuji v PHP, už i brousím hodně do OOP. A rád bych se Vás zeptal nebo spíše poprosil zda-li by někdo nemohl ukázat kódovou ukázku jak vytvořit hooky a jak se na ně chytat. Koukal jsem totiž na Drupal a zde hooky používají ale bohužel jsem nepochopil jak na ně. Děkuji moc. |
||
fuckin Profil |
#2 · Zasláno: 10. 4. 2010, 11:43:33
Hooky? slyším poprvé.
Drupal hojně používá abstrakci. Nemyslíš náhoudou toto? |
||
Alphard Profil |
#3 · Zasláno: 10. 4. 2010, 11:57:57
[#2] Myslím, že ne, ptá se správně. Viz Jak udělat plugin.
|
||
Dante85 Profil * |
#4 · Zasláno: 10. 4. 2010, 13:02:26
Ano jedná se o hooky.
Ráno mě napadlo udělat to tak že by byla tabulka hooks ID hook file ----------------- 1 on-page-render plugins/plug1/hook1.php Následně by si třída vytáhla svoje hooky a includla soubory které jsou k danému hooku přiřazeny. A tím pádem budou tyhle soubory moci upravovat nějaký průběh. Uvažuji správně ? |
||
Alphard Profil |
#5 · Zasláno: 10. 4. 2010, 13:50:30
Dante85:
V podstatě ano, původně jsem vám chtěl odkázat nějaký článek, ale nic hezkého jsem nenašel. Pro představu není špatné PHP5 Plugin System, ale eval() se mi osobně nelíbí a seznam háků a odkazy na soubory bych raději cachoval. Zase na druhou stranu, použítí Singletonu se mi docela líbí. Na jiné stránce ještě navíc jednotlivá rozšíření dědily společného předka (nebo aspoň rozhraní), což by také nemuselo být na škodu class NovyPlugin implements IPlugin Pak u hooku ještě nezapomeňte, že by se někdy mohly hodit parametry, ideálně asi: mixed Plugins::callHook ( string $hook [, array $args] ); V pozadí by pak možná mohlo stát třeba ošetřené PHP: Autoloading Classes - Manual, nebo přímo Nette\Loaders | Nette Framework. Ale berte to jen jako nápad, nikdy jsem s tím moc nepracoval. Pokud jde o tu tabulku hooks, možná bych radši použil serializované pole uložené do souboru, myslím, že by to bylo podstatně rychlejší. Když to bude v tabulce, tak to buď povede na databázový dotaz při každém hooku, nebo načtete všechno při prvním a stejně to bude hledat PHP: |
||
Dante85 Profil * |
#6 · Zasláno: 10. 4. 2010, 14:21:42
Takže moje ucelená představa :
Databáze : ID hook file ----------------- 1 on-page-render a:2:{i:0;s:9:"file1.php";i:1;s:9:"file2.php";} Část třídy Page : <?php (...) public function render() { //do some stuff, parse template, parse module apod. $output = "HTML ......"; $hooks = $this->getHooks('render'); foreach($hooks as $key => $val) { require_once $val; } //output page } file1.php (hook) <?php $output = str_replace('bad_word', '****', $output); ?> Nebo je tedy další možnost načíst celý ten plugin (třídu) a zavolat z něj metodu callHook(). Protože v tu danou chvíli nechci načítat celý plugin/modul, pouze jeho hook. Celý plugin třeba udělá na url web.cz/plugin1/show výpis všech bad word třeba ale jeho hook pro "očištění" výstupu/vstupu může být zavolán třeba při renderu stránky, nebo při přidání komentáře, psaní článku apod. Takhle mi to přijde dobré. |
||
Časová prodleva: 14 let
|
0