# Bug Report: Phoca Cart 6 Email Layout Overrides Ignored in Joomla 5 ## Popis problému Při odesílání e-mailů (objednávek) v Phoca Cart 6 pod Joomla 5 dochází k ignorování JLayout přepisů (overrides) umístěných v aktuálně aktivní (výchozí) šabloně. Místo toho systém hledá přepisy v šabloně Cassiopeia, i když je tato šablona v systému vypnutá nebo není nastavena jako výchozí. ## Technická analýza Problém spočívá v identifikaci aktivní šablony během procesu odesílání e-mailu v souboru `administrator/components/com_phocacart/libraries/src/Layout/SiteLayout.php`. ### Aktuální implementace: ```php public function getDefaultIncludePaths() { if (Factory::getApplication()->isClient('site')) { return parent::getDefaultIncludePaths(); } // ... logika pro administrator klienta } ``` ### Proč to selhává: V momentě, kdy uživatel dokončí objednávku (POST požadavek na checkout task), se Joomla nachází v kontextu, kde `Factory::getApplication()->getTemplate(true)` vrací systémovou šablonu (Cassiopeia) namísto uživatelské výchozí šablony (např. YOOtheme). Je to způsobeno tím, že požadavek často postrádá `Itemid` nebo kontext menu položky, což vede k fallbacku Joomly na "default" systémovou šablonu. Protože `SiteLayout` v režimu `site` volá `parent::getDefaultIncludePaths()`, přebírá tyto chybné cesty od Joomly. ## Důkaz (Logs) Při ladění jsme do `SiteLayout.php` přidali logování generovaných cest. Zde je výpis z `phoca_paths.log` pořízený během ostrého odesílání objednávky na webu, kde je **jedinou** výchozí šablonou YOOtheme: ```text App: Joomla\CMS\Application\SiteApplication | Name: site | Client site: YES Include Paths: Array ( [0] => C:\laragon\www\progrestech_dev/templates/cassiopeia/html/layouts/com_phocacart [1] => C:\laragon\www\progrestech_dev/templates/cassiopeia/html/layouts [2] => C:\laragon\www\progrestech_dev/components/com_phocacart/layouts ) ``` _Poznámka: Jak je vidět, cesta [0] ukazuje na Cassiopeiu, ačkoliv web běží na YOOtheme._ ## Navrhované řešení V souboru `SiteLayout.php` by se nemělo spoléhat na `parent::getDefaultIncludePaths()` pro `site` klienta, pokud tento vrací fallbackovou šablonu. Místo toho by Phoca Cart měl vždy kontrolovat i šablonu, která je v databázi skutečně označena jako `home=1`. Úprava by mohla vypadat takto: ```php public function getDefaultIncludePaths() { $template = SiteHelper::getTemplate(); // Tato metoda v Phoca Cartu správně hledá home=1 v DB $paths = []; $paths[] = JPATH_SITE . '/templates/' . $template->template . '/html/layouts/com_phocacart'; $paths[] = JPATH_SITE . '/templates/' . $template->template . '/html/layouts'; if ($template->parent) { $paths[] = JPATH_SITE . '/templates/' . $template->parent . '/html/layouts/com_phocacart'; $paths[] = JPATH_SITE . '/templates/' . $template->parent . '/html/layouts'; } $paths[] = JPATH_SITE . '/components/com_phocacart/layouts'; return $paths; } ``` Tím se zajistí, že Phoca Cart bude vždy prioritně hledat přepisy ve skutečně výchozí šabloně webu, bez ohledu na to, jaký vnitřní stav zrovna hlásí Joomla Application objekt během odesílání e-mailu. ## Prostředí - Joomla 5.x - Phoca Cart 6.0.0 - PHP 8.x