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