Добавление пространства имен в Zend_Feed_Writer_Feed

#php #zend-framework #namespaces #atom-feed

#php #zend-framework #пространства имен #atom-feed

Вопрос:

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

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

Google хочет, чтобы файл feed был настроенной версией RSS или Atom с дополнительным пространством имен, прикрепленным к тегам, которые использует Google Product Search. Например, <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 ? есть ли какая-то система плагинов, которая позволяет это? Или мне просто нужно как-то зарегистрировать пространство имен?

Комментарии:

1. Казалось бы, Zend_Feed не имеет ничего общего с Zend_Feed_Writer, что объясняет, почему registerNamespace не работает

Ответ №1:

Расширяем из 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);
    } 
}
 

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

Комментарии:

1. Хорошо, это выглядит как отличное начало, но как мне затем установить теги, специфичные для Google, или добавить специфичное для Google пространство имен в стандартный тег atom?

2. Это должно вывести ваше пространство имен в стандартный тег, например: <feed xmlns=» w3.org/2005/Atom » xmlns:g=» base.google.com/ns/1.0 «>. Я не совсем понимаю, что вам нужно, вы можете обновить?

3. Канал Google Merchant ожидает, что некоторые дополнительные теги из их пространства имен g: будут смешаны со стандартными тегами atom. Например, <g:цена>, <g:условие> и <g:доступность>. Как только я подключу пространство имен к ленте, мне также нужно иметь возможность добавлять эти теги в ленту. Как мне это сделать?

4. @Ashley как мне создать его экземпляр? Должен ли я создать $this->feed = new My_Feed_Writer_Feed ();

5. @Mikunos Да, как обычный класс. См. framework.zend.com/manual/en/zend.feed.html

Ответ №2:

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/trunk/library/Shineisp/Feed/Writer/Extension/Google%3Fstate%3Dclosed

вы можете использовать мой код, как вам нравится!

 .
.
.
.
<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>
.
.
.
.