Přeskočit obsah
V
Pro vývojáře
Architektura, konvence, jádro systému a bezpečnost
Moduly / Blog

Blog#

Redakční obsah webu — články, novinky, akce, galerie, karusely, kniha návštěv a kontaktní formulář. Kód: app/UI/Api/Blog/, front app/UI/Front/Blog/.

Blog je zároveň referenční modul systému: byl první zapojený do Elasticsearch a jeho front presenter je vzorem rozkladu do traitů. Kdo hledá, jak se v tomhle CMS něco dělá správně, začíná tady.

Z čeho se modul skládá#

Skupina Entity Poznámka
obsah Article, News, Event, Intro + jejich *Text každý má vlastní kategorii i výpis
média Gallery + GalleryAssetRel, Carousel + CarouselItem
taxonomie Category (strom), Tag (plochý seznam)
interakce Guestbook + GuestbookMessage, ContactMessage, ArticleDiscussionMessage
doplňky FlashMessage, ArticlePollRel, ArticleAdvertRel provázání na ankety a reklamu

Dva vzory, ze kterých se kopíruje#

Vzor Soubor Proč zrovna tenhle
zdroj pro Elasticsearch app/UI/Api/Blog/Models/Search/ArticleDocumentSource.php článek byl první zapojený obsah; dnes jsou zdroje čtyři a všechny z něj vycházejí
rozklad presenteru do traitů app/UI/Front/Blog/Presenters/Traits/Inits/, Lists/, Details/ jeden z mála presenterů, který má rozdělení hotové podle konvence

Podrobně Elasticsearch a Konvence kódu.

Nekopírujte vzory z knihy návštěv

Je to nejstarší část modulu a část jejího kódu je ještě v podobě předchozí generace. Vypadá to jako platný vzor, protože je to týž modul — ale není.

Kategorie a štítky#

Kategorie tvoří strom a promítají se do adres; štítky jsou plochý seznam a jen označují.

Štítek je levnější než kategorie

Kategorie mění strukturu i URL — a s tím i překlady, sitemapy a odkazy zvenčí. Když stačí označit, použijte štítek.

Kategorie blogu mají GLOBÁLNĚ unikátní href

cms_mod_blog_category_texts a cms_mod_blog_article_category_texts mají UNIQUE(href)bez jazyka. Ostatní kategoriové tabulky v systému mají správně UNIQUE(href, language_id). Dvě kategorie v různých jazycích tu proto nemohou mít stejnou adresu, a čeština se slovenštinou sdílí spoustu slov (doprava, zahrada). Projeví se to až při zakládání druhého jazyka jako Duplicate entry 'doprava' for key 'ind_href' — před vložením se proto musí kontrolovat kolize bez filtru na jazyk.

Vícejazyčnost#

Texty jsou v podřízené entitě, jedna na jazyk (ArticleText, NewsText, …).

Prázdný překlad přebije náhradní jazyk

Uložený prázdný řetězec je platná hodnota, takže vyhraje nad fallbackem a prvek vyjde bez názvu. Buď přeložit, nebo řádek vůbec nezakládat — podrobně Překlady.

Textová entita má odvozenou identitu

Nemá vlastní klíč — je složený z rodiče a jazyka. Chybějící use ORM v takové entitě se přitom projeví tiše: mapování se nenačte a entita se chová, jako by sloupce neměla.

Komentáře, hodnocení a ankety#

Neřeší je blog sám — jsou to sdílené komponenty z modulu Base (Comment, CommentThread, Rating, RatingThread, Poll).

Změna sdílené komponenty zasáhne tři další moduly

Komentáře i hodnocení používá vedle blogu i e-shop (produkty), inzerce a katalog firem. Oprava „jen pro článek“ se projeví všude — a otestuje ji jen ten, kdo si na to vzpomene.

Uživatelský text je XSS past

addSimpleEditor() sám nic nesanitizuje. Rich text se musí purifikovat v Api beforeSave, prostý text se vypisuje přes |breaklines. Podrobně Formuláře.

Naplánované úlohy#

Endpoint Co dělá Doporučený interval
/cron/blog/elastic/sync průběžná synchronizace indexu à 10 minut
/cron/blog/elastic/reindex úplný reindex denně v noci
/cron/blog/sitemap/{article,event,news} sitemapy obsahu denně v noci
/cron/blog/sitemap/{article,event,news}-category sitemapy kategorií denně v noci

Kam sáhnout#

Chci Kde
vzor zdroje pro vyhledávání app/UI/Api/Blog/Models/Search/ArticleDocumentSource.php
vzor rozkladu presenteru app/UI/Front/Blog/Presenters/Traits/
managery obsahu app/UI/Api/Blog/Models/Managers/
sdílené komentáře a hodnocení app/UI/Api/Base/Models/Entities/
cron úlohy app/UI/Cron/Blog/Presenters/

Navazující kapitoly: Elasticsearch · Diskuze · Překlady · Konvence kódu