Вывод изображения для турбо-страниц

Главные вкладки

Аватар пользователя kovalevm kovalevm 27 сентября 2019 в 14:29

Добрый день!
Для создания Турбо-страниц яндекс предлагает модуль
https://www.drupal.org/project/yandex_turbo

В принципе все работает, но не выводится изображение к статье.

https://www.romanticcollection.ru/yandex.turbo.rss

Вот таким кодом должны выводиться изображения:

<?php<header>
        <h1>Ресторан «Полезный завтрак»</h1>
        <h2>Вкусно и полезно</h2>
        <figure>
          <img src="https://avatars.mds.yandex.net/get-sbs-sd/403988/e6f459c3-8ada-44bf-a6c9-dbceb60f3757/orig">
        </figure>
      </header>
      <p>Как хорошо начать день? Вкусно и полезно позавтракать!</p>
      <p>Приходите к нам на завтрак. Фотографии наших блюд ищите <a href="#">на нашем сайте</a>.</p>
      <h2>Меню</h2>
      <figure>
        <img src="https://avatars.mds.yandex.net/get-sbs-sd/369181/49e3683c-ef58-4067-91f9-786222aa0e65/orig">
        <figcaption>Омлет с травами</figcaption>
      </figure>
      <p>В нашем меню всегда есть свежие, вкусные и полезные блюда.</p>?>

То есть в модуль не добавлены теги

<figure>
          <img src="https://avatars.mds.yandex.net/get-sbs-sd/403988/e6f459c3-8ada-44bf-a6c9...>
        </figure>

Помогите, пожалуйста, добавить, в модуле:
yandex_turbo_pages.inc

<?php

/**
 * Page callback: Generates an Yandex Turbo RSS
 *
 * @return string
 *   An XML formatted string.
 */
function yandex_turbo_page_rss()
{
    
$feeds      = array();
    
$settings   variable_get('yandex_turbo_node_types');
    
$node_types = !empty($settings) ? array_keys(array_filter($settings)) : array();
    
$orderBy    variable_get('yandex_turbo_order_by''created');
    
$order      variable_get('yandex_turbo_order''DESC');
    
$source     variable_get('yandex_turbo_body''value');

    if(

$node_types)
    {
        
$query db_select('node''n')
            ->
fields('n', array('nid''title''created'))
            ->
condition('status'NODE_PUBLISHED)
            ->
condition('type'$node_types'IN');

        

$query->leftJoin('field_data_body''d''(d.entity_id = n.nid AND d.entity_type = :node)', array(
            
':node' => 'node'
        
));

        

$query->addField('d''body_' $source'body');

        

$query->leftjoin('url_alias''ua''ua.source = CONCAT(:str, n.nid)', array(
            
':str'=>'node/'
        
));

        

$query->fields('ua', array('alias'));

        if(

'Yes' == variable_get('yandex_turbo_sticky''No'))
        {
            
$query->orderBy('n.sticky''DESC');
        }

        if(

'Yes' == variable_get('yandex_turbo_promoted''No'))
        {
            
$query->orderBy('n.promote''DESC');
        }

        

$query->orderBy('n.' $orderBy$order)
            ->
range(01000);

        

$query->where('d.body_' $source ' != :empty', array(':empty' => ''));

        

$feeds $query->execute()
            ->
fetchAllAssoc('nid'PDO::FETCH_ASSOC);
    }

    return 

theme('yandex_turbo_page_rss', array('feeds' => $feeds));
}

/**
 * Prints the RSS page for a feed.
 *
 * @param $variables
 *   An associative array containing:
 *   - feeds: An array of the feeds to theme.
 *
 * @return string
 *
 * @ingroup themeable
 */
