В 9 уроке мы продолжим совершенствоваться в работе с компонентом списка. На этот раз мы познаем Дзен случайных чисел - в рамках урока мы сделаем компонент вывода случайного отзыва для главной страницы сайта.
HTML Разметка этого блока на главной странице выглядит так:
<h4 class="indent-1">testimonials:</h4>
<p class="p1">Praesent vestibulum molestie lacus. Aenean nonummy hendrerit mauris. Phasellus porta. Fusce suscipit varius mi, nascetur ridiculus mus. Nulla dui. Fusce feugiat malesuada.”</p>
<span class="clr"><strong>Mark Priston</strong>, <a href="#" class="link-2">demolink.org</a></span>
Создадим новый инфоблок "Рекомендации" с символьным кодом "TESTIMONIALS" в типе инфоблоков "Контент". Не будем пока задавать особые настройки поисковой индексации или структуры данного инфоблока, поскольку вероятно будем выводить эту информацию не только на главной, но и на внутренних страницах сайта.
Зададим 3 свойства (2 из которых не фигурируют в макете главной страницы, однако которые могут быть нам полезны):
- Должность - TESTIMONIAL_PERSON_POST
- Компания - TESTIMONIAL_PERSON_COMPANY
- Сайт - TESTIMONIAL_PERSON_SITE
Имя автора отзыва мы будем хранить в названии элемента ИБ, а текст отзыва для главной в тексте анонса (если мы будем хранить развёрнутый отзыв где-то на внутренних страницах, то для него есть текст детального описания).
Разместим на тестовой странице (например, 1.php) компонент bitrix:news.list и скопируем шаблон .default в шаблон сайта, переименовав в random_testimonials_on_main.
Организация вывода случайного элемента инфоблока производится с помощью установки случайной сортировки и отключением кеширования
- Поле для первой сортировки новостей: RAND
- Тип кеширования: Не кешировать
Во-первых зададим в параметрах компонента название ленты:
"TESTIMONIALS_TITLE" => Array(
"NAME" => GetMessage("TESTIMONIALS_TITLE"),
"TYPE" => "HTML",
"DEFAULT" => "Рекомендации",
),
А в шаблоне выведем заголовок (при условии, что параметр не пуст):
<?if (!empty($arParams['TESTIMONIALS_TITLE'])):?><h4 class="indent-1"><?=$arParams['TESTIMONIALS_TITLE']?>:</h4><?endif?>
Во-вторых зададим в параметр, который будет регулировать будем ли мы выводить полноценную кликабельную ссылку или только адрес сайта в виде текста. Уместно так же будет задать 2 дополнительных параметра, которые будут регулировать будет ли открываться эта ссылка в новом окне или в уже существующем, а так же будет ли доступна ссылка поисковым системам (будет ли в ней параметр nofollow). Последние 2 параметра имеет смысл выводить только в случае, если установлен параметр выводить полноценную ссылку.
Тогда этот блок в .parameters.php будет выглядеть следующим образом:
$arTemplateParameters = array(
"USE_LINKS" => Array(
"NAME" => GetMessage("USE_LINKS"),
"TYPE" => "CHECKBOX",
"MULTIPLE" => "N",
"VALUE" => "Y",
"DEFAULT" =>"Y",
"REFRESH"=> "Y",
),
);
if ($arCurrentValues["USE_LINKS"] == "Y")
{
$arTemplateParameters["USE_LINKS_NOFOLLOW"] = array(
"NAME" => GetMessage("USE_LINKS_NOFOLLOW"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y",
);
$arTemplateParameters["USE_LINKS_BLANK"] = array(
"NAME" => GetMessage("USE_LINKS_BLANK"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y",
);
}
Тогда целиком .parameters.php будет выглядеть:
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arTemplateParameters = array(
"USE_LINKS" => Array(
"NAME" => GetMessage("USE_LINKS"),
"TYPE" => "CHECKBOX",
"MULTIPLE" => "N",
"VALUE" => "Y",
"DEFAULT" =>"Y",
"REFRESH"=> "Y",
),
"TESTIMONIALS_TITLE" => Array(
"NAME" => GetMessage("TESTIMONIALS_TITLE"),
"TYPE" => "HTML",
"DEFAULT" => "Рекомендации",
),
);
if ($arCurrentValues["USE_LINKS"] == "Y")
{
$arTemplateParameters["USE_LINKS_NOFOLLOW"] = array(
"NAME" => GetMessage("USE_LINKS_NOFOLLOW"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y",
);
$arTemplateParameters["USE_LINKS_BLANK"] = array(
"NAME" => GetMessage("USE_LINKS_BLANK"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y",
);
}
?>
Не забудем, что в шаблоне так же придётся сделать проверку на значение этих параметров, так что конечный вид шаблона компонента будет таким:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?if (!empty($arParams['TESTIMONIALS_TITLE'])):?><h4 class="indent-1"><?=$arParams['TESTIMONIALS_TITLE']?>:</h4><?endif?>
<?foreach($arResult["ITEMS"] as $arItem):?>
<?
$this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT"));
$this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
?>
<div id="<?=$this->GetEditAreaId($arItem['ID']);?>">
<p class="p1"><?echo $arItem["PREVIEW_TEXT"];?></p>
<span class="clr"><strong><?echo $arItem["NAME"]?></strong><?if (!empty($arItem['PROPERTIES']['TESTIMONIAL_PERSON_POST']['VALUE'])):?>, <?=$arItem['PROPERTIES']['TESTIMONIAL_PERSON_POST']['VALUE']?><?endif?>
<?if (!empty($arItem['PROPERTIES']['TESTIMONIAL_PERSON_COMPANY']['VALUE'])):?>, <?=$arItem['PROPERTIES']['TESTIMONIAL_PERSON_COMPANY']['VALUE']?><?endif?>
<?if (!empty($arItem['PROPERTIES']['TESTIMONIAL_PERSON_SITE']['VALUE'])):?>,
<?if($arParams["USE_LINKS"]=="Y"):?>
<a class="link-2" <?if($arParams["USE_LINKS_NOFOLLOW"]=="Y"):?>rel="nofollow" <?endif?><?if($arParams["USE_LINKS_BLANK"]=="Y"):?>target="_blank" <?endif?>href="http://<?=$arItem['PROPERTIES']['TESTIMONIAL_PERSON_SITE']['VALUE']?>"><?=$arItem['PROPERTIES']['TESTIMONIAL_PERSON_SITE']['VALUE']?></a>
<?else:?>
<?=$arItem['PROPERTIES']['TESTIMONIAL_PERSON_SITE']['VALUE']?>
<?endif?>
<?endif?></span>
</div><br/>
<?endforeach;?>
Как видите, в конечном итоге шаблон получился очень коротким, несмотря на двухступенчатую проверку условий при выводе ссылки.
Осталось только разместить на главной странице вместо разметки код вызова компонента:
<?$APPLICATION->IncludeComponent("bitrix:news.list", "random_testimonials_on_main", array(
"IBLOCK_TYPE" => "-",
"IBLOCK_ID" => "TESTIMONIALS",
"NEWS_COUNT" => "2",
"SORT_BY1" => "RAND",
"SORT_ORDER1" => "DESC",
"SORT_BY2" => "SORT",
"SORT_ORDER2" => "ASC",
"FILTER_NAME" => "",
"FIELD_CODE" => array(
0 => "",
1 => "",
),
"PROPERTY_CODE" => array(
0 => "",
1 => "TESTIMONIAL_PERSON_POST",
2 => "TESTIMONIAL_PERSON_COMPANY",
3 => "TESTIMONIAL_PERSON_SITE",
4 => "",
),
"CHECK_DATES" => "Y",
"DETAIL_URL" => "",
"AJAX_MODE" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "N",
"AJAX_OPTION_HISTORY" => "N",
"CACHE_TYPE" => "N",
"CACHE_TIME" => "36000000",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "Y",
"PREVIEW_TRUNCATE_LEN" => "",
"ACTIVE_DATE_FORMAT" => "d.m.Y",
"SET_TITLE" => "N",
"SET_STATUS_404" => "N",
"INCLUDE_IBLOCK_INTO_CHAIN" => "N",
"ADD_SECTIONS_CHAIN" => "N",
"HIDE_LINK_WHEN_NO_DETAIL" => "N",
"PARENT_SECTION" => "",
"PARENT_SECTION_CODE" => "",
"INCLUDE_SUBSECTIONS" => "Y",
"DISPLAY_TOP_PAGER" => "N",
"DISPLAY_BOTTOM_PAGER" => "N",
"PAGER_TITLE" => "Новости",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => "",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"USE_LINKS" => "Y",
"TESTIMONIALS_TITLE" => "Рекомендации",
"USE_LINKS_NOFOLLOW" => "Y",
"USE_LINKS_BLANK" => "Y",
"AJAX_OPTION_ADDITIONAL" => ""
),
false
);?>
Демо-данные в формате XML вы, как всегда, можете найти в нашем репозитории. Как обычно данные для импорта инфоблока расположены в дирректории /IMPORT_DATA/СИМВОЛЬНЫЙ_КОД_ИНФОБЛОКА/iblock.xml.
XML подходит для импорта на сайт с любой кодировкой (как UTF-8, так и CP-1251) и содержит не только данные, но и необходимые настройки инфоблока, так что подходит для первичного импорта без настройки инфоблока (в любой созданный тип инфоблока).
Результаты урока в репозитории