XML RSS заголовки и мультифид

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

XML RSS заголовки и мультифид

Post by Il_Burbero »

Уже второй раз спотыкаюсь на этом.
Иногда валидаторы ругаются, иногда агрегаторы, иногда хостер(сервер) 500 выдает.
Проблема:
Создаем rss ленту (модуль Calguys Feed Maker) допустим код валидный все хорошо но заголовок:

Code: Select all

Server: nginx/0.6.34
Date: Fri, 10 Apr 2009 19:48:35 GMT
[b]Content-Type: text/xml;[/b] charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.2.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Language: ru-RU

[b]500 [/b]Internal Server Error


Надо перебить Content type.
Создаем Тег пользователя xmlheader с кодом

Code: Select all

    
global $gCms;
$variables = &$gCms->variables;
$variables['content-type'] = 'application/xml';
Втыкаем его в модуль Calguys Feed Maker в самое начало шаблона

Code: Select all

{xmlheader}<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel> ....
Смотрим снова заголовки

Code: Select all

Server: nginx/0.6.34
Date: Fri, 10 Apr 2009 19:54:51 GMT
[b]Content-Type: application/xml;[/b] charset=utf-8
.....
500 Internal Server Error
Мде. Не сработало. Жаль. Что же косячит? Наверное слишком много напихал в фид :) всяких штук и пока он обрабатывается сервер считает что запрос нехороший и на всякий случай выдает 500.
В общем благодаря подсказке Сони на content_dump (правда он почему то "дублит" контент т.е. каждую страницу выводит два раза в дамп) я решил заделать мегафид (сбылась мечта) чтобы и новости и альбомы (правда альбомы пришлось выводить вручную) там с картинками и обычные страницы (они ж обновляются иногда). Зачем? Ну фиды можно добавлять в агрегаторы, а агрегаторы индексируются и теоретически можно получить крупицу ссылочного счастья.
Вот шаблон мультифида:

Code: Select all

{xmlheader}<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
  {* note: if you have not configured pretty urls or mod rewrite, the next line may fail when trying to validate the feed *}
  <atom:link href="{$feed_url}" rel="self" type="application/rss+xml" />
    <title>{$feed.title}</title>
    {if isset($feed.link) && !empty($feed.link)}<link>{$feed.link}</link>{/if}
    {if isset($feed.description) && !empty($feed.description)}<description>{$feed.description}</description>{/if}
    {if isset($feed.copyright) && !empty($feed.copyright)}<copyright>{$feed.copyright}</copyright>{/if}
    {if isset($generator)}<generator>{$generator}</generator>{/if}
    {if isset($feed.managing_editor) && !empty($feed.managing_editor)}<managingEditor>{$feed.managing_editor}</managingEditor>{/if}
    {if isset($admin_email)}<webMaster>{$admin_email} ({$admin_user->firstname} {$admin_user->lastname})</webMaster>{/if}
    {if isset($feed.image) && !empty($feed.image)}
      <image>
	{if isset($feed.description) && !empty($feed.description)}<description>{$feed.description}</description>{/if}
        {if isset($feed.link) && !empty($feed.link)}<link>{$feed.link}</link>{/if}
        <title>{$feed.title}</title>
        <url>{$file_location}/{$feed.image}</url>
      </image>
    {/if}

    {* an example of how to create a feed from a call to the news module *}
    {news assign='junk'}
    {foreach from=$items item='entry'}
    <item>
      <title>{$entry->title|cms_html_entity_decode}</title>
      <link>{$entry->moreurl}</link>
      {capture assign='description'}{if isset($entry->summary)}{$entry->summary}{else}{$entry->content}{/if}{/capture}
      <description>{$description|trim|strip_tags|summarize:40}</description>
      <pubDate>{$entry->postdate|rfc_date}</pubDate>
      <guid>{$entry->moreurl}</guid>
    </item>
    {/foreach}

 {* an example of how to create a feed from a call to the album module *}

    {capture assign='portfolio'}
      {cms_module module='album' detailpage='portfolio' sortpicturesdesc='true' albums='4' action='random_image' number='3'}
    {/capture}  
    {foreach from=$pictures item='entry'}
    <item>
      <title>{$entry->name}</title>
      <link>{$feed.link}</link>
      <description> 
	   <![CDATA[<a href="{$feed.link}"<img src="{$entry->thumbnail}" alt="{$entry->comment|strip_tags|truncate:150}" width="{$entry->thumbnailwidth}" height="{$entry->thumbnailheight}"/></a><br/>
	   {$entry->comment|strip_tags|truncate:150} {$entry->comment2|strip_tags|truncate:150} {$entry->comment3|strip_tags|truncate:150}
<hr />]]>
      </description>
    </item>
    {/foreach}

    {capture assign='photogallery'}
      {cms_module module='album' sortpicturesdesc='true' albums='5' action='random_image' number='3'}
    {/capture}    
    {foreach from=$pictures item='entry'}
    <item>
      <title>{$entry->name}</title>
      <link>{$feed.link}</link>
      <description> 
	   <![CDATA[<a href="{$feed.link}"<img src="{$entry->thumbnail}" alt="{$entry->comment|strip_tags|truncate:150}" width="{$entry->thumbnailwidth}" height="{$entry->thumbnailheight}"/></a><br/>
	   {$entry->comment|strip_tags|truncate:150} {$entry->comment2|strip_tags|truncate:150} {$entry->comment3|strip_tags|truncate:150}<hr />]]>
      </description>
    </item>
    {/foreach}

 {* an example of how to create a feed from a call to the content_dump (e.g. content) module exclude album news and badworking with do_smarty pages*}
    {content_dump assign='contentdump' first_sort_order='down' exclude='15,16,20,22' do_smarty='compile'}
{assign var='previd' value=0} {*exclude doubles*}
    {foreach from=$contentdump item='entry'}
{if $previd ne $entry->content->id}{*exclude doubles*}
{assign var='previd' value=$entry->content->id}{*exclude doubles*}
    <item>
      <title>{$entry->content->title|strip_tags}</title>
      <link>{$feed.link}/{$entry->content->alias}.html</link>
      <description> 
	   <![CDATA[
           {$entry->content->data|strip_tags|truncate:400}
           ]]>
      </description>
    </item>
{else} {*exclude doubles*}
{*exclude doubles*}
{/if} {*exclude doubles*}
   {/foreach}

  </channel>
