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

Diskuze#

Nejmenší modul systému — 13 entit, žádné dynamické parametry, žádné hlídače, žádná expirace. Kód: app/UI/Api/Discussion/, front app/UI/Front/Discussion/.

Z čeho se modul skládá#

Skupina Entity
obsah Message (nested set), MessageAssetRel
taxonomie Category, CategoryText
interakce MessageVote, MessageReport
placení Tariff, TariffPrice, TariffQuickPrice, PaymentItem
moderace BlacklistedWord, BlacklistedWordText

Vlákno a příspěvek jsou jedna entita#

Message je nested set (lft, rgt, level). Vlákno je kořenový uzel, odpověď je jeho potomek — mezi „téma“ a „příspěvek“ tedy není žádný typový rozdíl.

Přesun příspěvku není nijak omezený

Administrátor umí přetáhnout kterýkoli uzel kamkoli a systém nekontroluje, jestli to dává smysl. Přetažením odpovědi pod jiné téma se diskuze rozejde a nedá se to vrátit tlačítkem zpět.

Smazání uzlu smaže celý podstrom

Smazáním úvodního příspěvku zmizí celé vlákno včetně všech odpovědí. V seznamu to vypadá jako smazání jednoho řádku.

Co modul nemá#

Užitečnější než výčet funkcí je vědět, co tu není — ušetří to hledání neexistujícího nastavení:

Není Čím se to obchází
uzamčení vlákna vypnout „povolit komentáře“, nebo příspěvek deaktivovat
vypnutí kategorie kategorie nemá příznak aktivity — jen smazání
placený přístup do kategorie platí se jen zvýraznění příspěvku
práva podle kategorie jen globální přepínače „jen pro přihlášené“

Pole „zdarma“ u kategorie je mrtvé

Sloupec for_free v seznamu i ve formuláři je, ale v diskuzi ho nikdo nevyhodnocuje — na rozdíl od inzerce a katalogu firem, kde řídí cenu za zápis. Nesmí se proto uživateli prezentovat jako placená kategorie.

Hodnocení palcem#

Hlasy jsou MessageVote s hodnotou 1 = palec nahoru, 0 = palec dolů. Počítadla na příspěvku (votesUp, votesDown) se nezapisují absolutní hodnotou, ale přírůstkem — registerEvent() udělá serverový UPDATE … SET votesUp = votesUp + 1.

Přírůstek místo zápisu celé entity je záměr

Uložení celé entity by vyžadovalo oprávnění k zápisu příspěvku, které hlasující na cizím příspěvku nemá — a posílalo by absolutní hodnotu ze zastaralého čtení, takže dva souběžné hlasy by o sebe přišly.

Staré hlasy se do nového počítadla nepřenesly

Starší příspěvky ukážou nulu. Není to chyba zobrazení a nedá se to spočítat zpětně — historická data v novém tvaru nejsou.

Platby#

Jediná placená služba je zvýraznění příspěvku (toped_until). Platební položka nemá vazbu na kategorii — na rozdíl od katalogu firem, kde se platí za zápis do konkrétní kategorie.

Smazání aktivní platební položky zvýraznění zkrátí

Prodloužení z platby jde jen nahoru (je monotonní), ruční zásah v administraci umí obojí — a smazání položky se chová jako ruční zkrácení.

Nastavení#

Modul má v tabulce nastavení index 8. Formulář dnes zapisuje:

Klíč Typ
messagesPerPage, commentsPerPage, maxImageSize číslo
automaticApproval, messageOnlyForLoggedIn, commentOnlyForLoggedIn, voteOnlyForLoggedIn přepínač

Automatické schvalování jde uložit, ale nový kód ho nečte

Přepínač v administraci je, hodnota se uloží — a schvalování to neovlivní. Než na něj někdo napojí chování, je to jen uložené číslo.

Rozměry obrázků a vodoznak v nastavení nejsou — nevracejte je

Varianty řídí assetVariants.neon (discussion-messages), vodoznak globální watermarkPath. Klíče se smazaly 2026-08-13 (docs/sql/2026-08-13-settings-drop-unread-keys.sql); kdyby je někdo do formuláře vrátil, první uložení je založí zpátky, protože saveSettingForm() zapisuje všechny vyjmenované klíče.

Obrázky u příspěvku#

Uložení nahradí celý seznam obrázků

Nenaběhne-li nahrávací pole, přílohy zmizí — tatáž mechanika jako u každé jiné kolekce. Podrobně Formuláře, oddíl o nahrávání souborů.

Heslo pisatele#

Message nese sloupec password — nepřihlášený pisatel si jím může příspěvek zamknout pro pozdější editaci.

Z administrace se heslo nedá resetovat

Entita ho má, formulář administrace ho needituje. Pisatel, který ho zapomene, musí požádat o zásah v databázi.

Naplánované úlohy#

Endpoint Co dělá Doporučený interval
/cron/discussion/elastic/sync průběžná synchronizace indexu à 10 minut
/cron/discussion/elastic/reindex úplný reindex denně v noci
/cron/discussion/sitemap/{message,category} sitemapy denně v noci

Kam sáhnout#

Chci Kde
logiku příspěvků a stromu app/UI/Api/Discussion/Models/Managers/MessageManager.php
hlasování app/UI/Front/Discussion/Components/CommentListRowComponent/Traits/VoteTrait.php
přírůstkový zápis počítadel app/Core/Traits/Api/Models/Managers/RegisterEventTrait.php
nastavení modulu app/UI/Admin/Discussion/Presenters/SettingPresenter.php
cron úlohy app/UI/Cron/Discussion/Presenters/

Navazující kapitoly: Blog · Katalog firem · Elasticsearch · Formuláře