Добавление пространства имен к Zend_Feed_Writer_Feed - PullRequest
2 голосов
/ 26 октября 2011

Я работаю над созданием генератора каналов для использования с Поиском товаров Google для наших сайтов.Поскольку Zend включает в себя класс писателя каналов, я решил использовать Atom для формата каналов.

Я проделал некоторую работу по созданию чистого канала Atom, в который будут вводиться данные о реальном продукте, но я столкнулся с довольно серьезной проблемой.

Google хочет, чтобы файл фида представлял собой настроенную версию RSS или Atom, с дополнительным пространством имен, прикрепленным к тегам, которые использует Поиск продуктов Google.Например, <feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">.Я пытался выяснить, как присоединить дополнительное пространство имен и использовать его при создании канала, но документация Zend по этому вопросу в лучшем случае расплывчата, упоминая что-то о расширениях, не вдаваясь в подробности.

Я также нашел упоминание в документации по регистрации пространств имен для zend_feed, поэтому я попытался Zend_Feed::registerNamespace ('g', 'http://base.google.com/ns/1.0') присоединить необходимое пространство имен, но, похоже, это ничего не дало.

Итак, как мне добавить дополнительные пространства имен в канал Zend?Требуется ли подкласс zend_feed_writer_feed?Есть ли какая-то система плагинов, которая позволяет это?Или мне просто нужно как-то зарегистрировать пространство имен?

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Расширение от Zend_Feed_Atom и добавление:

class Gordons_Feed_Atom extends Zend_Feed_Atom {
     protected function _mapFeedHeaders($array) {
         $feed = parent::_mapFeedHeaders($array);
         $feed->setAttribute('xmlns:g', '"http://base.google.com/ns/1.0');
         return $feed;
     }
}

Обновление:

Вам придется переопределить функцию _mapFeedEntries, а затем добавить записи по мере добавления других:

    $cond = $this->_element->createElement('g:condition');
    $cond->appendChild($this->_element->createCDATASection($dataentry->gcondition));
    $entry->appendChild($cond);

Вы всегда можете сделать это:

protected function _mapFeedEntries(DOMElement $root, $array)
{
    parent::_mapFeedEntries($root, $array);
    foreach($array as $dataentry) {
        //Add you're custom ones
        $cond = $this->_element->createElement('g:condition');
        $cond->appendChild($this->_element->createCDATASection($dataentry->gcondition));
        $entry->appendChild($cond);
    } 
}

Эта функция обеспечит получение стандартных, а затем пользовательских.

0 голосов
/ 23 апреля 2012

Google Merchant Feed XML Atom 1.0

Я решил проблему с продуктом Zend Framework Google.Я подумал, что нужно переопределить основные классы, но я нашел лучшее решение, которое я использовал в своем проекте.

Прежде всего вам нужен проект Zend: P, затем вам нужно создать новое расширение фида, создавая некоторыепапки в вашей папке / library / MyProject, например:

library/Myproject/Feed/
└── Writer
    └── Extension
        └── Google
            ├── Entry.php
            ├── Feed.php
            └── Renderer
                ├── Entry.php
                └── Feed.php

, тогда вам нужно создать собственное расширение.Я создал собственное расширение Google в своем собственном проекте по адресу http://code.google.com/p/shineisp/source/browse/#svn%2Ftrunk%2Flibrary%2FShineisp%2FFeed%2FWriter%2FExtension%2FGoogle%253Fstate%253Dclosed

. Вы можете использовать мой код по своему усмотрению!

.
.
.
.
<entry>
    <title><![CDATA[Hosting Base]]></title>
    <summary><![CDATA[this is the summary.]]></summary>
    <updated>2012-04-23T13:09:55+02:00</updated>
    <link rel="alternate" type="text/html" href="http://www.mysite.com/hosting.html"/>
    <g:id>hosting-base</g:id>
    <g:availability/>
    <g:google_product_category/>
    <g:image_link>http://www.mysite.com/media/products/854_web-hosting-base.gif</g:image_link>
    <g:price>10.89</g:price>
    <g:condition>new</g:condition>
</entry>
.
.
.
.
...