function theme_yandex_turbo_page_rss($variables)
{
    
/**
     * Feed absolute link
     */
    
$rss_link url('yandex.turbo.rss', array('absolute' => TRUE));

    

/**
     * Feeds data
     *
     * @var array
     */
    
$feeds $variables['feeds'];

    

/**
     * Allowed HTMl tags
     * @see https://yandex.ru/support/webmaster/turbo/feed.html#rss-elements__item
     */
    
$allowed_tags = array(
        
'figure''h1''h2''p''br''ul''ol''li''b''strong''i''em''sup''sub',
        
'ins''del''small''big''pre''abbr''u''a''img''figcaption''video''header'
    
);

    

/**
     * Removes CDATA tag from content
     *
     * @var string
     */
    
$CDATA '/^\s*\/\/<!\[CDATA\[([\s\S]*)\/\/\]\]>\s*\z/';

    

/**
     * Items XML-string
     *
     * @var string
     */
    
$items '';

    

/**
     * @vat string
     */
    
$output '';

    

/**
     * Channel settings
     */
    
$site_name           variable_get('site_name''');
    
$site_slogan         variable_get('site_slogan''Site description');
    
$channel_title       variable_get('yandex_turbo_rss_title'$site_name);
    
$channel_description variable_get('yandex_turbo_rss_description'$site_slogan);
    
$channel_analytics   variable_get('yandex_turbo_rss_analytics_type',   'Yandex');
    
$max_item_images     intval(variable_get('yandex_turbo_rss_max_item_images''0'));
    
    if(!empty(
$feeds))
    {
        foreach (
$feeds as $nid => $node)
        {
            
$body strip_tags(trim($node['body']), '<'.implode('><',$allowed_tags).'>');
            
$body preg_replace$CDATA'$1'$body );

            

// Skip empty nodes
            
if(!$body) continue;
            
            
// Images limit
            
if ($max_item_images 0) {
                
$find_images 0;
                
$body preg_replace_callback ("/<img([^>]*)>/Us", function($matches) use (&$find_images$max_item_images) {
                     
$find_images++;
                     return (
$find_images <= $max_item_images) ? '<img' $matches[1] . '>' '';
                }, 
$body);
            }
            
            
// If the text is more than 400 characters, then Yandex requires you to arrange paragraphs, but we do from 350
            
$content_text strip_tags($body);
            if (
strlen($body) > 350) {
                
$body preg_replace('~(?:\r?\n){2,}~',"\n",$body);
                
$body explode("\n"$body);
                foreach (
$body as $line_key => $line_val) {
                    if (!
preg_match("/(\<p|\<br|\<ol|\<ul|\<li)/is"$line_val)) {
                        
$body$line_key ] .= '<br>';
                    }
                }
                
$body implode("\n"$body);
            }
            
            
// Make a headline
            
$body "<header><h1>".check_plain($node['title'])."</h1></header>" .$body;

            

// Link to node
            
$node_uri $node['alias'] ? $node['alias'] : 'node/' $nid;

            

$data = array(
                array(
                    
'key' => 'title',
                    
'value' => check_plain($node['title']),
                ),
                array(
                    
'key' => 'link',
                    
'value' => url$node_uri, array('absolute' => TRUE) ),
                ),

                array(
                    

'key' => 'pubDate',
                    
'value' => date(DateTime::RFC822$node['created']),
                ),
                array(
                    
'key' => 'turbo:content',
                    
'value' => '<![CDATA[' PHP_EOL $body PHP_EOL ']]>',
                    
'encoded' => TRUE,
                )
            );

            

$items .= format_xml_elements(array(
                array(
                    
'key'     => 'item',
                    
'value'   => PHP_EOL format_xml_elements($data),
                    
'encoded' => TRUE,
                    
'attributes' => array(
                        
'turbo' => 'true',
                    )
                )
            ));
        }

        

$body $node $node_uri $header $h1 null;
    }

    

drupal_add_http_header('Content-Type''application/rss+xml; charset=utf-8');
    
    
$cms_plugin format_xml_elements(array(
        array(
            
'key' => 'turbo:cms_plugin',
            
'value' => 'C2364A7B7F4160D5B2DC1718E3AE4970'
        
)
    ));
    
$items $cms_plugin $items;

    

$rss = array(
        
'key' => 'rss',
        
'value' => PHP_EOL format_rss_channel$channel_title$rss_link$channel_description$items ),
        
'encoded' => TRUE,
        
'attributes' => array(
            
'xmlns:yandex' => 'http://news.yandex.ru',
            
'xmlns:media' => 'http://search.yahoo.com/mrss/',
            
'xmlns:turbo' => 'http://search.yahoo.com/mrss/',
            
'version' => '2.0',
        ),
    );

    print 

"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
        
PHP_EOL
        
format_xml_elements( array( $rss ) );
}
?>

Лучший ответ

Комментарии

Аватар пользователя kovalevm kovalevm 27 сентября 2019 в 15:01

ivnish wrote:
Этот модуль не развивается. sas@drupal.org вроде писал свой

Спасибо, вот этот модуль https://github.com/alexsco74/csas_ytu
Вообще положил сайт:( Наверно большой лимит в 1000 записей установлен, хотя выделенный сервер, 512 Мб памяти.

Аватар пользователя kovalevm kovalevm 27 сентября 2019 в 15:39

Да, к сожалению, совсем не подошел модуль. При любом количестве записей вызывает ошибку 500 на сервере.

Аватар пользователя adano adano 27 сентября 2019 в 17:25

Если накликать, то https://www.drupal.org/project/views_data_export на сегодня - это наилучшее решение.

Тут есть мануал с костылями и г-кодом для Я.Маркета (у Турбо близкие параметры под rss, на свои поменяйте, а если товары для Турбо, то практически идентичны):
https://drupal-coder.ru/blog/vygruzka-yml-dla-andeksmarketa

P.S. А этот модуль нужно навсегда выпилить со страницы Яндекса, как "плагин" для Drupal:
https://yandex.ru/dev/turbo/

Аватар пользователя kovalevm kovalevm 27 сентября 2019 в 18:10

yandex_turbo в принципе рабочий модуль, с правильным синтаксисом, отвечающий полностью требованиям для турбо-страниц. Только нет вывода изображений.

Если кто-то решится добавить вывод изображений в код, буду благодарна.

Аватар пользователя adano adano 27 сентября 2019 в 18:27
1

Этот модуль загоняет вас в топорную структуру, где все данные должны быть в поле body, в том числе и картинки.
Если структура сделана по-человечески, хотя бы с минимальными возможностями Друпал, то этот модуль автоматом становится нерабочим... именно так, как указал Semantics.