Помимо использования уже установленных в системе компонентов, разработчик может добавлять свои либо импортировать компоненты сторонних разработчиков.
В системе есть несколько способов создания собственных компонентов:
Разберём первый способ.
Зайдите в раздел с компонентами: меню «Разработка → Компоненты». Нажмите на кнопку «Добавить компонент». В выпадающем списке выберите первый пункт «Создать новый компонент "с нуля"».
Нажмите на кнопку «Продолжить».
Введите название и выберите группу шаблона .
Нажмите на кнопку «Добавить компонент».
В качестве примера создайте компонент «Товары», который будет содержать поля:
Название поля | Описание | Тип поля | Формат |
---|---|---|---|
Name | Название | Строка | |
Description | Описание | Текстовый блок | |
Price | Стоимость | Целое число | |
Photo | Фотография | Файл | 1500000:image/* |
Producer | Производство | Список | Producer |
Lost | Остаток | Целое число |
При создании поля необходимо заполнить ряд данных:
Данное поле должно быть уникальным внутри одного компонента. Для ввода допускаются латинские буквы, цифры и символ подчёркивания. Вы сможете изменить имя поля компонента после его создания.
Краткая характеристика поля. Это описание будет выводиться на сайте в форме добавления/редактирования и в административном разделе.
В поле возможны следующие варианты значений (подробные описания типов полей):
Данное поле является логическим продолжением типа поля и в разных полях служит для разных целей. Например:
В данное поле можно поместить дополнительное содержимое: js-скрипт, строку-подсказку, html-код и т.д. В содержимом можно использовать макропеременную %ID
, при выводе она будет заменёна на идентификатор поля. Вывод содержимого происходит для поля с именем $field_name
компонента $class_id
. Если $class_id
не указан - автоматически подставляется текущий класс. Для вывода содержимого поля существует функция nc_field_extension().
В случае установки данного значения поле шаблона попадает в разряд обязательных полей.
Подробне про поиск читайте в разделе «Поиск и выборка».
Значение данного поля определяет приоритетность вывода полей в компоненте и далее в формах добавления/редактирования объекта.
Будет записано данное значение, если поле не заполнено.
В типе доступа выставляется доступность поля на запись для посетителей или администратора сайта.
Перейдите на вкладку «Поля» и последовательно создайте все поля, указанные в таблице. В результате вы получите набор полей:
Обратите внимание на поле «Производство», в нём подключается список «Producer». В подобном случае соответствующий список уже должен быть создан.
Теперь можно заняться подключением компонента к разделу (созданием инфоблока в разделе) и к правке шаблона компонента.
Откройте вкладку «Редактирование компонента».
На странице редактирования компонента расположены следующие поля:
Схематично шаблон отображения данных можно изобразить так:
Составим шаблон отображения списка товаров на примере созданного компонента «Товары». Код товара в списке имеет общий вид:
<div class="goods_list"> <div class="header">Товары</div> <div class="content"> <li><h3><a href="#">Первый товар</a></h3> <p>Описание первого товара</p> <p>Производитель: Россия</p></li> <li><h3><a href="#">Второй товар</a></h3> <p>Описание второго товара.</p> <p>Производитель: Россия</p></li> </div> </div>
Разделим эти данные по нужным полям.
В префикс списка объектов нужно поместить верхнюю часть:
<?=$f_AdminCommon?> <div class="goods_list"> <div class="header">Товары</div> <div class="content">
Переменная $f_AdminCommon в режиме редактирования выводит панель операций с инфоблоком, в частности, кнопку добавления нового объекта.
В поле «Объект в списке» нужно поместить вывод повторяющихся частей:
<li><h3><a href="#">Первый товар</a></h3> <p>Описание первого товара</p> <p>Производитель: Россия</p></li>
Замените статичный текст на вывод переменных. Переменные вывода информации формируются следующим образом: $f_ + имя поля. Например, если имя поля Name, переменная выводящая значение будет писаться как $f_Name.
Ссылка на просмотр полного текста объекта указывается переменными: $fullLink или $fullDateLink. Вторая переменная выводит в url дату добавления записи. Например, для того, чтобы вывести ссылку на полный просмотр новости, в шаблоне вывода нужно прописать: <a href="<?= $fullLink?>"><?= $f_Name?></a>
Остальные переменные вывода формируются по этому же правилу $f_ + имя поля:
Примеры использования:
<img src="<?= $f_Photo?>" alt="<?= $f_Name?>" title="<?= $f_Name?>"> — вывод изображения <a href="<?= $f_File?>">Скачать файл</a> — вывод ссылки на файл
Таким образом, получаем следующий блок:
<?=$f_AdminButtons?> <li><h3><a href="<?= $fullLink?>"><?= $f_Name?></a></h3> <p><?= $f_Description?></p> <p>Производитель: <?= $f_Producer?></p></li>
$f_AdminButtons является служебной переменной, в обычном режиме она пуста, а в режиме администрирования содержит управляющие кнопки: изменить, удалить и включить/выключить.
Здесь же, в выводе объекта в списке, и далее, в полном отображении объекта, рекомендуется проводить проверки на наличие переменной. Например, редактор при добавлении товара не указал производителя, на сайте выведется просто «Производитель: ». Чтобы этого избежать вводим условие:
<?= ($f_Producer?”<p>Производитель: “.$f_Producer.”</p>”:NULL);?>
В суффикс списка объектов нужно поместить оставшуюся часть кода:
</div> </div>
Кроме этого в нижней части обычно размещается постраничная навигация.
На странице отображения объекта код можно выводить в любом удобном для вас виде, используя все созданные у компонента поля, а также системные поля объекта:
Используя различные условия в выводе компонентов можно добиваться различных вариаций отображения. Например:
В решении примера можно задействовать функционал пользовательских настроек компонента, тем самым дав администратору сайта возможность самому выбирать количество колонок.
Зайдите на вкладку «Пользовательские настройки» и добавьте новое поле со следующими значениями:
Название поля | NumCols |
---|---|
Описание | Количество колонок |
Значение по умолчанию | 3 |
Тип | Строка |
Регулярное выражение для проверки | /^\d+$/ |
Текст в случае несоответствия регулярному выражению | Введите целое число |
Длина поля для ввода | 3 |
В настройках инфоблока отобразятся необходимые настройки
Внесите изменения в шаблон вывода.
В системные настройки поместите обработчик:
<?=( !isset($nc_num_cols) ? $NumCols = &$cc_settings[NumCols] : $NumCols= (int)$nc_num_cols ); $ColWidth= ( $NumCols>1 ? 'width="'.(floor(100/$NumCols)).'%"' : NULL);?>
В префиксе списка объектов:
<table > <?=( $NumCols>1 ? str_repeat("<col $ColWidth />",$NumCols) : NULL );?> <tr>
В поле объекта в списке:
<?=(!($f_RowNum%$NumCols) && $f_RowNum?” </tr><tr>”:NULL);?> <td> Содержимое ячейки </td>
В суффиксе списка объектов:
<?=( $f_RowNum%$NumCols ? str_repeat('<td> </td>',($NumCols-$f_RowNum%$NumCols)) : NULL );?> </tr> </table>
Таким образом, вы получите табличную вёрстку с необходимым количеством колонок.
Возможен вариант с использованием div'ов. В этом случае необходимо через указанное количество div'ов вставить <div class='clear'></div>. В поле объекта в списке нужно в конец добавить код:
<?=($f_RowNum % $NumCols ? "<div class='clear'></div>" : NULL )?>
Системные настройки при этом заполняются аналогично.
Для чередования фона у ячеек таблицы или списка, можно воспользоваться кодом из предыдущего примера. В поле объекта в списке поместите код:
<li<?=($f_RowNum % 2? " class='even'" : NULL );?>><?=$f_Name?></li>
или так же с таблицей
<tr<?=($f_RowNum % 2? " class='even'" : NULL );?>><td>$f_Name</td></tr>
Класс even задаёт цвет фона. Идеальным вариантом решения будет использование только классов.
Данный пример уже полностью разобран немного выше. Предположим, что у вас есть список новостей и через каждую третью новость в списке нужно вывести рекламный блок. Смотрите в первом примере и выполняете по аналогии: создаёте пользовательскую настройку «Выводить через n объектов», в системные настройки добавляете код, в поле объекта в списке помещаете код:
<?=($f_RowNum % $NumCols ? "Здесь код рекламного блока или баннера" : NULL );?>
Подобным образом можно решить похожие задачи.
Необходимо выполнить группировку новостей по дате добавления (Created):
Дата_2:
— Новость 4
— Новость 3
Дата_1:
— Новость 2
— Новость 1
В поле «Сортировать объекты по полю» добавляете сортировку по полю Created DESC.
В поле вывода объекта в списке:
<div class=''> <?=($f_Created_day.$f_Created_month.$f_Created_year!=$myCr?"<h2>$f_Created_day.$f_Created_month.$f_Created_year</h2>":NULL);?> <a href='<?=$fullLink?>'><?=$f_Title?></a> <?=($myCr=$f_Created_day.$f_Created_month.$f_Created_year?"":NULL);?> </div>
Необходимо выполнить группировку товаров по производителю (Producer):
Производитель_1:
— Товар 1
— Товар 2
Производитель_2:
— Товар 3
— Товар 4
В поле «Сортировать объекты по полю» добавляете сортировку по полю Producer.
В поле вывода объекта в списке:
<div class=''> <?=($f_Producer!=$Prod?"<h2>$f_Producer</h2>":NUL);?> <a href='<?=$fullLink?>'><?=$f_Title?></a> <?=(($Prod=$f_Producer)?"":NULL);?> </div>
Существуют так же ссылки для действий с компонентом и с объектом. Они формируются автоматически и записываются в переменные:
Переменная | Описание |
---|---|
$addLink | ссылка на страницу с формой добавления объекта |
$searchLink | ссылка на страницу с формой поиска по компоненту |
$rssLink | ссылка на страницу с rss-лентой этой страницы (если доступно) |
$xmlLink | ссылка на xml-выгрузки содержимого страницы (если доступно) |
$editLink | ссылка на страницу с формой редактирования объекта |
$deleteLink | ссылка на страницу с формой удаления объекта |
$dropLink | ссылка на удаление объекта без подтверждения |
$checkedLink | ссылка на включение \ выключение объекта |
$fullRSSLink | ссылка на rss-просмотр объекта |
$subscribeLink | ссылка на подписку на данный компонент в разделе |
Использовать их можно в любом нужном месте. Например, для формирования ссылки на редактирование объекта для пользователя достаточно прописать ссылку на странице: <a href='$editLink'>Редактировать новость</a>.
Предположим, что на странице предусмотрена постраничная навигация и она должна иметь следующий вид:
Новости 11 - 20 из 35 предыдущая | 1 | 2 | 3 | следующая
Для реализации примера в суффикс или префикс вывода данных нужно поместить код:
Новости <?=$begRow?> - <?=$endRow?> из <?=$totRows?> <?=($prevLink?"<a href='$prevLink'>предыдущая</a>":NULL);?><?=browse_messages($cc_env, 10);?><?=($nextLink?"<a href='$nextLink'>следующая</a>":NULL);?>
В шаблон вывода навигации нужно поместить массив:
$browse_msg['prefix'] = "| "; $browse_msg['suffix'] = " |"; $browse_msg['active'] = "<b>%PAGE</b>"; $browse_msg['unactive'] = "<a title='%FROM - %TO' href='%URL'>%PAGE</a>"; $browse_msg['divider'] = " | ";
В примере ссылки на предыдущую или следующую страницу будут выводить только в том случае, если посетитель находится не на первой или не на последней странице.
Основной функцией в примере является функция: browse_messages($cc_env, $range), где $range — количество одновременно видимых ссылок на страницы.
Комментарии 4
Примеры использования:
<img src='<?=$f_Photo?>' alt='<?=$f_Name?>' title='<?=$f_Name?>'> — вывод изображения
По крайней мере в версии 5.4 по другому не работает((
На текущий момент при отображения одного компонента - применяется макет для вывода нескольких компонентов. А у меня стоит задача - при нажатии на компонент, отобразить его совершенно в другом макете сайта.