একটি কাস্টম মডেলের জন্য সাইটম্যাপ তৈরি করা


12

আমি একটি বেসপোক মডিউল তৈরি করেছি যা সাইটের বিভিন্ন শ্রেণীর লোককে তালিকাবদ্ধ করে। প্রতিটি ব্যক্তির নিজস্ব ইউআরএল রয়েছে (একটি স্পপ ম্যাজেন্টো নিয়ামক, যা ব্যক্তি মডেলগুলিতে প্রাথমিক সিআরইউডি করে) এবং আমার এই পাবলিক ইউআরএলগুলিকে একটি গুগল সাইটম্যাপ এক্সএমএল ফাইলে ফিড করা দরকার।

আমি যদি পারি তবে ম্যাজেন্টোর নিজস্ব সাইটম্যাপ প্রজন্ম এবং ক্রোন ব্যবহার করতে চাই।

Mage_Sitemap_Model_Observerইতিমধ্যে থেকে সব সাইটম্যাপ রেকর্ড pulls 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টেবিলটিতে আমার নতুন সাইটম্যাপ যুক্ত করা দরকার যা এর পরে আমার কাস্টম মডেলের রেকর্ডগুলির জন্য আমার (পৃথক) এক্সএমএল ফাইল উত্পন্ন করার জন্য ডাকা হবে। যাইহোক, আমি জানি না কীভাবে আমার My_Module_Model_Sitemapপরিবর্তিতটিকে কেবল পরিবর্তে ব্যবহার করতে বলুন Mage_Sitemap_Model_Sitemap, যার পরেরটি আমাকে কেবলমাত্র একই সাইট, প্রধান সাইটম্যাপ হিসাবে একই বিভাগ, পণ্য এবং সিএমএস পৃষ্ঠাগুলির তালিকাভুক্ত একটি এক্সএমএল ফাইল দেবে।

sitemapsটেবিল একটি হয়েছে sitemap_typeকলাম, কিন্তু এই রেফারেন্সড হয় না এ Magento যতটা আমি বলতে পারেন কোডবেস।

Mage_Sitemap_Model_Sitemapনিজের generateXml()পদ্ধতিটি ওভাররাইট করার সময় আমি কীভাবে ম্যাজেন্টোর ইনবিল্ট সাইটম্যাপ ইঞ্জিন ব্যবহার করতে পারি ? বা এখানে কি কেবল নিজের উদ্দেশ্যে আমার একটি বিকল্প সাইটম্যাপ সিস্টেম তৈরি করতে হবে?


আপনি Mage_Sitemap_Model_Sitemapক্লাস প্রসারিত এবং generateXml()ডানদিকে ওভাররাইট করতে চান ? তুমি কি চেষ্টা করেছ?
ফ্লোরিনেল এই

চেষ্টা করেছেন, তবে ম্যাজেন্টো কেবলমাত্র ব্যবহার করে Mage_Sitemap_Model_Sitemapএবং আমাকে পণ্য, বিভাগ, সিএমএস পৃষ্ঠাগুলি সহ একটি অন্য সাইটম্যাপ দেয় - এটি আমার বর্ধিত সংস্করণ ব্যবহার করে না। কীভাবে এটি করা যায় তা কীভাবে বলব আমি নিশ্চিত নই।
অ্যারন পোলক

সম্ভবত পুরো Mage_Sitemap_Model_Sitemapসাইটটিকে প্রশস্ত করে আবার লিখতে , এবং বিভাগ এবং পণ্য কলগুলির আওতায় আমার নিজের মডেল যুক্ত করে কাজ করা। অগ্রগতি সহ শীঘ্রই আপডেট হবে।
অ্যারন পোলক

উত্তর:


6

আমি যে পদক্ষেপগুলি ব্যবহার করে শেষ করেছি সেগুলি নিম্নরূপ ছিল এবং এখন পর্যন্ত দেওয়া মন্তব্য এবং উত্তরগুলি আমাকে সঠিক দিকে শুরু করেছে।

প্রথমে আমি "সাইটম্যাপ" টেবিলটিতে একটি সারি যুক্ত করেছি। যেহেতু আমাদের মাল্টি-স্টোর সেটআপ রয়েছে এবং আমি আমার মডিউল স্টোরটিকে অজ্ঞেয় রাখতে চাই, তাই আমি এই INSERT কে মাইএসকিউএল মাইগ্রেশনে হার্ড কোড করি নি, তবে কেবল স্টোরটিতে ম্যানুয়ালি চালিয়েছি:

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

তারপরে আমি Mage_Sitemap_Model_Sitemapগ্লোবাল / মডেল বিভাগের অভ্যন্তরে মডেলটিকে আমার নিজস্ব মডিউলের কনফিগারেশন.এক্সএমএল ফাইলটিতে ওভাররোট করেছি:

<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এটিতে এটি আপনার ধরণের কিনা তা পরীক্ষা করতে পারেন, আপনার এক্সএমএল উত্পন্ন করুন, অন্যথায় প্যারেন্ট এক্সএমএল উত্পন্ন করতে পারেন। অথবা আপনি সংগ্রহ load_afterইভেন্টের জন্য একটি পর্যবেক্ষক যুক্ত করতে এবং সংগ্রহ করতে আপনার সাইটম্যাপ মডেল যুক্ত করতে পারেন।


0

এর চেয়ে আরও ভাল কোনও উপায় কি পিতাম শ্রেণীর কাছ থেকে এতটা অনুলিপি করা এবং আটকানো এড়ানো যায়?

আপনার যদি ম্যাজেন্টো> = 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);
    }
}

আপনি যদি সাইটম্যাপ পৃষ্ঠাগুলিতে পৃথক আচরণ সম্পূর্ণ করতে চান তবে সাইটম্যাপ.এক্সএমএল পরিবর্তন হোম এবং / অথবা আরও জেনেরিক ইভেন্ট প্রেরণ করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.