Микроразметка Schema.Org типового решения TopShop для 1С-Битрикс


типовое решение TopShop и микроразметка Schema.OrgНедавно мне довелось поработать с довольно интересным типовым решением TopShop ( https://marketplace.1c-bitrix.ru/solutions/alexkova.emarket/) версии 1.6.60 по задаче микроразметки. В данной статье описана последовательность действий, которая позволит любому администратору/разработчику без особых усилий добавить поддержку микроразметки на свой сайт на базе данного решения с помощью моего модуля "Микроразметка Schema.org"


Статическая микроразметка

Адрес Организации и Хлебные крошки

Эти 2 типа микроразметки для большинства магазинов принимают на вход статические параметры и не меняются в зависимости от страницы. Вы просто настраиваете их один раз, размещаете на странице, во включаемой области или в шаблоне сайта и они работают так, как им и положено.

Итак, находим подходящее место (например сквозную включаемую область в подвале страницы с копирайтом) и открываем её на редактирование в режиме визуального редактора:

редактируем включаемую область копирайта в подвале сайта TopShop

Добавляем в режиме визуального редактора 2 компонента: Адрес и Хлебные крошки - перетащив их из правой панели списка в рабочую область мышью:

Добавляем в режиме визуального редактора 2 компонента: Адрес и Хлебные крошки

Двойной клик по иконке компонент в рабочем поле откроет его параметры (на примере компонента Адреса):

параметры компонента микроразметки Schema.Org Адреса в визуальном редакторе

Заполняем параметры обоих компонентов.

  • Спецификация и документация для Адреса (заполняем все поля, какие сочтём нужным. Кашу маслом не испортишь, как не испортишь сайт микроразметкой)
  • Документация для Хлебных крошек (ничего особенного, компонент выводит данные автоматически, нужно лишь проверить правильность формирования цепочки, которая генерируется на основе файловой структуры и данных от компонентов на странице).

Важно!
v.1.6.60 типового решения TopShop не содержит компонента хлебных крошек на главной, а некоторые компоненты добавляют запись в цепочку навигации, поэтому сразу после добавления компонента для микроразметки я получил длинную и некрасивую цепочку.
Проблема решается снятие галочек "Включать инфоблок в цепочку навигации":
Включать инфоблок в цепочку навигации

После настройки компонентов добавляем галочку "Не отображать на сайте":

параметр Не отображать на сайте

Она добавит компоненту параметр:

"SHOW" => "Y",

Это универсальный параметр, имеющийся у всех компонентом модуля "Микроразметка Schema.org". Значение Y говорит компоненту, что параметр не следует показывать обычным пользователям, но отдавать поисковым системам. Это позволяет вписать компонент в любой сайт без изменения его внешнего вида.

Микроразметка Адреса и Хлебных крошек готова.


Динамическая микроразметка

Динамическая разметка - это та, где нельзя 1 раз заполнить параметры и вывести данные вручную.

Например, карточка товара и информация о ценовом предложении - товаров на сайте интернет-магазина множество и они формируются автоматически на основании структуры инфоблока. А значит так же автоматически необходимо формировать и микроразметку.

Для этого потребуется внести небольшие изменения в шаблон компонента, отвечающего за вывод соответствующей информации в публичной части, т.е. выполнить функции Администратора/Разработчика.

Схема действий всегда будет одинаковой:

  1. Берём пустую страницу (например создаём её в административной разделе) и открываем в визуальном редакторе;
  2. Размещаем на странице компонент микроразметки (аналогично тому как выше сделано для Адреса);
  3. Заполняем те параметры, которые в дальнейшем будут нами использоваться в динамическом компоненте, статическими заглушками (например #NAME# для параметра с названием товара, #PRICE# для цены и т.д.);
  4. Переключаемся в режим исходного кода для получения кода вызова компонента с нашими заглушками (см скриншот ниже);
    код вызова компонента микроразметки в режиме php
  5. Находим шаблон компонента, отвечающего за вывод в публичной части той сущности, которую мы хотим разметить (например, детальной страницы товара), копируем его (иначе наша правка может быть затёрта при обновлении решения) и открываем копию для редактирования в режиме php;
  6. Выбираем место для вставки вызова нашего компонента;
  7. Заменяем заглушку (#NAME#, #PRICE# и т.д.) на переменные с данными, использующимися шаблоном (для изучения структуры массива с данными и выяснения названий ключей/переменных рекомендуется использовать конструкцию <? echo "<pre>"; print_r($arResult); echo "</pre>";?>).


Товары и Цены

Заходим в публичной части на страницу товара, авторизовавшись под Администратором.

Включаем режим правки.

Открываем список компонентов (с помощью стрелочки рядом с "шестерёнкой" открывающей параметры компонента):

параметры компонента каталог на детальной странице товара

Нас интересуют в первую очередь "Элемент каталога Детально" и "Каталог".

Однако мы видим, что для пункта "Элемент каталога Детально" нет возможности копирования или редактирования шаблона:

Элемент каталога Детально

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

А значит, нам придётся скопировать весь компонент целиком:

копируем шаблон компонента каталога

Я скопировал шакблок компонента в шаблон сайта "topshop_orange_flat" (это один из шаблонов TopShop, тот который был установлен при установке решения Мастером) и назвал его "template".

Теперь переходим в папку с шаблоном компонента (путь в ней будет /bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/ цветом я выделил название шаблона сайта и шаблона компонента, поскольку эти значения у вас могут отличаться, если вы выбрали другой шаблон или переименовали его иначе).

Если мы посмотрим содержимое файла /bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/element.php, отвечающего за вывод детальной страницы каталога (Элемента), то поймём что нас интересует компонент catalog.element в пространстве имён bitrix с дефолтным (пустота идентична .default) шаблоном. Искать его надлежит прямо в папке шаблона компонента каталога. И интересует нас в нём файл template.php (т.е. файл шаблона):

/bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/bitrix/catalog.element/.default/template.php

Добавляем в конце шаблона вызов компонента Товара (coffeediz:schema.org.Product) с указанием цены, заменив заглушки на переменные с ключами массивов, где хранятся данные:

<?$APPLICATION->IncludeComponent(
"coffeediz:schema.org.Product",
"",
Array(
"SHOW" => "Y",
"NAME" => $arResult['NAME'],
"DESCRIPTION" => $arResult['DETAIL_TEXT'],
"PRICE" => $arResult['CATALOG_PRICE_1'],
"PRICECURRENCY" => $arResult['CATALOG_CURRENCY_1'],
"ITEMAVAILABILITY" => "InStock",
"ITEMCONDITION" => "NewCondition",
"PAYMENTMETHOD" => array("VISA", "MasterCard", "Cash"),
"PARAM_RATING_SHOW" => "Y",
)
);?>

Обратите внимание, что мы задали фиксированными для всех товаров только 3 величины: Состояние, Наличие и Способы оплаты. Компонент элемента каталога не оперирует ими.

Так же мы не задали значение рейтинга (надо было бы знать не только значение, но и число голосов), поскольку на момент написания статьи этот функционал в решении работал некорректно, а обновление было в стадии "Бета версии".


Изображения (товаров)

Поскольку мы уже нашли шаблон детальной страницы товара (и даже скопировали его и внесли правку на этапе работы с товарами и ценами), то мы теперь уже знаем, что нам нужен /bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/bitrix/catalog.element/.default/template.php.

Внимательно изучив шаблон мы видим цикл в котором выводится массив фотографий:

<?if (is_array($firstPhoto)):?>
<a href="<?=$firstPhoto["SRC"]?>"  rel="emarket-gallery">
<img id="i0" src="<?=$firstPhoto["SRC"]?>" alt="<?=$arResult["NAME"]?>" class="inslider zoom-img" 
                                                     data-state="show" data-large="<?=$firstPhoto["SRC"]?>" data-text-bottom="<?=$arResult["NAME"]?>">
                                        </a>
<?else:?>
<img src="<?=$arResult["DEFAULT_PICTURE"]["SRC"]?>" alt=" ">
<?endif;?>
<?if (count($arResult["MORE_PHOTO"]) > 0):?>
<?foreach($arResult["MORE_PHOTO"] as $cell=>$photo):?>
                                        <?if ($cell == 0) {
                                            continue;
                                        }?>
<a href="<?=$photo["SRC"]?>" rel="emarket-gallery"><img id="i<?=$cell?>" src="<?=$photo["SRC"]?>" class="inslider inslider-hide zoom-img" alt="<?=$arResult["NAME"]."_".$cell?>" 
                                                                                                                data-state="hide"  data-large="<?=$photo["SRC"]?>" data-text-bottom="<?=$arResult["NAME"]."_".$cell?>" ></a>
<?endforeach;?>
<?endif;?>

Суть этого кода сводится к проверке есть ли дополнительные фото. Если их нет, то выводится только 1 карточка детального фото. А если есть, то ещё набор плиток ниже, позволяющий просмотреть остальные фотографии товара.

Воспользуемся спецификацией компонента Изображение для задания максимально детальной микроразметки.

Добавим в шаблон (в 2 местах для 1 фото и для остальных) вызов компонента coffeediz:schema.org.ImageObject с минимальным набором параметров:

<?$APPLICATION->IncludeComponent(
"coffeediz:schema.org.ImageObject",
"",
Array(
"COMPONENT_TEMPLATE" => ".default",
"SHOW" => "Y",
"CONTENTURL" => $firstPhoto["SRC"],
"NAME" => $arResult["NAME"],
"CAPTION" => $arResult["NAME"],
"DESCRIPTION" => $arResult['DETAIL_TEXT'],
"HEIGHT" => "",
"WIDTH" => "",
"TRUMBNAIL_CONTENTURL" => "",
"ITEMPROP" => "",
"REPRESENTATIVEOFPAGE" => "True",
"PARAM_RATING_SHOW" => "N"
)
);?>

Свернуть/Развернуть ИТОГОВЫЙ код шаблона компонента (с микроразметкой изображений и товаров)


Новости и Статьи

Решение TopShop содержит 2 раздела с текстовым контентом:

  • /company/news/
  • /company/press/

Оба раздела используют один и тот же комплексный компонент bitrix:news с одним и тем же шаблоном emarket_news (для вывода детальной страницы используется bitrix:news.detail с дефолтным компонентом в составе комлексного).

Копируем шаблон комплексного компонента в наш шаблон сайта "topshop_orange_flat", переименовывая в "emarket_news_schema" на одной из страниц (например на новостной).

Применяем этот же шаблон для компонента на второй странице (чтобы разметить сразу оба раздела).

Переходим к редактированию шаблона детальной страницы новости в комплексном шаблоне компонента:

/bitrix/templates/topshop_orange_flat/components/bitrix/news/emarket_news_schema/bitrix/news.detail/.default/template.php

Воспользуемся спецификацией компонента Статья для максимально детальной микроразметки.

Добавляем туда вызов компонента Статья:

<?$APPLICATION->IncludeComponent(
"coffeediz:schema.org.Article",
"",
Array(
"COMPONENT_TEMPLATE" => ".default",
"SHOW" => "Y",
"TYPE" => "",
"LEARNING_RESOURCE_TYPE" => "",
"NAME" => $arResult["NAME"],
"ARTICLEBODY" => $arResult["DETAIL_TEXT"],
"ABOUT" => $arResult["PREVIEW_TEXT"],
"GENRE" => "",
"ARTICLE_SECTION" => array($arResult["SECTION"]["NAME"], ""),
"KEYWORDS" => array(""),
"IN_LANGUAGE" => "ru",
"DATA_PUBLISHED" => $arResult["DISPLAY_ACTIVE_FROM"],
"AUTHOR_TYPE" => "",
"IMAGEURL" => "",
"PARAM_RATING_SHOW" => "N"
)
);?>

Так же отредактируем параметры компонента на обеих страницах. Нас интересует параметр "Формат показа даты" раздела "Настройки Детального Просмотра". Поскольку дата в публичной части у нас всё равно не выводится, мы приведём её к формату ГГГГ-ММ-ДД, который должен быть у этого поля согласно спецификации Schema.Org:

задание даты в ISO 8601 микроразметки Schema.Org компонента детальной страницы Новостей или Статей

Обращаем внимание читателя, что семантически вернее было бы создать у комплексного компонента новый параметр "Тип публикации" со значениями Статья/Новость и передать этот тип из комплексного компонента новостей, в детальную страницу, а оттуда компоненту микроразметки.

Это позволило бы семантически вернее обозначить тип контента (однако в настоящий момент нет чёрткой информации о том какие преимущества бы это дало, поэтому мы воздержались от ещё одной правки чужого шаблона).

К сожалению, в решении TopShop не используется ни автор, ни рейтинг для статей/новостей, поэтому мы не использовали эту микроразметку (Хотя спецификация компонент и позволяет, так что небольшая дополнительная правка легко и просто обогатила бы ваш поисковый сниппет)


Итоги

Мы успешно добавили микроразметку Schema.Org на сайт, созданный на типовом решении TopShop, постратив на это менее часа.

В рамках задачи было добавлено 5 типов микроразметки:

  • schema.org/Organization - Адрес организации
  • schema.org/ImageObject - Изображение (для товаров)
  • schema.org/Product - Продукт (с ценой для товаров)
  • schema.org/Article - Статья (для Статей и Новостей)
  • Data-Vocabulary.org/Breadcrumb - Хлебные крошки

До 4 типов теперь могут встречаться на 1 странице:

Результаты валидации страницы с 4 видами Микроразметки с помощью модуля Микроразметка Schema.org для 1С-Битрикс

А это значительно увеличит шансы на интересный и привлекательный поисковый сниппет для сайта!


Задойный А.В.


Микроразметка Schema.Org типового решения TopShop для 1С-Битрикс

<p class="" style="text-align: left;"> <img width="148" alt="типовое решение TopShop и микроразметка Schema.Org" src="/upload/medialibrary/275/27563680de007769be0da2b35732b23a.png" height="79" style="margin-right: 10px;" title="типовое решение TopShop и микроразметка Schema.Org" align="left">Недавно мне довелось поработать с довольно интересным типовым решением TopShop ( <!--noindex--><a href="https://marketplace.1c-bitrix.ru/solutions/alexkova.emarket/" rel="nofollow" target="_blank">https://marketplace.1c-bitrix.ru/solutions/alexkova.emarket/</a><!--/noindex-->) версии 1.6.60 по задаче микроразметки. В данной статье описана последовательность действий, которая позволит любому администратору/разработчику без особых усилий добавить поддержку микроразметки на свой сайт на базе данного решения с помощью моего модуля "Микроразметка Schema.org" </p> <p class="" style="text-align: left;"> <br> </p> <h2 style="text-align: left;">Статическая микроразметка</h2> <h3 style="text-align: left;"> Адрес Организации и Хлебные крошки </h3> <p class="" style="text-align: left;"> Эти 2 типа микроразметки для большинства магазинов принимают на вход статические параметры и не меняются в зависимости от страницы. Вы просто настраиваете их один раз, размещаете на странице, во включаемой области или в шаблоне сайта и они работают так, как им и положено. </p> <p class="" style="text-align: left;"> Итак, находим подходящее место (например сквозную включаемую область в подвале страницы с копирайтом) и открываем её на редактирование в режиме визуального редактора: </p> <p class="" style="text-align: left;"> <img width="514" alt="редактируем включаемую область копирайта в подвале сайта TopShop" src="/upload/medialibrary/6b4/6b4ee9da5b5c97cbbbf3f4201d9747ab.png" height="152" title="редактируем включаемую область копирайта в подвале сайта TopShop"><br> </p> <p class="" style="text-align: left;"> Добавляем в режиме визуального редактора 2 компонента: Адрес и Хлебные крошки - перетащив их из правой панели списка в рабочую область мышью: </p> <p class="" style="text-align: left;"> <img width="900" alt="Добавляем в режиме визуального редактора 2 компонента: Адрес и Хлебные крошки" src="/upload/medialibrary/f9e/f9e8a5bb161398270e61850a329c280a.png" height="715" title="Добавляем в режиме визуального редактора 2 компонента: Адрес и Хлебные крошки"><br> </p> <p class="" style="text-align: left;"> Двойной клик по иконке компонент в рабочем поле откроет его параметры (на примере компонента Адреса): </p> <p class="" style="text-align: left;"> <img width="900" alt="параметры компонента микроразметки Schema.Org Адреса в визуальном редакторе" src="/upload/medialibrary/bb0/bb084d98c2255a0005fb23a7fc559194.png" height="715" title="параметры компонента микроразметки Schema.Org Адреса в визуальном редакторе"><br> </p> <p class="" style="text-align: left;"> Заполняем параметры обоих компонентов. </p> <p class="" style="text-align: left;"> </p> <ul> <li style="text-align: left;"> <a href="/information/about_microcathode_say_a_word_how_to_implement_microcathode_module_coffeediz_schema_on_the_website_u/#OrganizationAndPlace">Спецификация и документация для Адреса</a> (заполняем все поля, какие сочтём нужным. Кашу маслом не испортишь, как не испортишь сайт микроразметкой) </li> <li style="text-align: left;"> <a href="/information/about_microcathode_say_a_word_how_to_implement_microcathode_module_coffeediz_schema_on_the_website_u/#breadcrumb">Документация для Хлебных крошек</a> (ничего особенного, компонент выводит данные автоматически, нужно лишь проверить правильность формирования цепочки, которая генерируется на основе файловой структуры и данных от компонентов на странице). </li> </ul> <p class="" style="text-align: left;"> </p> <table border="1" cellpadding="5" class=""> <tbody> <tr> <td> <b><span style="color: #ff0000;">Важно!</span></b><br> v.1.6.60 типового решения TopShop не содержит компонента хлебных крошек на главной, а некоторые компоненты добавляют запись в цепочку навигации, поэтому сразу после добавления компонента для микроразметки я получил длинную и некрасивую цепочку. <br> Проблема решается снятие галочек "Включать инфоблок в цепочку навигации":<br> <img width="232" alt="Включать инфоблок в цепочку навигации" src="/upload/medialibrary/d52/d5279328ae2329248a124b7affa9e398.png" height="37" title="Включать инфоблок в цепочку навигации"><br> <br> </td> </tr> </tbody> </table> <p class="" style="text-align: left;"> После настройки компонентов добавляем галочку "Не отображать на сайте": </p> <p class="" style="text-align: left;"> <img width="207" alt="параметр Не отображать на сайте" src="/upload/medialibrary/6c6/6c67b3dc885fdbe07744f502c8f596ab.png" height="35" title="параметр Не отображать на сайте"><br> </p> <p class="" style="text-align: left;"> Она добавит компоненту параметр: </p> <code> "SHOW" =&gt; "Y",</code> <p class="" style="text-align: left;"> Это универсальный параметр, имеющийся у всех компонентом модуля "Микроразметка Schema.org". Значение Y говорит компоненту, что параметр не следует показывать обычным пользователям, но отдавать поисковым системам. Это позволяет вписать компонент в любой сайт без изменения его внешнего вида. </p> <p class="" style="text-align: left;"> Микроразметка Адреса и Хлебных крошек готова. </p> <p class="" style="text-align: left;"> <br> </p> <h2 style="text-align: left;">Динамическая микроразметка</h2> <p class="" style="text-align: left;"> Динамическая разметка - это та, где нельзя 1 раз заполнить параметры и вывести данные вручную. </p> <p class="" style="text-align: left;"> Например, карточка товара и информация о ценовом предложении - товаров на сайте интернет-магазина множество и они формируются автоматически на основании структуры инфоблока. А значит так же автоматически необходимо формировать и микроразметку. </p> <p class="" style="text-align: left;"> Для этого потребуется внести небольшие изменения в шаблон компонента, отвечающего за вывод соответствующей информации в публичной части, т.е. выполнить функции Администратора/Разработчика. </p> <p class="" style="text-align: left;"> <b>Схема действий всегда будет одинаковой:</b> </p> <ol> <li style="text-align: left;"> Берём пустую страницу (например создаём её в административной разделе) и открываем в визуальном редакторе;</li> <li style="text-align: left;"> Размещаем на странице компонент микроразметки (аналогично тому как выше сделано для Адреса);</li> <li style="text-align: left;"> Заполняем те параметры, которые в дальнейшем будут нами использоваться в динамическом компоненте, статическими заглушками (например #NAME# для параметра с названием товара, #PRICE# для цены и т.д.);</li> <li style="text-align: left;"> Переключаемся в режим исходного кода для получения кода вызова компонента с нашими заглушками (<i>см скриншот ниже</i>); <br> <img width="772" alt="код вызова компонента микроразметки в режиме php" src="/upload/medialibrary/732/7321ba70fdcc9335d935806be427f3ed.png" height="675" title="код вызова компонента микроразметки в режиме php"></li> <li style="text-align: left;"> Находим шаблон компонента, отвечающего за вывод в публичной части той сущности, которую мы хотим разметить (например, детальной страницы товара), <b>копируем его</b> (иначе наша правка может быть затёрта при обновлении решения) и открываем копию для редактирования в режиме php;</li> <li style="text-align: left;"> Выбираем место для вставки вызова нашего компонента;</li> <li style="text-align: left;"> Заменяем заглушку (#NAME#, #PRICE# и т.д.) на переменные с данными, использующимися шаблоном (для изучения структуры массива с данными и выяснения названий ключей/переменных рекомендуется использовать конструкцию <code>&lt;? echo "&lt;pre&gt;"; print_r($arResult); echo "&lt;/pre&gt;";?&gt;</code>).</li> </ol> <p class="" style="text-align: left;"> </p> <p class="" style="text-align: left;"> <br> </p> <h3 style="text-align: left;">Товары и Цены</h3> <p class="" style="text-align: left;"> Заходим в публичной части на страницу товара, авторизовавшись под Администратором. </p> <p class="" style="text-align: left;"> Включаем режим правки. </p> <p class="" style="text-align: left;"> Открываем список компонентов (с помощью стрелочки рядом с "шестерёнкой" открывающей параметры компонента): </p> <p class="" style="text-align: left;"> <img width="406" alt="параметры компонента каталог на детальной странице товара" src="/upload/medialibrary/285/285f4a49327be2f4b1dbb9c19024e2eb.png" height="376" title="параметры компонента каталог на детальной странице товара"><br> </p> <p class="" style="text-align: left;"> Нас интересуют в первую очередь "Элемент каталога Детально" и "Каталог". </p> <p class="" style="text-align: left;"> Однако мы видим, что для пункта "Элемент каталога Детально" нет возможности копирования или редактирования шаблона: </p> <p class="" style="text-align: left;"> <img width="595" alt="Элемент каталога Детально" src="/upload/medialibrary/ad0/ad019668a3c77014a7f26f2d391a3811.png" height="328" title="Элемент каталога Детально"><br> </p> <p class="" style="text-align: left;"> Это говорит о том, что наш компонент каталога - комплексный и не использует отдельные самостоятельные компоненты детальной. </p> <p class="" style="text-align: left;"> А значит, нам придётся скопировать весь компонент целиком: </p> <p class="" style="text-align: left;"> <img width="651" alt="копируем шаблон компонента каталога" src="/upload/medialibrary/d15/d15a026925f6efab345b9c57247e9c4b.png" height="310" title="копируем шаблон компонента каталога"><br> </p> <p class="" style="text-align: left;"> Я скопировал шакблок компонента в шаблон сайта "<span style="background-color: #f7941d;">topshop_orange_flat</span>" (это один из шаблонов TopShop, тот который был установлен при установке решения Мастером) и назвал его "<span style="background-color: #81ca9d;">template</span>". </p> <p class="" style="text-align: left;"> Теперь переходим в папку с шаблоном компонента (путь в ней будет /bitrix/templates/<span style="background-color: #f7941d;">topshop_orange_flat</span>/components/alexkova.emarket/catalog/<span style="background-color: #81ca9d;">template</span>/ цветом я выделил название шаблона сайта и шаблона компонента, поскольку эти значения у вас могут отличаться, если вы выбрали другой шаблон или переименовали его иначе). </p> <p class="" style="text-align: left;"> Если мы посмотрим содержимое файла /bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/element.php, отвечающего за вывод детальной страницы каталога (Элемента), то поймём что нас интересует компонент catalog.element в пространстве имён bitrix с дефолтным (пустота идентична .default) шаблоном. Искать его надлежит прямо в папке шаблона компонента каталога. И интересует нас в нём файл template.php (т.е. файл шаблона): </p> <p class="" style="text-align: left;"> /bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/bitrix/catalog.element/.default/template.php </p> <p class="" style="text-align: left;"> Добавляем в конце шаблона вызов компонента Товара (coffeediz:schema.org.Product) с указанием цены, заменив заглушки на переменные с ключами массивов, где хранятся данные: </p> <code>&lt;?$APPLICATION-&gt;IncludeComponent(<br> "coffeediz:schema.org.Product",<br> "",<br> Array(<br> "SHOW" =&gt; "Y",<br> "NAME" =&gt; $arResult['NAME'],<br> "DESCRIPTION" =&gt; $arResult['DETAIL_TEXT'],<br> "PRICE" =&gt; $arResult['CATALOG_PRICE_1'],<br> "PRICECURRENCY" =&gt; $arResult['CATALOG_CURRENCY_1'],<br> "ITEMAVAILABILITY" =&gt; "InStock",<br> "ITEMCONDITION" =&gt; "NewCondition",<br> "PAYMENTMETHOD" =&gt; array("VISA", "MasterCard", "Cash"),<br> "PARAM_RATING_SHOW" =&gt; "Y",<br> )<br> );?&gt;</code> <p class="" style="text-align: left;"> Обратите внимание, что мы задали фиксированными для всех товаров только 3 величины: Состояние, Наличие и Способы оплаты. Компонент элемента каталога не оперирует ими. </p> <p class="" style="text-align: left;"> Так же мы не задали значение рейтинга (надо было бы знать не только значение, но и число голосов), поскольку на момент написания статьи этот функционал в решении работал некорректно, а обновление было в стадии "Бета версии". </p> <p class="" style="text-align: left;"> <br> </p> <h3 style="text-align: left;"> Изображения (товаров) </h3> <p class="" style="text-align: left;"> Поскольку мы уже нашли шаблон детальной страницы товара (и даже скопировали его и внесли правку на этапе работы с товарами и ценами), то мы теперь уже знаем, что нам нужен /bitrix/templates/topshop_orange_flat/components/alexkova.emarket/catalog/template/bitrix/catalog.element/.default/template.php. </p> <p class="" style="text-align: left;"> Внимательно изучив шаблон мы видим цикл в котором выводится массив фотографий: </p> <code> &lt;?if (is_array($firstPhoto)):?&gt;<br> &lt;a href="&lt;?=$firstPhoto["SRC"]?&gt;"  rel="emarket-gallery"&gt;<br> &lt;img id="i0" src="&lt;?=$firstPhoto["SRC"]?&gt;" alt="&lt;?=$arResult["NAME"]?&gt;" class="inslider zoom-img" <br>                                                      data-state="show" data-large="&lt;?=$firstPhoto["SRC"]?&gt;" data-text-bottom="&lt;?=$arResult["NAME"]?&gt;"&gt;<br>                                         &lt;/a&gt;<br> &lt;?else:?&gt;<br> &lt;img src="&lt;?=$arResult["DEFAULT_PICTURE"]["SRC"]?&gt;" alt=" "&gt;<br> &lt;?endif;?&gt;<br> &lt;?if (count($arResult["MORE_PHOTO"]) &gt; 0):?&gt;<br> &lt;?foreach($arResult["MORE_PHOTO"] as $cell=&gt;$photo):?&gt;<br>                                         &lt;?if ($cell == 0) {<br>                                             continue;<br>                                         }?&gt;<br> &lt;a href="&lt;?=$photo["SRC"]?&gt;" rel="emarket-gallery"&gt;&lt;img id="i&lt;?=$cell?&gt;" src="&lt;?=$photo["SRC"]?&gt;" class="inslider inslider-hide zoom-img" alt="&lt;?=$arResult["NAME"]."_".$cell?&gt;" <br>                                                                                                                 data-state="hide"  data-large="&lt;?=$photo["SRC"]?&gt;" data-text-bottom="&lt;?=$arResult["NAME"]."_".$cell?&gt;" &gt;&lt;/a&gt;<br> &lt;?endforeach;?&gt;<br> &lt;?endif;?&gt;</code> <p class="" style="text-align: left;"> Суть этого кода сводится к проверке есть ли дополнительные фото. Если их нет, то выводится только 1 карточка детального фото. А если есть, то ещё набор плиток ниже, позволяющий просмотреть остальные фотографии товара. </p><p class="" style="text-align: left;">Воспользуемся <b><a href="/information/microdesmidae_module_coffeediz_schema_for_1c_bitrix_part_2_rating_images_program/#ImageObject">спецификацией компонента Изображение</a></b> для задания максимально детальной микроразметки.</p> <p class="" style="text-align: left;"> Добавим в шаблон (в 2 местах для 1 фото и для остальных) вызов компонента coffeediz:schema.org.ImageObject с минимальным набором параметров: </p> <code>&lt;?$APPLICATION-&gt;IncludeComponent(<br> "coffeediz:schema.org.ImageObject",<br> "",<br> Array(<br> "COMPONENT_TEMPLATE" =&gt; ".default",<br> "SHOW" =&gt; "Y",<br> "CONTENTURL" =&gt; $firstPhoto["SRC"],<br> "NAME" =&gt; $arResult["NAME"],<br> "CAPTION" =&gt; $arResult["NAME"],<br> "DESCRIPTION" =&gt; $arResult['DETAIL_TEXT'],<br> "HEIGHT" =&gt; "",<br> "WIDTH" =&gt; "",<br> "TRUMBNAIL_CONTENTURL" =&gt; "",<br> "ITEMPROP" =&gt; "",<br> "REPRESENTATIVEOFPAGE" =&gt; "True",<br> "PARAM_RATING_SHOW" =&gt; "N"<br> )<br> );?&gt;</code> <p> <a onclick="$('#spoiler_1').slideToggle('slow');" href="javascript://">Свернуть/Развернуть ИТОГОВЫЙ код шаблона компонента (с микроразметкой изображений и товаров)</a> </p> <div style="border: 1px dashed; padding: 10px; display: none;" id="spoiler_1"> <code class="PHP"> &lt;?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();<br>/** @var array $arParams */<br>/** @var array $arResult */<br>/** @global CMain $APPLICATION */<br>/** @global CUser $USER */<br>/** @global CDatabase $DB */<br>/** @var CBitrixComponentTemplate $this */<br>/** @var string $templateName */<br>/** @var string $templateFile */<br>/** @var string $templateFolder */<br>/** @var string $componentPath */<br>/** @var CBitrixComponent $component */<br>$this-&gt;setFrameMode(true);<br><br>//unset($arResult["MORE_PHOTO"]);<br>global $moreSettings;<br>//echo "&lt;pre&gt;34"; print_r($arParams); echo "&lt;/pre&gt;";<br>//echo "&lt;pre&gt;34"; print_r($arResult); echo "&lt;/pre&gt;";<br>//echo "&lt;pre&gt;34"; print_r($arResult["OFFERS"]); echo "&lt;/pre&gt;";<br><br>$templateData = array(<br> 'TEMPLATE_THEME' =&gt; $this-&gt;GetFolder().'/themes/'.$arParams['TEMPLATE_THEME'].'/style.css',<br> 'TEMPLATE_CLASS' =&gt; 'bx_'.$arParams['TEMPLATE_THEME']<br>);<br><br>$strMainID = $this-&gt;GetEditAreaId($arResult['ID']);<br>$arItemIDs = array(<br> 'ID' =&gt; $strMainID,<br> 'PICT' =&gt; $strMainID.'_pict',<br> 'DISCOUNT_PICT_ID' =&gt; $strMainID.'_dsc_pict',<br> 'STICKER_ID' =&gt; $strMainID.'_sticker',<br> 'BIG_SLIDER_ID' =&gt; $strMainID.'_big_slider',<br> 'BIG_IMG_CONT_ID' =&gt; $strMainID.'_bigimg_cont',<br> 'SLIDER_CONT_ID' =&gt; $strMainID.'_slider_cont',<br> 'SLIDER_LIST' =&gt; $strMainID.'_slider_list',<br> 'SLIDER_LEFT' =&gt; $strMainID.'_slider_left',<br> 'SLIDER_RIGHT' =&gt; $strMainID.'_slider_right',<br> 'OLD_PRICE' =&gt; $strMainID.'_old_price',<br> 'PRICE' =&gt; $strMainID.'_price',<br> 'DISCOUNT_PRICE' =&gt; $strMainID.'_price_discount',<br> 'SLIDER_CONT_OF_ID' =&gt; $strMainID.'_slider_cont_',<br> 'SLIDER_LIST_OF_ID' =&gt; $strMainID.'_slider_list_',<br> 'SLIDER_LEFT_OF_ID' =&gt; $strMainID.'_slider_left_',<br> 'SLIDER_RIGHT_OF_ID' =&gt; $strMainID.'_slider_right_',<br> 'QUANTITY' =&gt; $strMainID.'_quantity',<br> 'QUANTITY_DOWN' =&gt; $strMainID.'_quant_down',<br> 'QUANTITY_UP' =&gt; $strMainID.'_quant_up',<br> 'QUANTITY_MEASURE' =&gt; $strMainID.'_quant_measure',<br> 'QUANTITY_LIMIT' =&gt; $strMainID.'_quant_limit',<br> 'BUY_LINK' =&gt; $strMainID.'_buy_link',<br> 'ADD_BASKET_LINK' =&gt; $strMainID.'_add_basket_link',<br> 'COMPARE_LINK' =&gt; $strMainID.'_compare_link',<br> 'PROP' =&gt; $strMainID.'_prop_',<br> 'PROP_DIV' =&gt; $strMainID.'_skudiv',<br> 'DISPLAY_PROP_DIV' =&gt; $strMainID.'_sku_prop',<br> 'OFFER_GROUP' =&gt; $strMainID.'_set_group_',<br> 'BASKET_PROP_DIV' =&gt; $strMainID.'_basket_prop',<br>);<br>$strObName = 'ob'.preg_replace("/[^a-zA-Z0-9_]/", "x", $strMainID);<br>$templateData['JS_OBJ'] = $strObName;<br><br>$strTitle = (<br> isset($arResult["IPROPERTY_VALUES"]["ELEMENT_DETAIL_PICTURE_FILE_TITLE"]) &amp;&amp; '' != $arResult["IPROPERTY_VALUES"]["ELEMENT_DETAIL_PICTURE_FILE_TITLE"]<br> ? $arResult["IPROPERTY_VALUES"]["ELEMENT_DETAIL_PICTURE_FILE_TITLE"]<br> : $arResult['NAME']<br>);<br>$strAlt = (<br> isset($arResult["IPROPERTY_VALUES"]["ELEMENT_DETAIL_PICTURE_FILE_ALT"]) &amp;&amp; '' != $arResult["IPROPERTY_VALUES"]["ELEMENT_DETAIL_PICTURE_FILE_ALT"]<br> ? $arResult["IPROPERTY_VALUES"]["ELEMENT_DETAIL_PICTURE_FILE_ALT"]<br> : $arResult['NAME']<br>);<br><br>$useVoteRating = ('Y' == $arParams['USE_VOTE_RATING']);<br>$boolDiscountShow = (0 &lt; $arResult['MIN_PRICE']['DISCOUNT_DIFF']);<br><br>?&gt;<br><br>&lt;div class="container" id="&lt;? echo $arItemIDs['ID']; ?&gt;"&gt;<br><br> &lt;div class="emarket-cart-left-column  xs-span_5_of_5"&gt;<br> &lt;ul class="emarket-top-link  xs-hide sm-hide"&gt;<br> &lt;?if (count($arResult["OFFERS"])&gt;0):?&gt;<br> &lt;li&gt;&lt;a href="#detail" data-scroll="emarket-offers"&gt;&lt;?=GetMessage('CATALOG_OFFERS')?&gt;&lt;/a&gt;&lt;/li&gt;<br> &lt;?endif;?&gt;<br><br> &lt;li&gt;&lt;a href="#detail" data-scroll="emarket-description"&gt;&lt;?=GetMessage('CATALOG_DESCRIPTION')?&gt;&lt;/a&gt;&lt;/li&gt;<br><br> &lt;?if (count($arResult["DISPLAY_PROPERTIES"])&gt;0):?&gt;<br> &lt;li&gt;&lt;a href="#detail" data-scroll="emarket-props"&gt;&lt;?=GetMessage('CATALOG_PROPS')?&gt;&lt;/a&gt;&lt;/li&gt;<br> &lt;?endif;?&gt;<br><br> &lt;?if ('Y' == $arParams['USE_COMMENTS']):?&gt;<br> &lt;li&gt;&lt;a href="#detail" data-scroll="emarket-comments"&gt;&lt;?=GetMessage('CATALOG_COMMENTS')?&gt;&lt;/a&gt;&lt;/li&gt;<br> &lt;?endif?&gt;<br> &lt;?if ($moreSettings["USE_STORE_FLAG"]):?&gt;<br> &lt;li&gt;&lt;a href="#detail" data-scroll="emarket-stores"&gt;&lt;?=GetMessage('CT_BCE_CATALOG_BTN_MESSAGE_USE_STORE')?&gt;&lt;/a&gt;&lt;/li&gt;<br> &lt;?endif;?&gt;<br><br> &lt;?if (isset($arResult["PROPERTIES"]["ACCESSORIES"]) &amp;&amp; !empty($arResult["PROPERTIES"]["ACCESSORIES"]["VALUE"])&gt;0):?&gt;<br> &lt;li&gt;&lt;a href="#accessories" data-scroll="accessories"&gt;&lt;?=GetMessage('ACCESSORIES_TITLE')?&gt;&lt;/a&gt;&lt;/li&gt;<br> &lt;?endif;?&gt;<br><br> &lt;/ul&gt;<br> &lt;div class="clear"&gt;&lt;/div&gt;<br><br> &lt;?<br> $firstPhoto = false;<br> if (is_array($arResult["DETAIL_PICTURE"])){<br> $firstPhoto = $arResult["DETAIL_PICTURE"];<br> }<br> elseif(count($arResult["MORE_PHOTO"]) &gt; 0){<br> $firstPhoto = $arResult["MORE_PHOTO"][0];<br> }<br> ?&gt;<br><br> &lt;div class="emarket_slider"&gt;<br> &lt;div id="emarket_big_photo"&gt;<br> &lt;?if (is_array($firstPhoto)):?&gt;<br> &lt;a href="&lt;?=$firstPhoto["SRC"]?&gt;"  rel="emarket-gallery"&gt;<br> &lt;img id="i0" src="&lt;?=$firstPhoto["SRC"]?&gt;" alt="&lt;?=$arResult["NAME"]?&gt;" class="inslider zoom-img" <br>                                                     data-state="show" data-large="&lt;?=$firstPhoto["SRC"]?&gt;" data-text-bottom="&lt;?=$arResult["NAME"]?&gt;"&gt;<br>                                        &lt;/a&gt;<br> &lt;?$APPLICATION-&gt;IncludeComponent(<br> "coffeediz:schema.org.ImageObject",<br> "",<br> Array(<br> "COMPONENT_TEMPLATE" =&gt; ".default",<br> "SHOW" =&gt; "Y",<br> "CONTENTURL" =&gt; $firstPhoto["SRC"],<br> "NAME" =&gt; $arResult["NAME"],<br> "CAPTION" =&gt; $arResult["NAME"],<br> "DESCRIPTION" =&gt; $arResult['DETAIL_TEXT'],<br> "HEIGHT" =&gt; "",<br> "WIDTH" =&gt; "",<br> "TRUMBNAIL_CONTENTURL" =&gt; "",<br> "ITEMPROP" =&gt; "",<br> "REPRESENTATIVEOFPAGE" =&gt; "True",<br> "PARAM_RATING_SHOW" =&gt; "N"<br> )<br> );?&gt;<br> &lt;?else:?&gt;<br> &lt;img src="&lt;?=$arResult["DEFAULT_PICTURE"]["SRC"]?&gt;" alt=" "&gt;<br> &lt;?endif;?&gt;<br> &lt;?if (count($arResult["MORE_PHOTO"]) &gt; 0):?&gt;<br> &lt;?foreach($arResult["MORE_PHOTO"] as $cell=&gt;$photo):?&gt;<br>                                        &lt;?if ($cell == 0) {<br>                                            continue;<br>                                        }?&gt;<br> &lt;a href="&lt;?=$photo["SRC"]?&gt;" rel="emarket-gallery"&gt;&lt;img id="i&lt;?=$cell?&gt;" src="&lt;?=$photo["SRC"]?&gt;" class="inslider inslider-hide zoom-img" alt="&lt;?=$arResult["NAME"]."_".$cell?&gt;" <br>                                                                                                                data-state="hide"  data-large="&lt;?=$photo["SRC"]?&gt;" data-text-bottom="&lt;?=$arResult["NAME"]."_".$cell?&gt;" &gt;&lt;/a&gt;<br> &lt;?$APPLICATION-&gt;IncludeComponent(<br> "coffeediz:schema.org.ImageObject",<br> "",<br> Array(<br> "COMPONENT_TEMPLATE" =&gt; ".default",<br> "SHOW" =&gt; "Y",<br> "CONTENTURL" =&gt; $photo["SRC"],<br> "NAME" =&gt; $arResult["NAME"]."_".$cell,<br> "CAPTION" =&gt; $arResult["NAME"]."_".$cell,<br> "DESCRIPTION" =&gt; $arResult['DETAIL_TEXT'],<br> "HEIGHT" =&gt; "",<br> "WIDTH" =&gt; "",<br> "TRUMBNAIL_CONTENTURL" =&gt; "",<br> "ITEMPROP" =&gt; "",<br> "REPRESENTATIVEOFPAGE" =&gt; "True",<br> "PARAM_RATING_SHOW" =&gt; "N"<br> )<br> );?&gt;<br> &lt;?endforeach;?&gt;<br> &lt;?endif;?&gt;<br> &lt;?if (count($arResult["MORE_PHOTO"]) &gt; 0):?&gt;<br> &lt;input type="button" class='list-slide-button-prev' id="c_bigphotos_prev"  data-fix="c_photos" value=" "&gt;<br> &lt;input type="button" class='list-slide-button-prev' id="c_bigphotos_zoom"  data-fix="c_photos" value=" "&gt;<br> &lt;input type="button" class='list-slide-button-next' id="c_bigphotos_next"  data-fix="c_photos" value=" "&gt;<br> &lt;?endif;?&gt;<br> &lt;/div&gt;<br><br> &lt;?if (count($arResult["MORE_PHOTO"]) &gt; 1):?&gt;<br> &lt;div id="emarket-photo-slider" style="position: relative" class="sm-hide xs-hide"&gt;<br> &lt;div class="sale-carousel" id="c_photos"&gt;<br> &lt;ul class="sale-carousel-row"&gt;<br> &lt;?foreach($arResult["MORE_PHOTO"] as $cell=&gt;$photo):?&gt;<br>                                                                &lt;li class="photo &lt;?=$cell == 0 ? 'active' : ''?&gt;" id="rec_tab1" data-slide="&lt;?=$cell?&gt;" data-type="group" data-state="load"&gt;<br>                                                                    &lt;div class="photo-wrap"&gt;<br>                                                                    &lt;img src="&lt;?=$photo["SRC"]?&gt;" alt="&lt;?=$arResult["NAME"]."_".$cell?&gt;" data-item="i&lt;?=$cell?&gt;" &lt;?if ($photo["WIDTH"] &gt; $photo["HEIGHT"]) {?&gt;width="100%"&lt;?} else {?&gt;height="100%"&lt;?}?&gt;&gt;<br>                                                                    &lt;/div&gt;<br> &lt;/li&gt;<br> &lt;?endforeach;?&gt;<br> &lt;/ul&gt;<br> &lt;/div&gt;<br> &lt;input type="button" class='list-slide-button-prev' id="c_photos_prev"  data-fix="c_photos" value=" "&gt;<br> &lt;input type="button" class='list-slide-button-next' id="c_photos_next"  data-fix="c_photos" value=" "&gt;<br> &lt;/div&gt;<br> &lt;?endif;?&gt;<br><br><br> &lt;div class="emarket-big-label-area"&gt;<br> &lt;?if ($boolDiscountShow):?&gt;<br> &lt;div class="emarket-label emarket-label-sale"&gt;&lt;/div&gt;<br> &lt;?endif;?&gt;<br> &lt;?if ($arResult["PROPERTIES"]["SPECIALOFFER"]["VALUE_ENUM_ID"]&gt;0):?&gt;<br> &lt;div class="emarket-label emarket-label-soffer"&gt;&lt;/div&gt;<br> &lt;?endif;?&gt;<br> &lt;?if ($arResult["PROPERTIES"]["NEWPRODUCT"]["VALUE_ENUM_ID"]&gt;0):?&gt;<br> &lt;div class="emarket-label emarket-label-new"&gt;&lt;/div&gt;<br> &lt;?endif;?&gt;<br> &lt;?if ($arResult["PROPERTIES"]["SALELEADER"]["VALUE_ENUM_ID"]&gt;0):?&gt;<br> &lt;div class="emarket-label emarket-label-hit"&gt;&lt;/div&gt;<br> &lt;?endif;?&gt;<br> &lt;?if ($arResult["PROPERTIES"]["RECOMMENDED"]["VALUE_ENUM_ID"]&gt;0):?&gt;<br> &lt;div class="emarket-label emarket-label-rec"&gt;&lt;/div&gt;<br> &lt;?endif;?&gt;<br><br> &lt;/div&gt;<br><br> &lt;/div&gt;<br> &lt;/div&gt;<br> &lt;div class="emarket-cart-right-column  xs-span_5_of_5"&gt;<br> &lt;?<br> if ($useVoteRating)<br> {<br> ?&gt;&lt;?$APPLICATION-&gt;IncludeComponent(<br> "bitrix:iblock.vote",<br> "stars",<br> array(<br> "IBLOCK_TYPE" =&gt; $arParams['IBLOCK_TYPE'],<br> "IBLOCK_ID" =&gt; $arParams['IBLOCK_ID'],<br> "ELEMENT_ID" =&gt; $arResult['ID'],<br> "ELEMENT_CODE" =&gt; "",<br> "MAX_VOTE" =&gt; "5",<br> "VOTE_NAMES" =&gt; array("1", "2", "3", "4", "5"),<br> "SET_STATUS_404" =&gt; "N",<br> "DISPLAY_AS_RATING" =&gt; $arParams['VOTE_DISPLAY_AS_RATING'],<br> "CACHE_TYPE" =&gt; $arParams['CACHE_TYPE'],<br> "CACHE_TIME" =&gt; $arParams['CACHE_TIME']<br> ),<br> false,<br> array("HIDE_ICONS" =&gt; "Y")<br> );?&gt;&lt;?<br> }<br><br> if (isset($arResult['OFFERS']) &amp;&amp; !empty($arResult['OFFERS']))<br> {<br> $canBuy = $arResult['OFFERS'][$arResult['OFFERS_SELECTED']]['CAN_BUY'];<br> }<br> else<br> {<br> $canBuy = $arResult['CAN_BUY'];<br> }<br><br> if ($canBuy &amp;&amp; $arResult["CATALOG_QUANTITY"]&gt;0){<br> echo '&lt;div class="emarket-available"&gt;'.GetMessage('CT_BCE_CATALOG_AVAILABLE').'&lt;/div&gt;';<br> }<br> else if(!$canBuy &amp;&amp; false){<br> if (strlen($arParams['MESS_NOT_AVAILABLE'])&gt;0)<br> echo GetMessage($arParams['MESS_NOT_AVAILABLE']);<br> }<br> ?&gt;<br> &lt;div class="clear"&gt;&lt;/div&gt;<br> &lt;div class="sale-panel span-xs_5_of_5"&gt;<br> &lt;div class="sale-panel-container"&gt;<br><br> &lt;?$frame = $this-&gt;createFrame()-&gt;begin();?&gt;<br><br> &lt;?if ((((is_array($arResult["PRICE_MATRIX"]) &amp;&amp; !empty($arResult["PRICE_MATRIX"]))) || count($arResult["PRICES"])&gt;0) &amp;&amp; count($arResult["OFFERS"])&lt;=0){?&gt;<br><br> &lt;?if (is_array($arResult["PRICE_MATRIX"]) &amp;&amp; !empty($arResult["PRICE_MATRIX"])){?&gt;<br> &lt;?/*?&gt;<br> &lt;div&gt;&lt;?=GetMessage('PRICE_MATRIX_TITLE')?&gt;&lt;/div&gt;<br> &lt;table&gt;<br> &lt;?foreach($arResult["PRICE_MATRIX"]["ROWS"] as $cell=&gt;$val):?&gt;<br> &lt;tr&gt;<br> &lt;td&gt;&lt;?=$val["QUANTITY_FROM"]?&gt;-&lt;?=$val["QUANTITY_TO"]?&gt;&lt;/td&gt;<br> &lt;?foreach($arResult["PRICE_MATRIX"]["COLS"] as $cell2=&gt;$val2):?&gt;<br> &lt;td&gt;&lt;?=SaleFormatCurrency($arResult["MATRIX"][$cell2][$cell]["DISCOUNT_PRICE"],$arResult["MATRIX"][$cell2][$cell]["RUB"])?&gt;&lt;/td&gt;<br> &lt;?endforeach;?&gt;<br> &lt;/tr&gt;<br> &lt;?endforeach;?&gt;<br> &lt;/table&gt;<br> &lt;?*/?&gt;<br>                            &lt;div class="emarket-item-price"&gt;<br>                                            &lt;?<br>                                            reset($arResult['PRICE_MATRIX']['MATRIX']);<br>                                            $firstPrice = current($arResult['PRICE_MATRIX']['MATRIX']);<br>                                            if (count($arResult["PRICE_MATRIX"]["ROWS"]) == 1) {<br>                                                $currency = ($firstPrice[0]["CURRENCY"] == "RUB") ? GetMessage("PRICE_RUB") : $firstPrice[0]["CURRENCY"];?&gt;<br>                                                &lt;div class="emarket-current-price emarket-format-price"&gt;<br>                                                    &lt;?=$firstPrice[0]["DISCOUNT_PRICE"]." ".$currency?&gt;<br>                                                &lt;/div&gt;<br>                                                &lt;?if ('Y' == $arParams['SHOW_OLD_PRICE'] &amp;&amp; $firstPrice[0]["DISCOUNT_PRICE"] &lt; $firstPrice[0]["PRICE"]):?&gt;<br>                                                    &lt;div class="sale-cart-old-price emarket-format-price"&gt;<br>                                                        &lt;?=$firstPrice[0]["PRICE"]." ".$currency?&gt;<br>                                                    &lt;/div&gt;<br>                                                &lt;?endif;?&gt;<br>                                            &lt;?} else {<br>                                                foreach ($arResult["PRICE_MATRIX"]["ROWS"] as $cell =&gt; $quantity) {<br>                                                    $currency = ($firstPrice[$cell]["CURRENCY"] == "RUB") ? GetMessage("PRICE_RUB") : $firstPrice[$cell]["CURRENCY"];<br>                                                    $showOldPrice = ('Y' == $arParams['SHOW_OLD_PRICE'] &amp;&amp; $firstPrice[$cell]["DISCOUNT_PRICE"] &lt; $firstPrice[$cell]["PRICE"]) ? true : false;<br>                                                    $colClass = ($showOldPrice) ? "left-third-col" : "left-second-col";?&gt;<br>                                                    &lt;div class="sale-cart-quantity-price &lt;?=$colClass?&gt;"&gt;<br>                                                        &lt;?if ($quantity["QUANTITY_TO"] == 0) {?&gt;<br>                                                            &lt;?="�� ".$quantity["QUANTITY_FROM"]." ".GetMessage("PRICE_QTE")?&gt;<br>                                                        &lt;?} else {?&gt;<br>                                                            &lt;?=$quantity["QUANTITY_FROM"]." - ".$quantity["QUANTITY_TO"]." ".GetMessage("PRICE_QTE")?&gt;<br>                                                        &lt;?}?&gt;<br>                                                    &lt;/div&gt;<br>                                                    &lt;div class="sale-cart-price emarket-format-price &lt;?=$colClass?&gt;"&gt;<br>                                                        &lt;?=$firstPrice[$cell]["DISCOUNT_PRICE"]." ".$currency?&gt;<br>                                                    &lt;/div&gt;<br>                                                    &lt;?if ($showOldPrice):?&gt;<br>                                                        &lt;div class="sale-cart-old-price emarket-format-price left-third-col"&gt;<br>                                                            &lt;?=$firstPrice[$cell]["PRICE"]." ".$currency?&gt;<br>                                                        &lt;/div&gt;<br>                                                    &lt;?endif;?&gt;<br>                                                    &lt;div class="clear"&gt;&lt;/div&gt;<br>                                                &lt;?}?&gt;<br>                                            &lt;?}?&gt;<br>                                                    &lt;/div&gt;<br>                                            &lt;?}else{?&gt;<br> &lt;?foreach($arResult["PRICES"] as $priceCode =&gt; $arPrice):?&gt;<br> &lt;?if (in_array($arResult["CAT_PRICES"][$priceCode]["ID"], $arResult["PRICES_ALLOW"])):?&gt;<br> &lt;div class="emarket-item-price"&gt;<br> &lt;div class="price-name"&gt;&lt;?=$arResult["CAT_PRICES"][$priceCode]["TITLE"]?&gt;&lt;/div&gt;<br> &lt;div class="emarket-old-price" id="&lt;? echo $arItemIDs['OLD_PRICE']; ?&gt;" style="display: &lt;? echo ($boolDiscountShow ? '' : 'none'); ?&gt;"&gt;&lt;? echo ($boolDiscountShow ? $arPrice['PRINT_VALUE'] : ''); ?&gt;&lt;/div&gt;<br> &lt;div class="emarket-current-price emarket-format-price" id="&lt;? echo $arItemIDs['PRICE']; ?&gt;"&gt;&lt;? echo $arPrice['PRINT_DISCOUNT_VALUE']; ?&gt;&lt;/div&gt;<br> &lt;div class="clear"&gt;&lt;/div&gt;<br> &lt;/div&gt;<br> &lt;?endif;?&gt;<br> &lt;?endforeach;?&gt;<br> &lt;?}?&gt;<br> &lt;?}else{?&gt;<br> &lt;div class="emarket-item-price"&gt;<br> &lt;div class="emarket-old-price" id="&lt;? echo $arItemIDs['OLD_PRICE']; ?&gt;" style="display: &lt;? echo ($boolDiscountShow ? '' : 'none'); ?&gt;"&gt;&lt;? echo ($boolDiscountShow ? $arResult['MIN_PRICE']['PRINT_VALUE'] : ''); ?&gt;&lt;/div&gt;<br> &lt;div class="emarket-current-price emarket-format-price" id="&lt;? echo $arItemIDs['PRICE']; ?&gt;"&gt;&lt;? echo $arResult['MIN_PRICE']['PRINT_DISCOUNT_VALUE']; ?&gt;&lt;/div&gt;<br>                                                &lt;?if (count($arResult["OFFERS"]) == 1) {<br>                                                $curOffer = current($arResult["OFFERS"]);<br>                                                    ?&gt;<br>                                                    &lt;form class="basket_action"&gt;<br>                                                            &lt;?if ('Y' == $arParams['USE_PRODUCT_QUANTITY']):?&gt;<br>                                                                    &lt;input type="button" id="quantity-button-minus-&lt;?=$curOffer["ID"]?&gt;" class="quantity-button-minus sm-hide xs-hide" value="-"&gt;<br>                                                                    &lt;input type="text" value="1" class="quantity-text quantity-&lt;?=$curOffer["ID"]?&gt; sm-hide xs-hide" name="quantity" id="quantity-&lt;?=$curOffer["ID"]?&gt;"&gt;<br>                                                                    &lt;input type="hidden" value="&lt;?=$curOffer["ID"]?&gt;" name="item"&gt;<br>                                                                    &lt;input type="hidden" value="ADDTOCART" name="action"&gt;<br>                                                                    &lt;input type="button" id="quantity-button-plus-&lt;?=$curOffer["ID"]?&gt;" class="quantity-button-plus sm-hide xs-hide" value="+"&gt;<br>                                                            &lt;?endif;?&gt;<br>                                                            &lt;input type="submit" class="color-icon-button color-icon-button-basket" value="&lt;?=GetMessage('TO_BASKET')?&gt;" name="ADDTOCART"&gt;<br>                                                            &lt;input type="button" class="color-button color-button-blue small one-click-button sm-hide xs-hide" value="&lt;?=GetMessage('ONE_CLICK_SALE')?&gt;" name="ONECLICK" data-trade="&lt;?=$arResult["ID"]?&gt;" data-offer="&lt;?=$curOffer["ID"]?&gt;"&gt;<br>                                                    &lt;/form&gt;<br>                                                &lt;?}?&gt;<br> &lt;div class="clear"&gt;&lt;/div&gt;<br> &lt;/div&gt;<br> &lt;?}?&gt;<br><br><br> &lt;div class="emarket-sale-buttons"&gt;<br> &lt;?if (count($arResult["OFFERS"])&lt;=0){?&gt;<br> &lt;form class="basket_action" id="cart_form_&lt;?=$arResult["ID"]?&gt;""&gt;<br> &lt;div class="basket-button-area" data-basketitem="&lt;?=$arResult["ID"]?&gt;"&gt;<br> &lt;?if ('Y' == $arParams['USE_PRODUCT_QUANTITY']):?&gt;<br> &lt;input type="button" id="quantity-button-minus-&lt;?=$arResult["ID"]?&gt;" class="quantity-button-minus" value="-"&gt;<br> &lt;input type="text" value="1" class="quantity-text" name="quantity" id="quantity-&lt;?=$arResult["ID"]?&gt;"&gt;<br> &lt;input type="button" id="quantity-button-plus-&lt;?=$arResult["ID"]?&gt;" class="quantity-button-plus" value="+"&gt;<br> &lt;?endif;?&gt;<br><br> &lt;input type="hidden" value="&lt;?=$arResult["ID"]?&gt;" name="item"&gt;<br> &lt;input type="hidden" value="ADDTOCART" name="action"&gt;<br><br> &lt;?<br> global $eMarketBasketData;<br><br> $buttonMSG = GetMessage('TO_BASKET');<br> $basketMSG = "";<br> $basketMSGTitle = "";<br><br> if (in_array($arResult["ID"], $eMarketBasketData["ITEMS"])){<br> $compareMSG = " active";<br> $buttonMSG = GetMessage('IN_BASKET_BUTTON');<br> $basketMSGTitle = GetMessage('IN_BASKET');<br> $basketMSG = " active";<br> }<br> ?&gt;<br><br><br> &lt;input type="submit" class="color-icon-button color-icon-button-basket" value="&lt;?=$buttonMSG?&gt;" name="basketadd"&gt;<br> &lt;div class="basket-button-state&lt;?=$basketMSG?&gt;"&gt;&lt;?=$basketMSGTitle?&gt;&lt;/div&gt;<br> &lt;/div&gt;<br> &lt;input type="button" class="color-button color-button-blue small one-click-button" value="&lt;?=GetMessage('ONE_CLICK_SALE')?&gt;" name="ONECLICK" data-trade="&lt;?=$arResult["ID"]?&gt;"&gt;<br> &lt;/form&gt;<br> &lt;?}else{?&gt;<br> &lt;a href="#detail" data-scroll="emarket-offers" class="color-button color-button-blue small scroll-navigate"&gt;&lt;?=GetMessage('CATALOG_OFFERS')?&gt;&lt;/a&gt;<br> &lt;?}?&gt;<br> &lt;?if (count($arResult["OFFERS"])&lt;=0):?&gt;<br><br> &lt;?<br> $addClass="";<br> if (in_array($arResult["ID"], $eMarketBasketData["DELAY"])) $addClass=" active";<br> ?&gt;<br><br> &lt;a href="#" data-basketitem="&lt;?=$arResult["ID"]?&gt;" class="icon-transparent icon-delay-transparent&lt;?=$addClass?&gt;"&gt;&lt;?=GetMessage('CT_BCE_CATALOG_DELAY')?&gt;&lt;/a&gt;<br> &lt;?endif;?&gt;<br> &lt;?<br> $compareType = (isset($_SESSION["CATALOG_COMPARE_LIST"][$arResult["IBLOCK_ID"]]["ITEMS"][$arResult["ID"]])) ? "show" : "set";<br> $compareMSG = (isset($_SESSION["CATALOG_COMPARE_LIST"][$arResult["IBLOCK_ID"]]["ITEMS"][$arResult["ID"]])) ? GetMessage('CT_BCE_CATALOG_COMPARE_LIST') : GetMessage('CT_BCE_CATALOG_COMPARE')<br> ?&gt;<br> &lt;a href="javascript:void(0)" data-compare="&lt;?=$arResult["ID"]?&gt;" class="compare-button icon-transparent icon-compare-transparent sm-hide xs-hide" data-scroll="body-counter" data-comparestate="&lt;?=$compareType?&gt;"&gt;&lt;?=$compareMSG?&gt;&lt;/a&gt;<br><br> &lt;div class="clear"&gt;&lt;/div&gt;<br> &lt;/div&gt;<br> &lt;/div&gt;<br>                        <br> &lt;?$frame-&gt;beginStub()?&gt;<br> ...<br> &lt;?$frame-&gt;end()?&gt;<br><br>                        &lt;div class="emarket-sonet-share sm-hide xs-hide"&gt;<br>                                &lt;? $GLOBALS["APPLICATION"]-&gt;IncludeComponent("bitrix:main.share", "emarket-sonet-share", Array(<br>                                    "HIDE" =&gt; "N",<br>                                    "HANDLERS" =&gt; array(<br>                                            0 =&gt; "lj",<br>                                            1 =&gt; "twitter",<br>                                            2 =&gt; "vk",<br>                                            3 =&gt; "facebook",<br>                                            4 =&gt; "mailru",<br>                                    ),<br>                                    "PAGE_URL" =&gt; $arResult["DETAIL_PAGE_URL"],<br>                                    "PAGE_TITLE" =&gt; $arResult["NAME"],<br>                                    "SHORTEN_URL_LOGIN" =&gt; "",<br>                                    "SHORTEN_URL_KEY" =&gt; "",<br>                                    ),<br>                                    false<br>                                );?&gt;<br> &lt;/div&gt;<br> <br><br><br><br> &lt;/div&gt;<br><br> &lt;div class="emarket-detail-info sm-hide xs-hide"&gt;<br> &lt;input type="button" data-scrollable="1" data-scroll="emarket-extented" class="color-button" value="&lt;?=GetMessage('EMARKET_DETAIL_INFO')?&gt;"&gt;<br> &lt;/div&gt;<br><br> &lt;/div&gt;<br> &lt;div class="clear"&gt;&lt;/div&gt;<br><br><br>&lt;/div&gt;<br><br>&lt;script&gt;<br> var createSlider = false;<br> &lt;?if (count($arResult["MORE_PHOTO"])&gt;5):?&gt;<br> createSlider = true;<br> var countPhoto = &lt;?=count($arResult["MORE_PHOTO"])-1?&gt;;<br> &lt;?endif;?&gt;<br>            <br>            <br>    &lt;?if ($arParams["ZOOM_ON"] == "Y") {?&gt;<br>        jQuery(function(){<br><br>            $(".zoom-img").imagezoomsl({<br>              zoomrange: [2.12, 12],<br>              magnifiersize: [300, 300],<br>              scrollspeedanimate: 10,<br>              loopspeedanimate: 5,<br>              cursorshadeborder: "1px solid black",<br>              magnifiereffectanimate: "slideIn", <br>              magnifierborder: "1px solid #eee",<br>              zindex: 1000,<br>            });<br><br>            $(document).on("click", ".tracker", function() {<br>                $('.zoom-img:visible').closest('a').trigger("click");<br>            })<br>        });   <br>    &lt;?}?&gt;<br>&lt;/script&gt;<br><br><br><br>&lt;?$APPLICATION-&gt;IncludeComponent(<br> "coffeediz:schema.org.Product",<br> "",<br> Array(<br> "SHOW" =&gt; "Y",<br> "NAME" =&gt; $arResult['NAME'],<br> "DESCRIPTION" =&gt; $arResult['DETAIL_TEXT'],<br> "PRICE" =&gt; $arResult['CATALOG_PRICE_1'],<br> "PRICECURRENCY" =&gt; $arResult['CATALOG_CURRENCY_1'],<br> "ITEMAVAILABILITY" =&gt; "InStock",<br> "ITEMCONDITION" =&gt; "NewCondition",<br> "PAYMENTMETHOD" =&gt; array("VISA", "MasterCard", "Cash"),<br> "PARAM_RATING_SHOW" =&gt; "Y",<br> )<br>);?&gt;</code> </div> <p class="" style="text-align: left;"> <br> </p> <h3 style="text-align: left;"> Новости и Статьи </h3> <p class="" style="text-align: left;"> Решение TopShop содержит 2 раздела с текстовым контентом:</p><p class="" style="text-align: left;"></p> <ul><li style="text-align: left;">/company/news/<br> </li> <li style="text-align: left;">/company/press/</li></ul> <p class="" style="text-align: left;">Оба раздела используют один и тот же комплексный компонент bitrix:news с одним и тем же шаблоном emarket_news (для вывода детальной страницы используется bitrix:news.detail с дефолтным компонентом в составе комлексного).</p><p class="" style="text-align: left;">Копируем шаблон комплексного компонента в наш шаблон сайта "<span style="background-color: #f7941d;">topshop_orange_flat</span>", переименовывая в "<span style="background-color: #81ca9d;">emarket_news_schema</span>" на одной из страниц (например на новостной).</p><p class="" style="text-align: left;">Применяем этот же шаблон для компонента на второй странице (чтобы разметить сразу оба раздела).</p><p class="" style="text-align: left;">Переходим к редактированию шаблона детальной страницы новости в комплексном шаблоне компонента:</p><p class="" style="text-align: left;">/bitrix/templates/<span style="background-color: #f7941d;">topshop_orange_flat</span>/components/bitrix/news/<span style="background-color: #81ca9d;">emarket_news_schema</span>/bitrix/news.detail/.default/template.php<br></p><p class="" style="text-align: left;">Воспользуемся <b><a href="/information/microdesmidae_module_coffeediz_schema_for_1c_bitrix_part_4_persons_and_articles/#Article">спецификацией компонента Статья</a></b> для максимально детальной микроразметки.</p><p class="" style="text-align: left;">Добавляем туда вызов компонента Статья:</p> <code>&lt;?$APPLICATION-&gt;IncludeComponent(<br> "coffeediz:schema.org.Article",<br> "",<br> Array(<br> "COMPONENT_TEMPLATE" =&gt; ".default",<br> "SHOW" =&gt; "Y",<br> "TYPE" =&gt; "",<br> "LEARNING_RESOURCE_TYPE" =&gt; "",<br> "NAME" =&gt; $arResult["NAME"],<br> "ARTICLEBODY" =&gt; $arResult["DETAIL_TEXT"],<br> "ABOUT" =&gt; $arResult["PREVIEW_TEXT"],<br> "GENRE" =&gt; "",<br> "ARTICLE_SECTION" =&gt; array($arResult["SECTION"]["NAME"], ""),<br> "KEYWORDS" =&gt; array(""),<br> "IN_LANGUAGE" =&gt; "ru",<br> "DATA_PUBLISHED" =&gt; $arResult["DISPLAY_ACTIVE_FROM"],<br> "AUTHOR_TYPE" =&gt; "",<br> "IMAGEURL" =&gt; "",<br> "PARAM_RATING_SHOW" =&gt; "N"<br> )<br>);?&gt;</code> <p class="" style="text-align: left;">Так же отредактируем параметры компонента на обеих страницах. Нас интересует параметр "Формат показа даты" раздела "Настройки Детального Просмотра". Поскольку дата в публичной части у нас всё равно не выводится, мы приведём её к формату ГГГГ-ММ-ДД, который должен быть у этого поля согласно спецификации Schema.Org:</p><p class="" style="text-align: left;"><img width="941" alt="задание даты в ISO 8601 микроразметки Schema.Org компонента детальной страницы Новостей или Статей" src="/upload/medialibrary/984/98417cb1a6610eb364157cc3ea1cd5e4.png" height="712" title="задание даты в ISO 8601 микроразметки Schema.Org компонента детальной страницы Новостей или Статей"><br></p><p class="" style="text-align: left;">Обращаем внимание читателя, что семантически вернее было бы создать у комплексного компонента новый параметр "Тип публикации" со значениями Статья/Новость и передать этот тип из комплексного компонента новостей, в детальную страницу, а оттуда компоненту микроразметки.</p><p class="" style="text-align: left;">Это позволило бы семантически вернее обозначить тип контента (однако в настоящий момент нет чёрткой информации о том какие преимущества бы это дало, поэтому мы воздержались от ещё одной правки чужого шаблона).</p><p class="" style="text-align: left;">К сожалению, в решении TopShop не используется ни автор, ни рейтинг для статей/новостей, поэтому мы не использовали эту микроразметку (Хотя спецификация компонент и позволяет, так что небольшая дополнительная правка легко и просто обогатила бы ваш поисковый сниппет)</p><p class="" style="text-align: left;"><br></p><h2 style="text-align: left;">Итоги</h2><p class="" style="text-align: left;">Мы успешно добавили микроразметку Schema.Org на сайт, созданный на типовом решении TopShop, постратив на это менее часа.</p><p class="" style="text-align: left;">В рамках задачи было добавлено 5 типов микроразметки:</p><ul><li style="text-align: left;">schema.org/Organization - Адрес организации</li><li style="text-align: left;">schema.org/ImageObject - Изображение (для товаров)</li><li style="text-align: left;">schema.org/Product - Продукт (с ценой для товаров)</li><li style="text-align: left;">schema.org/Article - Статья (для Статей и Новостей)</li><li style="text-align: left;">Data-Vocabulary.org/Breadcrumb - Хлебные крошки</li></ul> <p class="" style="text-align: left;">До 4 типов теперь могут встречаться на 1 странице:</p><p class="" style="text-align: left;"><img width="827" alt="Результаты валидации страницы с 4 видами Микроразметки с помощью модуля Микроразметка Schema.org для 1С-Битрикс" src="/upload/medialibrary/69e/69ed70c863bab681962779f6d86f8e91.png" height="594" title="Результаты валидации страницы с 4 видами Микроразметки с помощью модуля Микроразметка Schema.org для 1С-Битрикс"><br></p><p class="" style="text-align: left;">А это значительно увеличит шансы на интересный и привлекательный поисковый сниппет для сайта!</p><p class="" style="text-align: left;"><br></p> <p style="text-align: right;"> <a href="http://plus.google.com/+АлексейЗадойный?rel=author" target="_blank">Задойный А.В.</a> </p>

Возврат к списку

Яндекс.Метрика