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átky — saveSettingForm() 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