การสร้างแผนผังไซต์สำหรับโมเดลที่กำหนดเอง


12

ฉันได้พัฒนาโมดูล bespoke ซึ่งแสดงรายการของคนในเว็บไซต์ แต่ละคนมี URL ของตัวเอง (ตัวควบคุม Magento ซึ่งทำหน้าที่ CRUD ขั้นต้นในรุ่นบุคคล) และฉันต้องป้อน URL สาธารณะเหล่านี้ลงในไฟล์ XML ของ Google Sitemap

ฉันต้องการใช้แผนผังไซต์ของ Magento และ cron ถ้าทำได้

การMage_Sitemap_Model_Observerดึงข้อมูล Sitemap ทั้งหมดจากsitemapsตารางและการโทรแบบหนึ่งต่อหนึ่งแล้ว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();
    }
}

ฉันคิดว่าฉันต้องเพิ่ม Sitemap ใหม่ของฉันในsitemapsตารางซึ่งจะถูกเรียกให้สร้างไฟล์ XML (แยก) ของฉันสำหรับบันทึกโมเดลที่กำหนดเองของฉัน อย่างไรก็ตามฉันไม่รู้วิธีบอก Magento ให้ใช้ส่วนขยายMy_Module_Model_Sitemapแทนที่จะเป็นเพียงMage_Sitemap_Model_Sitemapส่วนหลังซึ่งจะให้ไฟล์ XML ที่ฉันแสดงรายการหมวดหมู่ผลิตภัณฑ์และหน้า CMS เดียวกันกับแผนผังไซต์หลักทั้งหมด

sitemapsตารางมีsitemap_typeคอลัมน์ แต่นี้จะไม่อ้างอิงในวีโอไอพี codebase เท่าที่ผมสามารถบอกได้

ฉันจะใช้เครื่องมือสร้างแผนผังเว็บไซต์ของ Magento ในขณะที่เขียนทับMage_Sitemap_Model_Sitemapเพื่อให้มีgenerateXml()วิธีการของตัวเองได้อย่างไร หรือฉันต้องสร้างระบบ sitemap สำรองเพื่อจุดประสงค์ของฉันเองที่นี่?


คุณต้องการที่จะขยายMage_Sitemap_Model_Sitemapชั้นเรียนและเขียนทับgenerateXml()ขวาหรือไม่ คุณลองทำอะไร
FlorinelChis

ได้ลองแล้ว แต่ Magento เพิ่งใช้Mage_Sitemap_Model_Sitemapและทำให้ฉันมีแผนผังไซต์อีกอันที่บรรจุผลิตภัณฑ์หมวดหมู่หน้า CMS - มันไม่ได้ใช้เวอร์ชันขยายของฉัน ฉันไม่แน่ใจว่าจะบอกได้อย่างไรว่าทำเช่นนั้น
Aaron Pollock

บางทีอาจจะเขียนใหม่ทั้งMage_Sitemap_Model_Sitemapไซต์และเพิ่มโมเดลของฉันเองภายใต้หมวดหมู่และการโทรผลิตภัณฑ์ จะอัปเดตในไม่ช้าด้วยความคืบหน้า
Aaron Pollock

คำตอบ:


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โมเดลภายในส่วน global / models ในไฟล์ config.xml ของโมดูลของฉันเอง:

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

สิ่งนี้จะเขียนทับการเรียกไปยังMage_Sitemap_Model_Sitemapไซต์ทั่วทั้งรุ่นที่กำหนดเองของฉัน แต่ฉันไม่ต้องการคัดลอกและวางรหัสมากเกินไป ใช้คำแนะนำของ Petar Dzhambazov ฉันใช้เงื่อนไขเพื่อเลื่อนชั้นผู้ปกครองเว้นแต่sitemap_typeจะเป็น "คน"

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

หากคุณต้องการที่จะเสร็จสมบูรณ์พฤติกรรม differnt สำหรับบนหน้าแผนผังเว็บไซต์อาจจะอ่านบ้านเปลี่ยนแปลง Sitemap.xmlและ / หรือจัดส่งเหตุการณ์ทั่วไปมากขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.