Opracowałem na zamówienie moduł, który wymienia szereg osób na stronie. Każda osoba ma własny adres URL (specjalnie zaprojektowany kontroler Magento, który wykonuje podstawowe CRUD w modelach Person) i muszę podać te publiczne adresy URL do pliku XML Google Sitemap.
Chcę użyć generowania map witryn Magento i crona, jeśli mogę.
Mage_Sitemap_Model_Observer
Już ściąga wszystkie rekordy witryny z sitemaps
tabeli i jeden po drugim nazywa swoje generateXml()
metody.
$collection = Mage::getModel('sitemap/sitemap')->getCollection();
/* @var $collection Mage_Sitemap_Model_Mysql4_Sitemap_Collection */
foreach ($collection as $sitemap) {
/* @var $sitemap Mage_Sitemap_Model_Sitemap */
try {
$sitemap->generateXml();
}
catch (Exception $e) {
$errors[] = $e->getMessage();
}
}
Myślę, że muszę dodać nową mapę witryny do sitemaps
tabeli, która zostanie następnie wywołana w celu wygenerowania (osobnego) pliku XML dla rekordów modelu niestandardowego. Nie wiem jednak, jak powiedzieć Magento, aby używał mojego rozszerzonego My_Module_Model_Sitemap
zamiast zwykłego Mage_Sitemap_Model_Sitemap
, z którego ten ostatni da mi tylko plik XML z listą wszystkich tych samych kategorii, produktów i stron CMS jako głównych map witryn.
sitemaps
Tabela ma sitemap_type
kolumnę, ale to nigdy nie jest wymieniony w Magento CODEBASE ile mogę powiedzieć.
Jak mogę korzystać z wbudowanego silnika mapy witryny Magento, nadpisując przy tym Mage_Sitemap_Model_Sitemap
swoją własną generateXml()
metodę? A może muszę tutaj zbudować alternatywny system map witryn tylko do własnych celów?
Mage_Sitemap_Model_Sitemap
klasę i zastąpić,generateXml()
prawda? czego próbowałeśMage_Sitemap_Model_Sitemap
i daje mi kolejną mapę witryny zawierającą produkty, kategorie, strony CMS - nie używa mojej rozszerzonej wersji. Nie jestem pewien, jak to powiedzieć.Mage_Sitemap_Model_Sitemap
witryny i dodaniem własnego modelu w ramach kategorii i wywołań produktów. Zaktualizuje wkrótce z postępem.Odpowiedzi:
Kroki, na których się ostatecznie skończyłem, były następujące, a komentarze i odpowiedzi do tej pory doprowadziły mnie do właściwego kierunku.
Najpierw dodałem wiersz do tabeli „mapy witryny”. Ponieważ skonfigurowaliśmy wiele sklepów, a ponieważ chcę zachować agnostyk magazynu modułów, nie wstawiłem tego kodu INSERT do migracji MySQL, ale po prostu uruchomiłem go ręcznie w sklepie:
Następnie nadpisałem
Mage_Sitemap_Model_Sitemap
model w sekcji global / models w pliku config.xml mojego modułu:To zastępuje wszelkie wywołania do
Mage_Sitemap_Model_Sitemap
całej witryny moim niestandardowym modelem, ale nie chciałem tam kopiować i wklejać zbyt dużo kodu. Korzystając z sugestii Petara Dzhambazova, użyłem warunku, aby odroczyć się do klasy nadrzędnej, chyba żesitemap_type
są to „ludzie”.Czy istnieje lepszy sposób, który pozwala uniknąć kopiowania i wklejania tak dużo z klasy nadrzędnej?
źródło
Możesz albo rozszerzyć
Mage_Sitemap_Model_Sitemap
i sprawdzić,sitemap_type
czy to twój typ, wygenerować xml, w przeciwnym razie wygenerować xml nadrzędny. Możesz też dodać obserwatora doload_after
wydarzenia kolekcji i dodać model mapy witryny do kolekcji.źródło
Jeśli masz Magento> = 1.9.0.0 i nie przejmujesz się używaniem produktów lub priorytetem katalogu / zmianą częstotliwości, możesz użyć obserwatora na
sitemap_products_generating_before
Jeśli chcesz zakończyć różne zachowanie na stronach z mapami witryn, przeczytaj Sitemap.xml zmień stronę główną i / lub wywołaj bardziej ogólne zdarzenie .
źródło