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

Katalog firem#

Modul Comcat vznikl kopií z Inzerce, takže sdílí skoro celý model: profil firmy je Advert s dynamickými parametry, kategorie je nested set, ceny za zápis jsou na kategorii. Zápisek o vzniku je v docs/comcat-copy-from-bazaar.md.

Nejdřív si přečtěte Inzerci

Co platí tam o dynamických parametrech, denormalizovaných počítadlech, pravidlech zobrazení a nevratném propsání do podstromu, platí i tady. Tahle kapitola popisuje jen rozdíly.

Rozdíly proti Inzerci#

Inzerce Katalog firem
denormalizovaná price ano ne
příznak sold ano ne
sledující (AdvertFollower) ano ne
hlídací pes ano ano
index nastavení 5 6

Chybějící cena je záměr, ne opomenutí

Firma se neprodává. Ceny jsou za zápis do kategorie, a ty jsou na kategorii (CategoryPrice), ne na profilu.

Rozdíl se propisuje i do generovaného sloupce active — má o jednu podmínku míň:

-- cms_mod_comcat_adverts.active (VIRTUAL)
active = CASE WHEN approved_at IS NOT NULL
              AND paid = 1 AND banned = 0 AND deleted = 0 AND deactivated = 0
         THEN 1 ELSE 0 END

Kopírovaný SQL dotaz z inzerce tu na sold narazí

Sloupec neexistuje. Kdo si přenese hotový dotaz, dostane chybu — což je ještě ta lepší varianta; horší je přenesený PHP kód, který na sold sáhne přes getter a dostane null.

Profil nemá pevná pole#

Název, IČO, adresa, telefon, popis i otevírací doba jsou parametry, stejně jako u inzerátu.

Bez parametrů je formulář prázdný

Než se dá založit první firma, musí existovat parametry a musí být nacílené na kategorii. Formulář nevyhodí chybu — prostě nemá co vykreslit, takže to vypadá jako nedokončená šablona.

Otevírací doba#

Vlastní typ pole: skryté pole s uloženou strukturou, které naplňuje JavaScript.

Otevírací doba se může tiše ztratit

Když se pole při uložení nevykreslí, kolekce parametrů se nahradí bez něj — tatáž mechanika jako u každé jiné kolekce (Hydrátory). Nic to neohlásí a v šabloně je to proto výslovně okomentované.

Kategorie a ceny#

Nested set, matice cen region × platební brána, propsání do podstromu.

Zaškrtnuté „zdarma“ jen SKRYJE matici, ceny se uloží dál

Pole jsou schovaná stylem, ne vypnutá. Odškrtnutím „zdarma“ se objeví ceny, které tam admin nikdy vědomě nezadal.

Členství × zaplacený zápis#

Detail profilu v placené kategorii se dá podmínit členstvím návštěvníka — což je něco úplně jiného než zaplacený zápis firmy.

Platba Kdo platí Co odemyká
zápis firma že profil v katalogu vůbec je
členství návštěvník že si detail profilu může zobrazit

Dvě různé platby, dva různí plátci

Záměna je nejčastější nedorozumění v tomhle modulu. „Firma zaplatila, a stejně to není vidět" znamená, že chybí členství návštěvníka — ne že selhala platba firmy.

Nastavení#

Modul má v tabulce nastavení index 6 (inzerce má 5). Formulář dnes zapisuje jen advertsPerPage, maxImageSize, expiration a automaticApproval.

Klíče, které kód nečte, byly z formuláře odstraněny — nevracejte je

Rozměry obrázků, typ zmenšení ani watermarkFilename v nastavení katalogu nejsou: varianty řídí assetVariants.neon (comcat-adverts) a 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átkysaveSettingForm() zapisuje všechny vyjmenované klíče, i ty, které nikdo nečte.

Naplánované úlohy#

Endpoint Co dělá Doporučený interval
/cron/comcat/category/recount přepočet počtů firem v kategoriích à 10–15 minut
/cron/comcat/advert/notice-expiration upozorní před vypršením zápisu denně
/cron/comcat/advert/delete-expired označí deleted = 1 po expiraci denně
/cron/comcat/watchdog-email/send rozešle hlídače à 5–10 minut
/cron/comcat/watchdog-email/digest souhrnný přehled denně večer
/cron/comcat/elastic/sync průběžná synchronizace indexu à 10 minut
/cron/comcat/elastic/reindex úplný reindex denně v noci
/cron/comcat/sitemap/{category,advert} sitemapy denně v noci

Bez cronu expirace zápisy nikdy nevyprší

Firmy, které přestaly platit, zůstanou v katalogu — a protože active expiraci nezná, budou se dál normálně zobrazovat.

Kam sáhnout#

Chci Kde
logiku profilu app/UI/Api/Comcat/Models/Managers/AdvertManager.php
přepočet počtů app/UI/Api/Comcat/Models/Managers/CategoryManager.php
nastavení modulu app/UI/Admin/Comcat/Presenters/SettingPresenter.php
cron úlohy app/UI/Cron/Comcat/Presenters/
zápisek o vzniku modulu docs/comcat-copy-from-bazaar.md

Navazující kapitoly: Inzerce · Elasticsearch · Naplánované úlohy