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

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

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

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

Выполните расширение 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); } } 

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

Google Merchant Feed XML Atom 1.0

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

Прежде всего вам нужен проект 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> . . . .