Давно хотел написать легкий сниппет выводящий несколько новостей.
Тем паче что Ditto большой, толстый и два на страницу глючат очень сильно.
Прошу использовать при желании.
И конечно же прошу совета:
Как использовать плейсхолдеры типа [+body+] в сниппете — такое ощущение что MODx их вырезает с корнем?
<?php
/*
Сниппет вывода новостей MiniNEWS v0.01
Пример вызова:
[!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:
&id - ID родительского документа
По умолчанию "ID текущей страницы"
&dir - направление сортировки DESC ASC
По умолчанию "DESC"
&sort -поле для сортировки
По умолчанию "pub_date"
&total - общее количество возвращаемых документов
По умолчанию "нет"
&data - формат даты
По умолчанию "d.m.Y"
$tpl - шаблон документа - чанк, что содержит плейсхолдеры, соответствующие названиям заданных полей
По умолчанию: "<dl class="mininews"><dt><a href="[~+id+~]">[~+pagetitle+~]</a> - [~+pub_date+~]</dt><dd>[~+introtext+~]</dd></dl>"
Поля (плейсхолдеры) по умолчанию:
[~[~+id+~]~] - ссылка
[~+id+~] - ID
[~+pagetitle+~] - заголовок
[~+description+~] - описание
[~+alias+~] - псевдоним
[~+menutitle+~] - название ссылки
[~+longtitle+~] - расширенный заголовок
[~+content+~] - содержание документа
[~+introtext+~] - сокращенное содержание
[~+pub_date+~] - дата
Для добавления необходимых полей нужно прописать их ниже в значение массива $fields
*/
/*КОНФИГУРАЦИЯ: задаем поля:*/
$fields = array(’id’,’pagetitle’,’description’,’alias’,’menutitle’,’longtitle’,’content’,’introtext’,’pub_date’);
/*Поехали! Кот, одмин, шредер!*/
/*Проверка поля для сортировки*/
if(!isset($sort))$sort = ’pub_date’;
/*Проверка направления сортировки*/
if(!isset($dir))$dir = ’DESC’;
/*Проверка переменной формата даты*/
if(!isset($data))$data = ’d.m.Y’;
/*Проверка ID родительского документа*/
if(!isset($id))$id = $modx->documentIdentifier;
/*Проверка шаблона*/
if(isset($tpl)){
$chunk = $modx->getChunk($tpl);
}ELSE{
$chunk = ’<dl class="mininews"><dt><a href="[~[~+id+~]~]">[~+pagetitle+~]</a> - [~+pub_date+~]</dt><dd>[~+introtext+~]</dd></dl>’;
}
/*Готовим к использованию поля - переводим массив в тест и создаем массив плейсхолдеров*/
for ($i = 0; $i < sizeof($fields); $i++) {
if(isset($fields_txt)){
$fields_txt = $fields_txt.’,’.$fields[$i];
}ELSE{
$fields_txt =$fields[$i];
}
$place_arr[$i] = ’[~+’.$fields[$i].’+~]’;
}
/*Запрос в API*/
$child = $modx->getActiveChildren($id,$sort,$dir,$fields_txt);
/*Обработка даты*/
foreach($child as $key => $value){
$data = date($data,$value["pub_date"]);
$child[$key]["pub_date"]= $data;
}
/*Устанавливаем количество интераций*/
if(!isset($total))$total = sizeof($child);
/*Основной цикл*/
for ($i = 0; $i < $total; $i++) {
$doc = $child[$i];
/*Поиск и замена плейсхолдеров*/
$parce = str_replace($place_arr,$doc,$chunk);
/*Создание и добавление ссылки*/
$url = $modx->makeUrl($doc[’id’]);
$links = str_replace(’[~[~+id+~]~]’,$url,$parce);
/*УСЁ!!!*/
echo $links;
}
/*удаляем переменные для возможности многократного вызова*/
unset($id);
unset($sort);
unset($dir);
unset($fields_txt);
unset($data);
unset($tpl);
?>