Створення мапи сайту для спеціальної моделі


12

Я розробив замовний модуль, в якому перераховано декілька людей на сайті. У кожної людини є своя URL-адреса (на замовлення Magento-контролера, який робить основні CRUD на моделях Person), і мені потрібно подати ці загальнодоступні 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стовпець, але на це ніколи не посилається в кодовій базі Magento, наскільки я можу сказати.

Як я можу використовувати вбудований двигун сайту карти Magento під час перезапису, Mage_Sitemap_Model_Sitemapщоб мати власний generateXml()метод? Або я мушу створити альтернативну систему Sitemap лише для своїх власних цілей?


ви хочете розширити Mage_Sitemap_Model_Sitemapклас і перезаписати generateXml()правильно? що ви пробували?
FlorinelChis

Я спробував це, але Magento просто використовує Mage_Sitemap_Model_Sitemapта дає мені ще одну мапу сайту, що містить продукти, категорії, сторінки CMS - він не використовує мою розширену версію. Я не впевнений, як сказати, як це зробити.
Аарон Поллок

Працюю над, можливо, переписуванням всього Mage_Sitemap_Model_Sitemapсайту, а також додаю власну модель під категорію та продуктові дзвінки. Незабаром оновиться з прогресом.
Аарон Поллок

Відповіді:


6

Етапи, які я закінчила, використовували такі дії, а коментарі та відповіді поки що мене розпочали в правильному напрямку.

Спершу я додав рядок до таблиці "sitemap". Оскільки у нас налаштовано багато магазинів, і тому, що я хочу зберегти свій модуль зберігання агностиків, я не важко кодував цю ВСТАВку в міграцію 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весь сайт за допомогою моєї користувальницької моделі, але я не хотів копіювати та вставляти занадто багато коду туди. Використовуючи пропозицію Петра Джамбазова, я використав умовне відведення до батьківського класу, якщо не 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подією збору та додати свою модель Sitemap до колекції.


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

Якщо ви хочете виконати різні поведінки для сторінок мапи сайту, можливо, прочитайте Sitemap.xml змінити головну та / або відправити більш загальну подію .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.