VKengine Лицензии Установка Мануал
Телефон +7 (916) 478-23-45
Создание страницы "список элементов такого-то инфоблока"

Для того, чтобы создать страницу "список элементов инфоблока", нужно предварительно проверить, что в инфоблоке есть хотя бы один элемент. Если нет - создайте тестовый элемент.
Далее нужно зайти во вкладке "Страницы" по ссылке "Действия с элементами".
Вкладка Страницы изнутри - Действия с элементами
Выбираем нужный инфоблок, тип страницы "Список элементов", вписываем название шаблона - например, "companynews" (подставьте сюда своё название).
Список новостей - 1
Выбираем название для файла, например, "company/news.php" (подставьте сюда своё название). Выберем шаблон (например, common). Нажимаем кнопку "К следующему шагу".
Отступление для программиста
После завершения создания мы получим три файла: engine/gcomponents/news_list/companynews_controller.php и engine/gcomponents/news_list/companynews_template.php (именованные по названию шаблона) и файл company/news.php (именованный по названию файла).
Файл company/news.php имеет следующее содержание:

<?
include_once($_SERVER["DOCUMENT_ROOT"]."/root_dir.php");

include_once($root_dir.$engine_path."engine/helper/header.php");

include_once($root_dir.$engine_path."engine/gcomponents/news_list/companynews_controller.php");

include_once($root_dir.$engine_path."engine/templates/common/common_header.php");

include_once($root_dir.$engine_path."engine/gcomponents/news_list/companynews_template.php");

include_once($root_dir.$engine_path."engine/templates/common/common_footer.php");
?>
 
Файлы engine/gcomponents/news_list/companynews_controller.php и engine/gcomponents/news_list/companynews_template.php создаются из стандартных образцов, при необходимости можно изменить эти стандартные образцы (но делать это не рекомендуется, поскольку эти файлы обновляемы вместе с обновлениями админки и будут перезаписаны, если в обновлении они изменены). Образцы находятся по адресу engine/components/standart/news_list_controller.php и engine/components/standart/news_list_template.php.
Конец отступления для программиста
После этого мы выбираем необходимые параметры.
Список новостей - 2
Имя массива лучше изменить с имени по умолчанию. Иначе, если Вам потребуется подключить два контроллера на одной странице, а у них будет одинаковое имя массива, данные перекроются. Для каждого типа страниц имя по умолчанию своё.
Далее вводим количество элементов инфоблока, выводимых на одной странице. По умолчанию их 10.
Далее вводим условия, по которым фильтруется вывод. По умолчанию - active=1 (зелёная точка в админке напротив элемента в списке элементов - active=1, красная точка - active=0). Вводить необходимо в формате части запроса mysql, именно это будет подставлено после WHERE при выполнении запроса. В примере выводятся все активные элементы, поле "Текст" которых начинается со слова "Сообщение".
Далее вводим сообщение об отсутствии в блоке элементов, удовлетворяющих условию.
Далее выбираем сортировку. По умолчанию уровней сортировки не больше двух, однако это можно легко изменить впоследствии.
Как изменить: Сортировка заполняет следующую строку в контроллере engine/gcomponents/news_list/нАЗВАНИЕшАБЛОНА_controller.php:

//Упорядочение
$AllValues["news_list"]["order_by"]='ORDER BY id desc';


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

//Упорядочение
$AllValues["news_list"]["order_by"]='ORDER BY date1 desc, name asc, id desc';


