Question

J'ai développé un module sur mesure qui énumère une série de personnes sur le site. Chaque personne a sa propre URL (un contrôleur sur mesure Magento, qui fait CRUD de base sur les modèles personne) et je dois nourrir ces URL publiques dans un fichier XML Google Sitemap.

Je veux utiliser propre génération de plan du site Magento et Cron si je peux.

Le Mage_Sitemap_Model_Observer tire déjà tous les enregistrements Sitemap de la table sitemaps et un par l'on appelle leurs méthodes de generateXml().

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

Je pense que je dois ajouter mon nouveau site dans la table sitemaps qui sera ensuite appelée pour générer mon fichier XML (séparé) pour mes dossiers de modèle personnalisé. Cependant, je ne sais pas comment dire Magento utiliser mon My_Module_Model_Sitemap étendu au lieu d'Mage_Sitemap_Model_Sitemap, ce dernier qui me donne un fichier XML répertoriant toutes les catégories, les produits et les pages CMS comme les sitemaps principaux.

Le tableau de sitemaps a une colonne de sitemap_type, mais ce n'est jamais référencé dans Magento codeBase pour autant que je peux dire.

Comment puis-je utiliser le moteur intégré de plan du site Magento en écrasant le Mage_Sitemap_Model_Sitemap d'avoir ma propre méthode de generateXml()? Ou dois-je construire un système alternatif de plan du site juste pour mes propres fins ici?

Était-ce utile?

La solution

Les étapes que je fini par utiliser étaient comme suit, et les commentaires et les réponses à ce jour m'a lancé dans la bonne direction.

D'abord, j'ajouté une ligne à la table « plan du site ». Depuis que nous avons mis plusieurs magasins, et parce que je veux garder mon agnostique magasin de module, je n'ai pas coder en dur cette INSERT dans une migration de MySQL, mais juste couru sur le magasin manuellement:

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

Alors je réenregistrés le modèle Mage_Sitemap_Model_Sitemap dans la section globale des modèles / dans mon propre fichier config.xml du module:

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

remplace les appels à mon modèle Mage_Sitemap_Model_Sitemap l'ensemble du site avec la coutume, mais je ne voulais pas copier et coller le code trop là. En utilisant la suggestion de Petar Dzhambazov, je conditionnelle de reporter à la classe parente à moins que le sitemap_type est « les gens ».

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;
    }
}

Y at-il une meilleure façon, qui évite copier-coller tant de la classe parente?

Autres conseils

Vous pouvez étendre soit Mage_Sitemap_Model_Sitemap et il vérifier sitemap_type si elle est votre type, générer votre xml, sinon générer xml parent. Vous pouvez également ajouter un observateur collection événement load_after et ajoutez votre modèle de plan du site à la collection.

  

Y at-il une meilleure façon, qui évite copier-coller tant de la classe parente?

Si vous avez Magento> = 1.9.0.0 et ne se soucient pas de l'utilisation de produits ou catalogue réglage de la fréquence / priorité changement, vous pouvez utiliser un observateur 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);
    }
}

Si vous voulez compléter le comportement differnt pour les pages sitemap lire peut-être Plan du site. changement xml maison et / ou envoyer une événement plus générique .

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top