カスタムモデルのサイトマップを生成する


12

私は、サイト上の一連の人々をリストする特注のモジュールを開発しました。各人には独自のURL(Personモデルで基本的なCRUDを行う特注のMagentoコントローラー)があり、これらの公開URLをGoogleサイトマップXMLファイルにフィードする必要があります。

可能な場合は、Magento独自のサイトマップ生成とcronを使用します。

Mage_Sitemap_Model_Observer既にsitemapsテーブルからすべてのサイトマップレコードを取得し、1つずつ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();
    }
}

sitemapsテーブルに新しいサイトマップを追加して、カスタムモデルレコード用の(別個の)XMLファイルを生成するために呼び出される必要があると思います。ただし、MagentoにMy_Module_Model_Sitemap単にの代わりに自分の拡張を使用するように指示する方法がわかりませんMage_Sitemap_Model_Sitemap

sitemapsテーブルには、持っているsitemap_type列を、これは私の知る限りとしてMagentoのコードベースで参照されることはありません。

を上書きしながら、Magentoの組み込みサイトマップエンジンを使用Mage_Sitemap_Model_Sitemapして独自のgenerateXml()メソッドを作成するにはどうすればよいですか?または、ここで自分の目的のためだけに別のサイトマップシステムを構築する必要がありますか?


Mage_Sitemap_Model_Sitemapクラスを拡張して上書きしたいgenerateXml()ですか?何を試しましたか?
FlorinelChis

それを試してみましたが、Magentoはを使用しMage_Sitemap_Model_Sitemap、製品、カテゴリ、CMSページを含む別のサイトマップを提供します-私の拡張バージョンは使用しません。どうやってそれを伝えるかわからない。
アーロンポロック

多分Mage_Sitemap_Model_Sitemapサイト全体を書き直し、カテゴリと製品コールの下に自分のモデルを追加することに取り組んでいます。近日中に進捗状況が更新されます。
アーロンポロック

回答:


6

最終的に使用した手順は次のとおりであり、これまでのコメントと回答により、私は正しい方向に進みました。

最初に、「sitemap」テーブルに行を追加しました。マルチストアが設定されているため、またモジュールストアに依存しないようにするため、このINSERTをMySQL移行にハードコードせず、ストアで手動で実行しました。

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

次にMage_Sitemap_Model_Sitemap、自分のモジュールのconfig.xmlファイルのglobal / modelsセクション内のモデルを上書きしました。

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

これMage_Sitemap_Model_Sitemapにより、サイト全体の呼び出しがカスタムモデルで上書きされますが、コピーアンドペーストしたくないコードはそこにありません。Petar Dzhambazovの提案を使用して、条件sitemap_typeが "people"でない限り、親クラスに従うことを使用しました。

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

親クラスからあまりコピーして貼り付けることを回避するより良い方法はありますか?


1

拡張Mage_Sitemap_Model_Sitemapしてsitemap_type、それが自分のタイプかどうかをチェックし、xmlを生成するか、親xmlを生成することができます。または、コレクションload_afterイベントのオブザーバーを追加して、サイトマップモデルをコレクションに追加できます。


0

親クラスからあまりコピーして貼り付けることを回避するより良い方法はありますか?

Magento> = 1.9.0.0をお持ちで、製品の使用やカタログの優先度/頻度設定の変更を気にしない場合は、オブザーバーを使用できます 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);
    }
}

サイトマップページのさまざまな動作を完了したい場合は、Sitemap.xmlのホームの変更や、より一般的なイベントのディスパッチをお読みください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.