Эта строка непосредственно подставляется в sql-запрос.
Далее выбираем тип шаблона счётчика (по названию папок в engine/gcomponents/counters/). Также выбираем, будем ли мы его выводить сверху и снизу. Если убрать обе галочки, то вывода не будет, и выбор шаблона счётчика не запомнится.
Далее вводим название формы для поиска. Форма для поиска используется только в том случае, если Вам необходим дополнительно поиск на странице по выдаваемым данным. Поиск может вестись только по строковым полям. Название формы должно быть уникальным в пределах страницы, на которой она используется (только для этого сюда и включён этот параметр, как и имя массива). Для включения поиска Вам необходимо поставить галочки ниже напротив названий полей в столбце "Участвовать в поиске":
Поля для поиска
Далее вводим ссылку на страницу "Элемент подробно" (если Вы её уже создали). Ссылка вставляется в темплейт (engine/gcomponents/news_list/нАЗВАНИЕшАБЛОНА_template.php) со слова "Подробнее". Ссылка должна иметь вид файлдетально.php?id=. То есть id конкретной новости подставляется в конец ссылки, и больше она никак не преобразуется.
Далее галочками выбираем поля для вывода и для поиска, и нажимаем "завершить создание страницы".
Далее мы можем просмотреть получившуюся страницу. Ссылка "Просмотреть результат" откроется в новом окне.
Просмотреть результат
В заключение привожу код контроллера и темплейта с комментариями.

engine/gcomponents/news_list/companynews_controller.php

<? //3.0.0
//По умолчанию определяем номер страницы как 1
if(!isset($_GET["page"])){
$AllValues["companynews_list"]["pagenumber"]=1;
} else {
//Для безопасности сделаем $_GET["page"] числом
settype($_GET["page"],"integer");
$AllValues["companynews_list"]["pagenumber"]=$_GET["page"];
}

//Номер инфоблока, из которого будут выводиться новости
$AllValues["companynews_list"]["block_id"]=1;

//Количество новостей на одной странице
$AllValues["companynews_list"]["news_per_page"]=10;

//Запись условий вывода по умолчанию
$AllValues["companynews_list"]["properties"][]="active=1 AND `text` LIKE 'Сообщение%'";

//Изначально никаких параметров не подразумевается
$AllValues["companynews_list"]["url_parameters"]="";

Здесь необходимо отметить вот что: при использовании постраничной навигации важно, какие ещё параметры нужно передать по ссылке (как включённые в ссылку для поиска по страницам, так и для того, чтобы остальное содержимое страницы не изменялось). Если Вы хотите, чтобы изначальная ссылка на эту страницу выглядела как company/news.php?a=test&b=test2, то допишите следующие строки после этой:
$AllValues["companynews_list"]["url_parameters"]=Add_Param_To_Link($AllValues["companynews_list"]["url_parameters"],"a=test");
$AllValues["companynews_list"]["url_parameters"]=Add_Param_To_Link($AllValues["companynews_list"]["url_parameters"],"b=test2");
Функция Add_Param_To_Link корректно добавит параметры для ссылки в ссылки постраничной навигации.

if(!isset($_GET["text"])){
$AllValues["companynews_list"]["values"]["text"]="";
} else {
$AllValues["companynews_list"]["values"]["text"]=$_GET["text"];
$AllValues["companynews_list"]["url_parameters"]=Add_Param_To_Link($AllValues["companynews_list"]["url_parameters"],"text=".$_GET["text"]);
if(strlen($_GET["text"])>0):
$AllValues["companynews_list"]["properties"][]="`text` LIKE '%{$_GET["text"]}%'";
endif;

}


Эти строки посвящены инициализации данных для поиска - значения для поля поиска по умолчанию ($AllValues["companynews_list"]["values"]["text"]), добавлению параметров в ссылку ($AllValues["companynews_list"]["url_parameters"]) и добавлению дополнительных условий, налагаемых на выборку новостей (массив $AllValues["companynews_list"]["properties"]).

/Упорядочение
$AllValues["companynews_list"]["order_by"]='ORDER BY id desc';

//Получаем данные инфоблока
$AllValues["companynews_list"]["data"]=Get_News($AllValues["companynews_list"]["block_id"], $AllValues["companynews_list"]["news_per_page"], $AllValues["companynews_list"]["pagenumber"], $AllValues["companynews_list"]["properties"], $AllValues["companynews_list"]["order_by"]);