</rss>
Sonya

Re: XML RSS заголовки и мультифид

Post by Sonya »

Il_Burbero wrote: Уже второй раз спотыкаюсь на этом.
Иногда валидаторы ругаются, иногда агрегаторы, иногда хостер(сервер) 500 выдает.
У меня никогда никто не ругается. И не знаю почему?  ::) Какими валидаторами, аггрегаторами ты пользуешься? Может я не там проверяю? Может у меня тоже ругается, а я об этом не подозреваю?
Il_Burbero wrote: В общем благодаря подсказке Сони на content_dump (правда он почему то "дублит" контент т.е. каждую страницу выводит два раза в дамп)
...
{content_dump assign='contentdump' ...
Я думаю, что "двойной вывод" связан с assign. Он тебе не нужен, поскольку {content_dump} сам по себе уже выводит переменную $dump. А assign скорей всего ее дублирует. Попробуй убрать его и работать  с $dump.
Il_Burbero wrote: Вот шаблон мультифида:

{* an example of how to create a feed from a call to the content_dump (e.g. content) module exclude album news and badworking with do_smarty pages*}
.....
      {$feed.link}/{$entry->content->alias}.html
не есть хорошо, поскольку здесь ты привязываешь линк к своим настройкам :) Без иерархии и с .html, а у меня, например, c иерархией и без .html. Проще заставить CMS выводить верные линки на основе алиаса, независимо от домена и других настроек, будет всегда выдаваться верно. Например, так:

Code: Select all

<link>{cms_selflink href=$entry->content->alias}</link>
Мой полный шаблон выглядит так

Code: Select all

{content_dump}
  {foreach from=$dump item=dump}
    <item>
     <title>{$dump->content->title}</title>
     <link>{cms_selflink href=$dump->content->alias}</link>
     <description>{$dump->content->data|trim|strip_tags|summarize:40}</description>
     <pubDate>{$dump->created->date|rfc_date}</pubDate>
      <guid>{cms_selflink href=$dump->content->alias}</guid>
    </item>
 {/foreach}
Last edited by Sonya on Sat Apr 11, 2009 9:29 am, edited 1 time in total.
Sonya

Re: XML RSS заголовки и мультифид

Post by Sonya »

И еще, вот это что?

Code: Select all

<a href="{$feed.link}"<img src="{$entry->thumbnail}" alt="{$entry->comment|strip_tags|truncate:150}" width="{$entry->thumbnailwidth}" height="{$entry->thumbnailheight}"/></a>
Тут <a открылся, в нем же <img открылся.... Разве такое валидируется?
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

Re: XML RSS заголовки и мультифид

Post by Il_Burbero »

Я думаю, что "двойной вывод" связан с assign. Он тебе не нужен, поскольку {content_dump} сам по себе уже выводит переменную $dump. А assign скорей всего ее дублирует. Попробуй убрать его и работать  с $dump.
Вряд ли, в мануале пишут что он выводит в dump по умолчанию, а если задать другую переменную то будет выводить туда. Какой то локальный глюк конкретного сайта - на других попробовал работает нормально. Пробовал на дебаг режиме поймать - ничего. В таблицу лазил - нормально все дублей нет. Единственно что у меня меню как бы двойное выводится русский линк и картинка с английским текстом - я думаю отсюда и косяки (непонятно правда зачем контент дамп лезет в меню).

За остальные подсказки спасибо :)
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

Re: XML RSS заголовки и мультифид

Post by Il_Burbero »

Забавно.
Никакие шаманства не помогли в борьбе с ошибкой 500. В браузер выдает все корректно, а в заголовках на некоторых страницах 500 и хучь тресни.
Но мир не без добрых людей :) (Спасибо ув. George Hazlewood) порывшись хорошенько обнаружил хак который нейтрализует проблему. Кстати это проблема не только фидов но и некоторых модулей (и наверное некоторых хостеров как обычно), у меня например на страничке с формами и картой от гугли такая засада... Была :)
Тегом хак (увы) не работает, придется лезть в index.php и там добавить строчку:

Code: Select all

header('HTTP/1.1 200 OK');
Я ее добавил ПЕРЕД кодом

Code: Select all

header("Content-Type: " . $gCms->variables['content-type'] . "; charset=" . (isset($pageinfo->template_encoding) && $pageinfo->template_encoding != ''?$pageinfo->template_encoding:get_encoding()));
Проверил все проблемные (error 500) странички, вроде проблема ушла. Подождем ответа поисковиков...
Last edited by Il_Burbero on Mon Apr 20, 2009 10:08 am, edited 1 time in total.
Post Reply

Return to “Russian - русский”