Ostatnio w pracy na jednej z instalacji Magento (po upgrade z wersji 1.3.2.4 na 1.4.1.1), gdzie było dodanych kilka widoków sklepów, pojawił się problem z zapisem cech kategorii (tylko w przypadku, gdy kategoria była dodana po wyborze jednego z widoków sklepów). Okazało się, że nie można zapisać cechy z odznaczona opcją ‚Użyj wartości domyślnej’ (dla danego widoku sklepu). Po zapisie checkbox automatycznie ustawiał się na zaznaczony, a wartość cechy pozostała taka, jaka została wybrana lub w ogóle się nie zapisała.
Problem tkwił w tym, że cecha kategorii została zapisana tylko do danego widoku sklepu. Nie została zapisana do widoki zerowego (0), czyli widoku panelu administracyjnego.
Można to sprawdzić w bazie danych w tabeli ‚catalog_category_entity_varchar‚. Na poniższych obrazkach widać zrzut tej tabeli kiedy kategoria była tworzona na widoku konkretnego sklepu (obrazek 1) oraz na widoku ogólnym (obrazek 2).
Na pierwszym obrazku widać, że tylko 4 atrybuty zostały zapisane do widoku zerowego, reszta do konkretnego widoku sklepu (3).
Rozwiązaniem problemu jest tworzenie kategorii i podkategorii tylko z widoku ogólnego. Jednak nie w każdym przypadku jest to możliwe. Może zaistnieć sytuacja, że osobą zalogowana w panelu administracyjnym nie ma uprawnień do tego, aby widzieć całe drzewo kategorii, a co za tym idzie nie może dodawać kategorii na widoku ogólnym (widzi tylko kategorie z danego widoku sklepu). Tutaj konieczne jest ręczne dodanie do bazy wpisów dla danych cech kategorii do widoku zerowego (0). Można to zrobić edytując plik ‚app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php‚ i znając ‚attribute_id‚ danej cechy kategorii dla której chcemy dodać wpis do widoku zerowego. W pliku odnajdujemy funkcję ‚saveAction()‚ (linia ok. 250) i w sekcji ‚try‚ w pierwszej kolejności sprawdzamy, czy dodajemy, czy edytujemy kategorię, następnie po ‚$category->save();‚ prostym if’em sprawdzamy czy dodajemy kategorię z innego widoku niż zerowy (0), łączymy się z bazą danych i wykonujemy niezbędne wpisy do tabeli catalog_category_entity_varchar.
Kod może wyglądać mniej więcej tak:
try { $nowa = false; if(!$category->getId()) { $nowa = true; } $category->save(); if($storeId != 0 && $nowa): $read = Mage::getSingleton('core/resource')->getConnection('core_read'); $wynik = $read->query(" INSERT INTO sklep_catalog_category_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES (3, 36, 0, ".$category->getId().", ''), (3, 39, 0, ".$category->getId().", ''), (3, 48, 0, ".$category->getId().", ''), (3, 52, 0, ".$category->getId().", ''), (3, 40, 0, ".$category->getId().", ''), (3, 49, 0, ".$category->getId().", ''), (3, 50, 0, ".$category->getId().", ''), (3, 35, 0, ".$category->getId().", ''), (3, 51, 0, ".$category->getId().", ''); "); endif; Mage::getSingleton('adminhtml/session') ->addSuccess(Mage::helper('catalog') ->__('The category has been saved.')); $refreshTree = 'true'; }
Na poniższym obrazku widać, że zapytania się wykonały i wpisy zostały dodane.