Membuat peta situs untuk model khusus

12

Saya telah mengembangkan modul dipesan lebih dahulu yang mencantumkan serangkaian orang di situs. Setiap orang memiliki URL mereka sendiri (pengontrol Magento yang dipesan lebih dahulu, yang melakukan CRUD dasar pada model Orang) dan saya perlu memasukkan URL publik ini ke dalam file XML Google Sitemap.

Saya ingin menggunakan generasi sitemap dan cron Magento sendiri jika saya bisa.

Yang Mage_Sitemap_Model_Observersudah menarik semua catatan peta situs dari sitemapstabel dan satu-per-satu memanggil generateXml()metode mereka .

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

Saya pikir saya perlu menambahkan peta situs baru saya di sitemapstabel yang kemudian akan dipanggil untuk menghasilkan file XML (terpisah) saya untuk catatan model kustom saya. Namun, saya tidak tahu bagaimana cara memberitahu Magento untuk menggunakan perpanjangan saya, My_Module_Model_Sitemapbukan hanya Mage_Sitemap_Model_Sitemap, yang terakhir hanya akan memberi saya file XML yang mencantumkan semua kategori, produk, dan halaman CMS yang sama sebagai peta situs utama.

The sitemapsmeja memiliki sitemap_typekolom, tapi ini tidak pernah dirujuk dalam Magento basis kode sejauh yang saya tahu.

Bagaimana saya bisa menggunakan mesin peta situs bawaan Magento sambil menimpa Mage_Sitemap_Model_Sitemapuntuk memiliki generateXml()metode saya sendiri ? Atau haruskah saya membangun sistem peta situs alternatif hanya untuk keperluan saya sendiri di sini?

Aaron Pollock
sumber
Anda ingin memperpanjang Mage_Sitemap_Model_Sitemapkelas dan menimpa generateXml()kan? apa yang sudah kamu coba
FlorinelChis
Telah mencobanya, tetapi Magento hanya menggunakan Mage_Sitemap_Model_Sitemapdan memberi saya peta situs lain yang berisi produk, kategori, halaman CMS - tidak menggunakan versi saya yang diperluas. Saya tidak yakin bagaimana cara mengatakannya.
Aaron Pollock
Bekerja mungkin menulis ulang seluruh Mage_Sitemap_Model_Sitemapsitus luas, dan menambahkan model saya sendiri di bawah kategori dan panggilan produk. Akan segera diperbarui dengan kemajuan.
Aaron Pollock

Jawaban:

6

Langkah-langkah yang akhirnya saya gunakan adalah sebagai berikut, dan komentar serta jawaban sejauh ini membuat saya mulai ke arah yang benar.

Pertama saya menambahkan baris ke tabel "sitemap". Karena kami memiliki pengaturan multi-toko, dan karena saya ingin menjaga agnostik toko modul saya, saya tidak mengubah kode INSERT ini menjadi migrasi MySQL, tetapi hanya menjalankannya di toko secara manual:

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

Kemudian saya menimpa Mage_Sitemap_Model_Sitemapmodel di dalam bagian global / models dalam file config.xml modul saya sendiri:

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

Ini menimpa semua panggilan ke seluruh Mage_Sitemap_Model_Sitemapsitus dengan model khusus saya, tetapi saya tidak ingin menyalin dan menempelkan terlalu banyak kode di sana. Menggunakan saran Petar Dzhambazov, saya menggunakan persyaratan untuk menunda ke kelas induk kecuali sitemap_type"orang".

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

Apakah ada cara yang lebih baik, yang menghindari menyalin dan menempel begitu banyak dari kelas induk?

Aaron Pollock
sumber
1

Anda dapat memperluas Mage_Sitemap_Model_Sitemapdan memeriksa sitemap_typeapakah itu tipe Anda, menghasilkan xml Anda, atau menghasilkan xml induk. Atau Anda dapat menambahkan pengamat untuk load_afteracara pengumpulan dan menambahkan model peta situs Anda ke koleksi.

Petar Dzhambazov
sumber
0

Apakah ada cara yang lebih baik, yang menghindari menyalin dan menempel begitu banyak dari kelas induk?

Jika Anda memiliki Magento> = 1.9.0.0 dan tidak peduli menggunakan produk atau pengaturan frekuensi prioritas / katalog, Anda dapat menggunakan pengamat di 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);
    }
}

Jika Anda ingin menyelesaikan perilaku berbeda untuk pada halaman sitemap mungkin membaca Sitemap.xml ganti home dan / atau kirim acara yang lebih umum .

sv3n
sumber