Generieren einer Sitemap für ein benutzerdefiniertes Modell

12

Ich habe ein maßgeschneidertes Modul entwickelt, das eine Reihe von Personen auf der Website auflistet. Jede Person hat ihre eigene URL (ein maßgeschneiderter Magento-Controller, der grundlegende CRUD-Funktionen für Personenmodelle ausführt), und ich muss diese öffentlichen URLs in eine XML-XML-Datei mit Google Sitemap einspeisen.

Ich möchte Magentos eigene Sitemap-Generierung und den Cron verwenden, wenn ich kann.

Die Mage_Sitemap_Model_Observerzieht bereits alle Sitemap-Datensätze aus der sitemapsTabelle und ruft nacheinander ihre generateXml()Methoden auf.

$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();
    }
}

Ich denke, ich muss meine neue Sitemap in die sitemapsTabelle einfügen, die dann aufgerufen wird, um meine (separate) XML-Datei für meine benutzerdefinierten Modelldatensätze zu generieren. Ich weiß jedoch nicht, wie ich Magento anweisen soll, mein erweitertes My_Module_Model_Sitemapstatt nur Mage_Sitemap_Model_Sitemapdas zu verwenden. Letzteres gibt mir nur eine XML-Datei, in der alle Kategorien, Produkte und CMS-Seiten als Haupt-Sitemaps aufgeführt sind.

Die sitemapsTabelle hat eine sitemap_typeSpalte, auf die in der Magento-Codebasis jedoch nie verwiesen wird, soweit ich das beurteilen kann.

Wie kann ich die in Magento integrierte Sitemap-Engine verwenden, während ich die überschreibe, Mage_Sitemap_Model_Sitemapum eine eigene generateXml()Methode zu haben ? Oder muss ich hier ein alternatives Sitemap-System nur für meine eigenen Zwecke erstellen?

Aaron Pollock
quelle
du willst die Mage_Sitemap_Model_Sitemapklasse erweitern und generateXml()richtig überschreiben ? was hast du versucht
FlorinelChis
Habe das versucht, aber Magento verwendet nur die Mage_Sitemap_Model_Sitemapund gibt mir eine andere Sitemap mit den Produkten, Kategorien, CMS-Seiten - meine erweiterte Version wird nicht verwendet. Ich bin mir nicht sicher, wie ich es sagen soll.
Aaron Pollock
Vielleicht arbeiten Sie daran, die gesamte Mage_Sitemap_Model_SitemapSite neu zu schreiben und mein eigenes Modell unter den Kategorien- und Produktaufrufen hinzuzufügen. Wird bald mit Fortschritt aktualisiert.
Aaron Pollock

Antworten:

6

Die Schritte, die ich letztendlich durchführte, waren wie folgt und die Kommentare und Antworten haben mich in die richtige Richtung geführt.

Zuerst habe ich der Tabelle "sitemap" eine Zeile hinzugefügt. Da wir Multishop Set-Up haben und weil ich meinen Modul-Store agnostisch halten möchte, habe ich dieses INSERT nicht hart in eine MySQL-Migration geschrieben, sondern es einfach manuell im Store ausgeführt:

INSERT INTO sitemap (sitemap_type, sitemap_filename, sitemap_path, store_id)
    VALUES ('people', 'people.xml', '/sitemap/', 2);

Dann habe ich das Mage_Sitemap_Model_SitemapModell im Abschnitt global / models in der config.xml-Datei meines eigenen Moduls überschrieben:

<global>
    <models>
        <sitemap>
            <rewrite>
                <sitemap>Mymod_People_Model_Sitemap</sitemap>
            </rewrite>
        </sitemap>
    </models>
</global>

Dies überschreibt alle Aufrufe für die gesamte Mage_Sitemap_Model_SitemapSite mit meinem benutzerdefinierten Modell, aber ich wollte dort nicht zu viel Code kopieren und einfügen. Auf Vorschlag von Petar Dzhambazov habe ich eine Bedingung verwendet, um mich der Elternklasse zu widersetzen, es sei denn, das sitemap_typeist "Volk".

class Mymod_People_Model_Sitemap extends Mage_Sitemap_Model_Sitemap
{
    const PAGE_REFRESH_FREQUENCY = 'weekly';
    const PAGE_PRIORITY = '1.0';

    public function generateXml()
    {
        if ($this->getSitemapType() != 'people') {
            return parent::generateXml();
        }

        $io = new Varien_Io_File();
        $io->setAllowCreateFolders(true);
        $io->open(array('path' => $this->getPath()));

        if ($io->fileExists($this->getSitemapFilename()) && !$io->isWriteable($this->getSitemapFilename())) {
            Mage::throwException(Mage::helper('sitemap')->__('File "%s" cannot be saved. Please, make sure the directory "%s" is writeable by web server.', $this->getSitemapFilename(), $this->getPath()));
        }

        $io->streamOpen($this->getSitemapFilename());

        $io->streamWrite('<?xml version="1.0" encoding="UTF-8"?>' . "\n");
        $io->streamWrite('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');

        $storeId = $this->getStoreId();
        $date    = Mage::getSingleton('core/date')->gmtDate('Y-m-d');
        $baseUrl = Mage::app()->getStore($storeId)->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK);

        /**
         * Generate people sitemap
         */
        $changefreq = Mymod_People_Model_Sitemap::PAGE_REFRESH_FREQUENCY;
        $priority   = Mymod_People_Model_Sitemap::PAGE_PRIORITY;
        $collection = Mage::getModel('people/person')->getCollection();
        foreach ($collection as $item) {
            $xml = sprintf('<url><loc>%s</loc><lastmod>%s</lastmod><changefreq>%s</changefreq><priority>%.1f</priority></url>',
                htmlspecialchars($item->getUrl()),
                $date,
                $changefreq,
                $priority
            );
            $io->streamWrite($xml);
        }
        unset($collection);

        $io->streamWrite('</urlset>');
        $io->streamClose();

        $this->setSitemapTime(Mage::getSingleton('core/date')->gmtDate('Y-m-d H:i:s'));
        $this->save();

        return $this;
    }
}

Gibt es einen besseren Weg, um zu vermeiden, dass so viel aus der Elternklasse kopiert und eingefügt wird?

Aaron Pollock
quelle
1

Sie können entweder erweitern Mage_Sitemap_Model_Sitemapund darin prüfen, sitemap_typeob es sich um Ihren Typ handelt, Ihre XML generieren oder eine übergeordnete XML generieren. Sie können auch einen Beobachter für das Sammlungsereignis load_afterhinzufügen und Ihr Sitemap-Modell zur Sammlung hinzufügen.

Petar Dzhambazov
quelle
0

Gibt es einen besseren Weg, um zu vermeiden, dass so viel aus der Elternklasse kopiert und eingefügt wird?

Wenn Sie über Magento> = 1.9.0.0 verfügen und sich nicht für die Verwendung von Produkten oder die Katalogpriorität / Änderung der Frequenzeinstellung interessieren, können Sie einen Beobachter für verwenden sitemap_products_generating_before

public function addPagesToSitemap(Varien_Event_Observer $observer)
{
    $collection = $observer->getCollection();
    $myPages = # your data: array('url_1', 'url_2')
    foreach ($myPages as $url) {
        $item = new Varien_Data_Object;
        $item->setUrl($url);
        $collection->addItem($item);
    }
}

Wenn Sie ein anderes Verhalten für Sitemap-Seiten ausführen möchten, lesen Sie möglicherweise Sitemap.xml change home und / oder senden Sie ein allgemeineres Ereignis .

sv3n
quelle