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
Hooky? slyším poprvé.

Drupal hojně používá abstrakci. Nemyslíš náhoudou toto?
Alphard
Profil
[#2] Myslím, že ne, ptá se správně. Viz Jak udělat plugin.
Dante85
Profil *
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
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 *
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é.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: