맞춤 모델을위한 사이트 맵 생성


12

사이트에 일련의 사람들을 나열하는 맞춤형 모듈을 개발했습니다. 각 사람은 고유 한 URL (Person 모델에서 기본 CRUD를 수행하는 맞춤형 Magento 컨트롤러)을 가지고 있으며 이러한 공개 URL을 Google Sitemap XML 파일에 제공해야합니다.

가능하면 Magento의 자체 사이트 맵 생성과 크론을 사용하고 싶습니다.

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

sitemaps표에 새 Sitemap을 추가해야하는데, 그런 다음 사용자 지정 모델 레코드를위한 별도의 XML 파일을 생성하기 위해 호출됩니다. 그러나 Magento에게 확장 My_Module_Model_Sitemap대신 내 확장을 사용하도록 지시하는 방법을 모르겠습니다 Mage_Sitemap_Model_Sitemap. 후자는 기본 사이트 맵과 동일한 범주, 제품 및 CMS 페이지를 모두 나열하는 XML 파일을 제공합니다.

sitemaps표는이 sitemap_type열을하지만, 마 젠토는 지금까지 내가 말할 수있는 코드베이스에서이 참조되지 않습니다.

Magento의 내장 사이트 맵 엔진을 사용 Mage_Sitemap_Model_Sitemap하여 내 generateXml()방법 을 덮어 쓰려면 어떻게 해야 합니까? 아니면 여기서 나만의 목적으로 대체 사이트 맵 시스템을 만들어야합니까?


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내 모듈의 config.xml 파일에서 global / models 섹션 안에 모델을 덮어 썼습니다 .

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

사이트 맵 페이지에서 다른 동작을 완료 하려면 Sitemap.xml 홈 변경을 읽 거나 보다 일반적인 이벤트를 전달하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.