Özel bir model için site haritası oluşturma


12

Sitede bir dizi insanı listeleyen ısmarlama bir modül geliştirdim. Her kişinin kendi URL'si vardır (Kişi modellerinde temel CRUD yapan ısmarlama bir Magento denetleyicisi) ve bu genel URL'leri bir Google Site Haritası XML dosyasına beslemem gerekiyor.

Mümkünse Magento'nun kendi site haritası neslini ve cron'u kullanmak istiyorum.

Mage_Sitemap_Model_ObserverZaten tüm haritası kayıtları çeker sitemapsmasa ve-birer biri kendi çağırır generateXml()yöntemleri.

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

Ben sitemapsdaha sonra özel model kayıtları için (ayrı) XML dosyası oluşturmak için çağrılacak tabloya yeni Site Haritası eklemek gerektiğini düşünüyorum . Ancak, Magento'ya My_Module_Model_Sitemapsadece benim yerine genişletilmiş kullanmamı nasıl söyleyeceğimi bilmiyorum Mage_Sitemap_Model_Sitemap, ikincisi bana ana site haritaları ile aynı kategorileri, ürünleri ve CMS sayfalarını listeleyen bir XML dosyası verecek.

sitemapsTablo vardır sitemap_typesütunu, ama Magento kadarıyla söyleyebilirim codebase bu asla başvurulmaz.

Mage_Sitemap_Model_SitemapKendi generateXml()yöntemime sahip olmak için üzerine yazarken Magento'nun dahili site haritası motorunu nasıl kullanabilirim ? Yoksa burada yalnızca kendi amacım için alternatif bir site haritası sistemi oluşturmalı mıyım?


Mage_Sitemap_Model_Sitemapsınıfı genişletmek ve üzerine yazmak istiyorsun generateXml()değil mi? ne denedin
FlorinelChis

Bunu denedim, ancak Magento sadece Mage_Sitemap_Model_Sitemapürünleri, kategorileri, CMS sayfalarını içeren başka bir site haritası kullanıyor ve bana genişletilmiş sürümümü kullanmıyor. Nasıl yapılacağını nasıl söyleyeceğimi bilmiyorum.
Aaron Pollock

Belki de tüm Mage_Sitemap_Model_Sitemapsiteyi yeniden yazmak ve kategori ve ürün çağrıları altına kendi modelimi eklemek üzerinde çalışmak . Yakında ilerleme ile güncellenecek.
Aaron Pollock

Yanıtlar:


6

Sona erdiğim adımlar şu şekildeydi ve şimdiye kadarki yorum ve cevaplar beni doğru yönde başlattı.

Önce "site haritası" tablosuna bir satır ekledim. Çoklu mağaza ayarladığımız ve modül mağazamı agnostik tutmak istediğim için, bu INSERT kodunu bir MySQL geçişine kodlamamıştım, ancak sadece mağazada manuel olarak çalıştırdım:

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

Sonra Mage_Sitemap_Model_Sitemapkendi modülünün config.xml dosyasındaki global / modeller bölümünde modelin üzerine yazdım:

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

Bu Mage_Sitemap_Model_Sitemap, özel modelimle site genelinde yapılan çağrıların üzerine yazıyor , ancak oraya çok fazla kod kopyalayıp yapıştırmak istemedim. Petar Dzhambazov'un önerisini kullanarak sitemap_type, "insanlar" olmadığı sürece ana sınıfa ertelemek için bir koşul kullandım .

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

Üst sınıftan çok fazla kopyalayıp yapıştırmayı önleyen daha iyi bir yol var mı?


1

Genişletebilir Mage_Sitemap_Model_Sitemapve içinde sitemap_typetürünüz olup olmadığını kontrol edebilir, xml'nizi oluşturabilir, aksi takdirde üst xml oluşturabilirsiniz. Veya koleksiyon load_afteretkinliği için bir gözlemci ekleyebilir ve site haritası modelinizi koleksiyona ekleyebilirsiniz.


0

Üst sınıftan çok fazla kopyalayıp yapıştırmayı önleyen daha iyi bir yol var mı?

Magento> = 1.9.0.0'a sahipseniz ve ürünleri veya katalog önceliği / değiştirme sıklığı ayarını kullanmayı umursamıyorsanız, üzerinde bir gözlemci kullanabilirsiniz. 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);
    }
}

Site haritası sayfalarındaki farklı davranışları tamamlamak istiyorsanız, Sitemap.xml sayfasını okuyunuz ve / veya daha genel bir etkinlik gönderebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.