if(!empty($AllValues["companynews_list"]["data"]["list"])){
$AllValues["companynews_list"]["amount"]=Count_News($AllValues["companynews_list"]["block_id"],$AllValues["companynews_list"]["properties"]);

Эта строка вычисляет общее количество новостей, попадающих под фильтр, для правильного вывода счётчика страниц.

}
?>


engine/gcomponents/news_list/companynews_template.php

<? //3.0.1
//Для того, чтобы вывести перечень переменных, переданных из контроллеров, раскомментируйте следующую строчку
//preprint($AllValues);
?>
<p>Поиск</p>
<table><form id="f1" action="<?=$html_root_dir?>company/news.php" method="GET">
<tr>
<td width="20%">Текст</td>
<td width="80%">
<input type="text" name="text" value="<?=(isset($_GET["text"])?stripcslashes($_GET["text"]):"")?>" size="30">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Искать">
<input type="button" value="Очистить" onclick="location.replace('<?=$html_root_dir?>company/news.php');">
</td></tr>
</form></table>

<!-- конец поиска, начало списка новостей -->


<?if(!empty($AllValues["companynews_list"]["data"]["list"])){ //Если непуст список элементов
?>

Ниже следует счётчик страниц с шаблоном common:

Страницы: <?=Page_Counter($AllValues["companynews_list"]["news_per_page"], $AllValues["companynews_list"]["pagenumber"], $AllValues["companynews_list"]["amount"], $html_root_dir."company/news.php".$AllValues["companynews_list"]["url_parameters"], "common")?><br><br>
<?foreach($AllValues["companynews_list"]["data"]["list"] as $Item){?>
<p>
Имя: <?=$Item["name"]?><br>
Текст: <?=$Item["text"]?><br>

Строчкой ниже идёт вывод картинки. Если база не редактировалась вручную, то достаточно проверки if($Item["photo"]>0). Функция get_html_path имеет параметр - номер уровня. Если номер уровня 0, то показывается загруженная картинка. Если номер уровня больше 0, то показывается картинка соответствующего уровня того типа, который был введён при создании поля. Адрес картинки при этом $engine_path/photos/нАЗВАНИЕиНФОБЛОКА/нОМЕРэЛЕМЕНТАвкОТОРЫЙбЫЛАзАГРУЖЕНАкАРТИНКА/нОМЕРкАРТИНКИ_нОМЕРуРОВНЯ.рАСШИРЕНИЕзАГРУЗКИ. В нашем случае это photos/news/1/1_0.jpg.
Тип картинки можно посмотреть при редактировании поля: Инфоблоки - Кнопка с карандашом напротив блока ("Редактировать блок") - кнопка с карандашом напротив поля.
Редактировать блок
Редактировать поле
Тип картинки
Какие уровни созданы для типа картинок, можно найти в административной панели: вкладка "Настройки", ссылка "Картинки".
Настройки - картинки
Список типов и уровней картинок


Фото: <?if((isset($Item["photo"]))&&($Item["photo"]<>0)&&($Item["photo"]<>NULL)){?><img src="<?=photo::get_by_id($Item["photo"])->get_html_path(0)?>"><?}?><br>
Тип: <?=$Item["typ"]?><br>
<a href="<?=$html_root_dir?>company/detail.php?id=<?=$Item["id"]?>">Подробнее</a><br>
</p>
<?}?>
Страницы: <?=Page_Counter($AllValues["companynews_list"]["news_per_page"], $AllValues["companynews_list"]["pagenumber"], $AllValues["companynews_list"]["amount"], $html_root_dir."company/news.php".$AllValues["companynews_list"]["url_parameters"], "common")?><br><br>
<?}else{?>
Нет элементов, удовлетворяющих заданным условиям!
<?}?>

Valid HTML 4.01 Strict Valid CSS!