Tạo sơ đồ trang web cho một mô hình tùy chỉnh


12

Tôi đã phát triển một mô-đun bespoke liệt kê một loạt người trên trang web. Mỗi người có URL riêng (bộ điều khiển Magento riêng biệt, có CRUD cơ bản trên các mô hình Người) và tôi cần đưa các URL công khai này vào tệp XML Sơ đồ trang web của Google.

Tôi muốn sử dụng thế hệ sơ đồ trang web riêng của Magento và cron nếu có thể.

Việc này Mage_Sitemap_Model_Observerđã lấy tất cả các bản ghi Sơ đồ trang web từ sitemapsbảng và từng người gọi các generateXml()phương thức của họ .

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

Tôi nghĩ rằng tôi cần thêm Sơ đồ trang web mới của mình vào sitemapsbảng mà sau đó sẽ được gọi để tạo tệp XML (riêng) cho các bản ghi mô hình tùy chỉnh của tôi. Tuy nhiên, tôi không biết làm thế nào để bảo Magento sử dụng phần mở rộng của mình My_Module_Model_Sitemapthay vì chỉ Mage_Sitemap_Model_Sitemap, phần sau sẽ chỉ cho tôi một tệp XML liệt kê tất cả các danh mục, sản phẩm và trang CMS giống như sơ đồ trang web chính.

Các sitemapsbảng có một sitemap_typecột, nhưng điều này không bao giờ được tham chiếu trong Magento codebase như xa như tôi có thể nói.

Làm cách nào tôi có thể sử dụng công cụ sơ đồ trang web sẵn có của Magento trong khi ghi đè lên phương thức Mage_Sitemap_Model_Sitemapcủa riêng mình generateXml()? Hoặc tôi phải xây dựng một hệ thống sơ đồ trang web thay thế chỉ cho mục đích riêng của mình ở đây?


bạn muốn mở rộng Mage_Sitemap_Model_Sitemaplớp học và ghi đè generateXml()phải không? bạn đã thử gì
FlorinelChis

Đã thử điều đó, nhưng Magento chỉ sử dụng Mage_Sitemap_Model_Sitemapvà đưa cho tôi một sơ đồ trang web khác có chứa các sản phẩm, danh mục, trang CMS - nó không sử dụng phiên bản mở rộng của tôi. Tôi không chắc làm thế nào để nói với nó làm thế nào để làm như vậy.
Aaron Pollock

Làm việc trên có lẽ viết lại toàn bộ Mage_Sitemap_Model_Sitemaptrang web và thêm vào mô hình của riêng tôi theo danh mục sản phẩm và cuộc gọi. Sẽ cập nhật sớm với tiến độ.
Aaron Pollock

Câu trả lời:


6

Các bước tôi đã kết thúc bằng cách sử dụng như sau, và các nhận xét và câu trả lời cho đến nay đã giúp tôi bắt đầu đi đúng hướng.

Đầu tiên tôi đã thêm một hàng vào bảng "sơ đồ trang web". Vì chúng tôi đã thiết lập nhiều cửa hàng và vì tôi muốn giữ cho cửa hàng mô-đun của mình không bị nghi ngờ, tôi đã không mã hóa INSERT này thành một di chuyển MySQL, nhưng chỉ chạy nó trên cửa hàng theo cách thủ công:

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

Sau đó, tôi ghi đè lên Mage_Sitemap_Model_Sitemapmô hình bên trong phần toàn cầu / mô hình trong tệp config.xml của mô-đun của riêng tôi:

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

Điều này ghi đè bất kỳ cuộc gọi nào đến toàn bộ Mage_Sitemap_Model_Sitemaptrang web bằng mô hình tùy chỉnh của tôi, nhưng tôi không muốn sao chép và dán quá nhiều mã ở đó. Sử dụng đề xuất của Petar Dzhambazov, tôi đã sử dụng một điều kiện để trì hoãn lớp cha trừ khi đó sitemap_typelà "người".

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

Có cách nào tốt hơn, đó là tránh sao chép và dán quá nhiều từ lớp cha?


1

Bạn có thể mở rộng Mage_Sitemap_Model_Sitemapvà kiểm tra sitemap_typexem đó có phải là loại của bạn không, tạo xml của bạn, nếu không thì tạo xml cha. Hoặc bạn có thể thêm một người quan sát cho load_aftersự kiện bộ sưu tập và thêm mô hình sơ đồ trang web của bạn vào bộ sưu tập.


0

Có cách nào tốt hơn, đó là tránh sao chép và dán quá nhiều từ lớp cha?

Nếu bạn có Magento> = 1.9.0.0 và không quan tâm đến việc sử dụng cài đặt tần suất ưu tiên / thay đổi danh mục sản phẩm hoặc danh mục, bạn có thể sử dụng trình quan sát trên 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);
    }
}

Nếu bạn muốn hoàn thành hành vi differnt cho trên các trang sơ đồ trang web, có thể đọc Sitemap.xml thay đổi trang chủ và / hoặc gửi một sự kiện chung chung hơn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.