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