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