Tak vy potřebujete rozběhnout nový web?

Velmi rád vám pomůžu.

Rozšíření redakčního systému

Možností, jak redakční systém RS2 rozšířit a dodat mu funkčnost, kterou v základu nemá, je povícero. Nejsou to ovšem možnosti tak komplexní modularity, jakou nabízejí ostatní pokročilé redakční systémy – to nebylo mým cílem. Také jsem nechtěl, aby bylo možné s pomocí modulů naprosto změnit výchozí funkčnost systému. Zjednodušeně řečeno – moduly a jiná rozšíření systému snadno doplní další funkčnost, ale prakticky s nimi nelze ovlivnit stávající funkčnost.

Základní princip

Základní princip rozšiřovatelnosti je ten, že autor vloží do HTML šablony (nebo Stránky, Textu,…) speciální zástupnou značku a když na ni redakční systém při generování stránky narazí, vykoná PHP funkci s ní spojenou a výsledek této operace vloží do kódu místo původní značky. Jednoduché.

A nyní trochu složitější vysvětlení, ale naprosto zásadní pro pochopení, jak moduly v redakčním systému fungují. Proces popsaný v předchozím odstavci je popravdě opačný. Posloupnost kroků je následující:

  1. Autor v adminu aktivuje hypotetický modul Datum, jehož jediná funkčnost je to, že v kódu stránky nahradí značku <%Datum%> aktuálním datem.
  2. Autor založí Stránku s název „Dnešní datum“ a do jejího textu vloží onu značku. Po uložení stránky se na ni jde podívat, jak vypadá výsledek.
  3. A nyní pohled na práci redakčního systému – bylo požádáno o zobrazení adresy web.cz/dnesni-datum/.
  4. Systém načte HTML šablonu, vygeneruje HTML polotovar stránky Dnešní datum, a výsledný HTML kód předá dále v proměnné $sablona.
  5. Nyní, před odesláním HTML kódu do prohlížeče, si systém načte všechny aktivní moduly, aby zjistil, zda některý z nich nemá být spuštěn. Pozor! Systém nehledá zástupné značky modulů v kódu! Naopak vždy každému aktivnímu modulu předá doposud vygenerovaný kód a nechá na něm, co s ním bude dělat. Názorný příklad pro modul Datum:
    1. Systém ze svého nastavení ví, že je aktivní modul Datum (s interním názvem „datum“).
    2. Ověří tedy existenci PHP souboru na adrese moduly/datum.php.
    3. Existuje-li tento PHP soubor, načte jej pomocí require_once() funkce.
    4. V tomto souboru očekává uživatelskou PHP funkci getDatum(), takže si ověří, jestli je „volatelná“ (is_calable(‚getDatum‘)).
    5. Systém naznal, že je modul v pořádku, a tak zavolá jeho funkci getDatum($sablona) a jak je z kódu patrné, předá mu doposud vygenerovaný HTML kód (v parametru).
    6. Nyní je na funkci getDatum(), aby rozhodla, jestli nadešel její čas, nebo ne. A její čas by nadešel pouze v případě, že v kódu nalezne svoji značku <%Datum%>.
    7. V našem hypotetickém případě značka <%Datum%> v kódu je, funkce getDatum tedy proběhne, značku <%Datum%> nahradí aktuálním datem a vrátí pozměněný HTML kód zpátky systému! To je kritická podmínka, protože systém předpokládá, že mu každá volaná funkce vrátí HTML kód zpět, ať už pozměněný (byla v něm nějaká značka) nebo beze změny. Pokud by byl modul napsán špatně a jeho funkce by v nějaké situaci HTML kód zpět nevrátila, tak je systém doslova nahraný, protože náhle – uprostřed generování stránky – zůstane stát doslova s prázdnýma rukama. V proměnné $sablona, v níž si doposud hýčkal vygenerovaný HTML kód, nic není. A toto nic pak odešle do prohlížeče.
      Toto chování pravděpodobně upravím – vrátí-li funkce FALSE nebo prázdný řetězec, tak si uchovám původní HTML kód.
    8. Pokud by značka v kódu nebyla (což si modul musí hlídat, aby nespouštěl své operace, aniž by měl v kódu zástupnou značku), musí funkce ukončit svoji činnost a vrátit (return) předaný HTML kód zpátky systému.
    9. Abych zpřesnil předchozí bod – značka modulu v kódu nakonec vůbec nemusí být. Může jít o modul, který nemá nic vypisovat do šablony, ale potichu provádí nějakou operaci (třeba sleduje návštěvnost webu a zapisuje informace do databáze). Jak bylo napsáno výše – systém volá funkci modulu a jediné, co po ní chce je, aby mu na konci zase vrátila vygenerovaný HTML kód. Pokud toto funkce splní, tak si může dělat co chce.
  6. A tento cyklus se opakuje pro každý aktivní modul. Systém mu předá HTML kód, a modul jej buď vrátí netknutý, pokud nenastaly podmínky pro jeho spuštění, nebo jej vrátí pozměněný tak, jak jeho tvůrce zamýšlel.
  7. Dojdou-li aktivní moduly, zpracuje systém své interní značky (poslední komentáře, atd.) a promítne je do HTML šablony.
  8. A vše vesele předá prohlížeči. Zpracování stránky web.cz/dnesni-datum/ je ukončeno.

Na co je tedy třeba dát pozor?

Nejdůležitější, na co je třeba při tvorbě nového modulu myslet, je skutečnost, že je-li modul aktivní, je jeho hlavní funkce volána při každém generování stránky, ať jde o volání úvodní stránky nebo stránky nějaké fotografie ve fotogalerii. Modul si musí sám hlídat, jestli může spustit své operace, protože systém vůbec neřeší, má-li modul v právě zpracovávaném kódu nějakou značku nebo ne. To už si musí ohlídat on. A to je také hlavní nárok kladený na tvůrce modulu.

A další, doposud nezmíněná a veledůležitá věc – je nutné dávat pozor, aby názvy funkcí nekolidovaly s interními PHP funkcemi. Redakční systém je nebude moci načíst, protože funkce stejného jména již existuje. Například založíte-li modul Text s interním kódem „text“, pak systém bude očekávat, že má volat funkci getText(). A to, jak programátoři ví, je již jiná PHP funkce, takže volání tohoto modulu skončí chybou.

Instantní moduly

Samostatnou kapitolou rozšíření systému jsou tzv. „instantní moduly“, jak jim já říkám. Instantní ve smyslu „rychlé“. Například vhodným adeptem na instatní modul je onen ukázkový modul Datum. Kvůli tomu, aby se někde do značky vypsalo jen datum, přece nebudu zakládat regulérní modul s vlastní správou v adminu. To je zbytečné.

Tedy místo toho, abych tedy modul Datum v adminu nějak aktivoval, jen vložím na patřičné místo šablony značku <%(datum.php)%>. Taková značka je pro redakční systém pokyn, aby vyhledal soubor moduly/datum.php, načetl jej a zavolal funkci getDatum($sablona), opět s HTML kódem v parametru. Zpracování i omezení jsou stejné jako u výše popsaných modulů, liší se jen způsob spuštění tohoto instantního modulu. Zatímco při generování stránky se spouští všechny regulérní moduly, tento „modul“ bude spuštěn pouze v okamžiku, bude-li v šabloně nalezena zástupná značka v daném tvaru.