Я работаю над внедрением генератора каналов для использования с 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> . . . .