Создание страницы "конкретный элемент такого-то инфоблока"
Для того, чтобы создать страницу "конкретный элемент инфоблока" (или "элемент подробно"), нужно предварительно проверить, что в инфоблоке есть хотя бы один элемент. Если нет - создайте тестовый элемент.
Далее нужно зайти во вкладке "Страницы" по ссылке "Действия с элементами".
Выбираем нужный инфоблок (в моём случае - "Новости"), тип страницы "Элемент подробно", вписываем название шаблона - например, "companynews_detail" (подставьте сюда своё название).
Выбираем название для файла, например, "article.php" (подставьте сюда своё название). Выберем шаблон (например, common). Нажимаем кнопку "К следующему шагу".
Отступление для программиста
После завершения создания мы получим три файла: engine/gcomponents/news_detail/companynews_detail_controller.php и engine/gcomponents/news_detail/companynews_detail_template.php (именованные по названию шаблона) и файл article.php (именованный по названию файла).
Файл article.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_detail/companynews_detail_controller.php");
include_once($root_dir.$engine_path."engine/templates/common/common_header.php");
include_once($root_dir.$engine_path."engine/gcomponents/news_detail/companynews_detail_template.php");
include_once($root_dir.$engine_path."engine/templates/common/common_footer.php");
?>
Файлы engine/gcomponents/news_detail/companynews_detail_controller.php и engine/gcomponents/news_detail/companynews_detail_template.php создаются из стандартных образцов, при необходимости можно изменить эти стандартные образцы (но делать это не рекомендуется, поскольку эти файлы обновляемы вместе с обновлениями админки и будут перезаписаны, если в обновлении они изменены). Образцы находятся по адресу engine/components/standart/news_detail_controller.php и engine/components/standart/news_detail_template.php.
Конец отступления для программиста
После этого мы выбираем необходимые параметры.
Имя массива лучше изменить с имени по умолчанию. Иначе, если Вам потребуется подключить два контроллера на одной странице, а у них будет одинаковое имя массива, данные перекроются. Для каждого типа страниц имя по умолчанию своё.
Условие, при невыполнении которого выводится сообщение об ошибке. Используется, если Вы хотите показывать пользователю только какие-то конкретные элементы. Для условия по умолчанию (active=1) показываются только те элементы, которые в админке активны (зелёная точка напротив них). Если Вы хотите деактивировать элемент, нужно нажать на эту точку, она сменится красной. Если Вы хотите активировать элемент, нужно нажать на красную точку, она сменится зелёной.
Условие active=1 снимать не рекомендуется (а добавлять к нему можно любые комбинации, которые можно подставить в sql-запрос SELECT после слова WHERE для таблицы текущего инфоблока ПРЕФИКСтАБЛИЦ_blocks_нАЗВАНИЕиНФОБЛОКА), но если Вы хотите выводить любой элемент, то можете просто убрать условие.
Далее назначим сообщение об ошибке, например, "Новость не существует или устарела."
Далее напишем ссылку на страницу списка новостей. Ссылка пишется от корня (в неё будет автоматически добавлена переменная $html_root_dir в начало).
Далее выбираем нужный перечень полей и размер картинок и нажимаем "Завершить создание". После этого страницу можно просмотреть в новом окне. По умолчанию откроется последний существующий элемент инфоблока (т.е. с максимальным номером). При этом если этот элемент не удовлетворяет указанному на предыдущем шаге условию, то появится сообщение об ошибке.
Для того, чтобы просмотреть другие элементы, необходимо поменять номер в конце полученной ссылки на номер соответствующего элемента.
Разумно будет также определить, что делать, если номер (то есть параметр $_GET["id"]) не задан никак. Можно, например, определить его по умолчанию последним элементом, существующим элементом, или, наоборот, несуществующим перед подключением контроллера или в начале контроллера:
if(!isset($_GET["id"])){ $_GET["id"]=0; }
- присвоение данному параметру номера несуществующего элемента.
Если Вы хотите вывести один конкретный элемент инфоблока, то в этом случае Вам нужно просто написать в строчке контроллера
//Получение данных об элементе
$AllValues["news_detail"]["data"]=Get_News_By_Id($AllValues["news_detail"]["block_id"],$_GET["id"],$AllValues["news_detail"]["properties"]);
вместо $_GET["id"] соответствующий номер.
В заключение привожу код контроллера и темплейта с комментариями.
engine/gcomponents/news_detail/companynews_detail_controller.php
<? //3.0.6
//Номер инфоблока, из которого берутся данные
$AllValues["news_detail"]["block_id"]=1;
//Запись условий, при которых пользователю показывается элемент
$AllValues["news_detail"]["properties"]="active=1";
//Получение данных об элементе
$AllValues["news_detail"]["data"]=Get_News_By_Id($AllValues["news_detail"]["block_id"],$_GET["id"],$AllValues["news_detail"]["properties"]);
//Если элемент существует и удовлетворяет условиям, то показывать его
if($AllValues["news_detail"]["data"]<>NULL){
$AllValues["news_detail"]["show"]=true;
} else {
$AllValues["news_detail"]["show"]=false;
}
?>
engine/gcomponents/news_detail/companynews_detail_template.php
<? //3.0.1
//Для того, чтобы вывести перечень переменных, переданных из контроллеров, раскомментируйте следующую строчку
//preprint($AllValues);
?>
<?if($AllValues["news_detail"]["show"]){ //элемент разрешён к показу
?>
Здесь начинается перечень полей - для удобства форматирования.
Имя: <?=$AllValues["news_detail"]["data"]["list"]["name"]?><br>
Анонс: <?=$AllValues["news_detail"]["data"]["list"]["preview"]?><br>
Текст: <?=$AllValues["news_detail"]["data"]["list"]["text"]?><br>
Фото: <?if((isset($AllValues["news_detail"]["data"]["list"]["photo"]))&&($AllValues["news_detail"]["data"]["list"]["photo"]<>0)&&($AllValues["news_detail"]["data"]["list"]["photo"]<>NULL)){?><img src="<?=photo::get_by_id($AllValues["news_detail"]["data"]["list"]["photo"])->get_html_path(0)?>"><?}?><br>
Это проверка на то, есть ли картинка в элементе. Если Вы не меняете таблицу с картинками (ПРЕФИКСтАБЛИЦ_photos) вручную, то достаточно проверки if($AllValues["news_detail"]["data"]["list"]["photo"]>0).
Тип: <?=$AllValues["news_detail"]["data"]["list"]["typ"]?><br>
Новость: <?=$AllValues["news_detail"]["data"]["list"]["n1"]?><br>
<br>
<a href="<?=$html_root_dir?company/news.php>">Список элементов раздела</a>
<?}else{?>
Новость не существует или устарела.
<?}?>
|