एक कस्टम मॉडल के लिए साइटमैप बनाना


12

मैंने एक बीस्पोक मॉड्यूल विकसित किया है जो साइट पर लोगों की एक श्रृंखला को सूचीबद्ध करता है। प्रत्येक व्यक्ति का अपना URL (एक bespoke Magento कंट्रोलर होता है, जो व्यक्ति मॉडल पर मूल CRUD करता है) और मुझे इन सार्वजनिक URL को Google साइटमैप XML फ़ाइल में फीड करना होगा।

अगर मैं कर सकता हूँ मैं Magento की अपनी साइटमैप पीढ़ी और क्रोन का उपयोग करना चाहता हूं।

Mage_Sitemap_Model_Observerपहले से ही से सभी साइटमैप रिकॉर्ड खींचती 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();
    }
}

मुझे लगता है कि मुझे अपने नए साइटमैप को sitemapsतालिका में जोड़ने की आवश्यकता है जिसे तब मेरे कस्टम मॉडल रिकॉर्ड के लिए मेरी (अलग) XML फ़ाइल बनाने के लिए कहा जाएगा। हालाँकि, मैं नहीं जानता कि कैसे मैगेंटो को My_Module_Model_Sitemapकेवल मेरे बजाय मेरे विस्तारित का उपयोग करने के लिए कहा जाए Mage_Sitemap_Model_Sitemap, जिसके उत्तरार्ध में मुझे मुख्य साइटमैप के रूप में सभी समान श्रेणियों, उत्पादों और सीएमएस पृष्ठों को सूचीबद्ध करने वाली एक्सएमएल फ़ाइल मिलेगी।

sitemapsतालिका एक है sitemap_typeस्तंभ, लेकिन यह संदर्भित कभी नहीं किया गया है में Magento जहाँ तक मैं बता सकता हूँ codebase।

मैं Mage_Sitemap_Model_Sitemapअपनी generateXml()विधि के लिए अधिलेखित करते समय मैगेंटो के इनबिल्ट साइटमैप इंजन का उपयोग कैसे कर सकता हूं ? या मुझे अपने स्वयं के प्रयोजनों के लिए एक वैकल्पिक साइटमैप प्रणाली का निर्माण करना चाहिए?


क्या आप Mage_Sitemap_Model_Sitemapवर्ग का विस्तार करना चाहते हैं और generateXml()अधिकार को अधिलेखित करना चाहते हैं ? आपने क्या प्रयास किया है
फ्लोरिनसेलइस

कोशिश की है कि, लेकिन Magento बस का उपयोग करता है Mage_Sitemap_Model_Sitemapऔर मुझे एक और साइटमैप देता है जिसमें उत्पाद, श्रेणियां, सीएमएस पृष्ठ शामिल हैं - यह एक विस्तारित संस्करण का उपयोग नहीं करता है। मुझे यकीन नहीं है कि यह कैसे करना है यह बताने के लिए।
आरोन पोलक

शायद पूरी Mage_Sitemap_Model_Sitemapसाइट को फिर से लिखना , और श्रेणी और उत्पाद कॉल के तहत अपने मॉडल में जोड़ना। जल्द ही प्रगति के साथ अपडेट होगा।
एरोन पोलक

जवाबों:


6

मैंने जिन चरणों का उपयोग कर समाप्त किया, वे इस प्रकार थे, और अब तक प्राप्त टिप्पणियों और उत्तरों ने मुझे सही दिशा में शुरू किया।

पहले मैंने "साइटमैप" तालिका में एक पंक्ति जोड़ी। चूंकि हमारे पास बहु-स्टोर सेट अप है, और क्योंकि मैं अपने मॉड्यूल स्टोर को अज्ञेयवादी रखना चाहता हूं, इसलिए मैंने इस 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>
        <sitemap>
            <rewrite>
                <sitemap>Mymod_People_Model_Sitemap</sitemap>
            </rewrite>
        </sitemap>
    </models>
</global>

यह Mage_Sitemap_Model_Sitemapमेरे कस्टम मॉडल के साथ साइट-वाइड पर किसी भी कॉल को ओवरराइट करता है , लेकिन मैं वहां बहुत अधिक कोड कॉपी और पेस्ट नहीं करना चाहता था। पेटर दज़मबाज़ोव के सुझाव का उपयोग करते हुए, मैंने मूल श्रेणी को स्थगित करने के लिए एक सशर्त का उपयोग किया जब तक कि 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);
    }
}

यदि आप साइटमैप पृष्ठों पर भिन्न व्यवहार को पूरा करना चाहते हैं, तो शायद साइटमैप पढ़ें। घर बदलें और / या एक अधिक सामान्य ईवेंट भेजें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.