© Сделано на LiveStreet
Дизайн - ©2009 MODx RED Group
Реализованная поддержка неограниченного количества родительских ID
Большое спасибо за это ManManovich.
Реализованная без API поддержка TV
&tv_name — необходимые TV параметры через запятую.
По умолчанию все TV
Зависит от: &tv_enable
&tv_enable — Определяет, включен ли механизм подстановки TV параметров: значения TRUE / FALSE
В шаблон нужно добавить плейсхолдер [~+tv_name+~] в который выведется содержание TV.
Например есть TV-картинка и TV текстовое поле с системными именами image и text соответственно.
Что бы вывести их в шаблон вставляем плейсхолдеры [~+image+~] и [~+text+~].
А вызов добавляем &tv_name=`image,system`
По умолчанию FALSE
&fields — поля, необходимые к получению. Желательно указывать, для уменьшения нагрузки к БД.
По умолчанию «id,pagetitle,description,alias,menutitle,longtitle,content,introtext,pub_date»
<?php
/*
Сниппет вывода новостей MiniNEWS v0.3.2
Пример вызова:
[!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:
&id - ID родительского документа (если несколько - то через запятую)
По умолчанию "ID текущей страницы"
&dir - направление сортировки DESC ASC
По умолчанию "DESC"
&sort -поле для сортировки
По умолчанию "createdon"
&total - общее количество возвращаемых документов
По умолчанию "нет"
&fields - поля, необходимые к получению. Желательно указывать, для уменьшения нагрузки к БД.
По умолчанию "id,pagetitle,description,alias,menutitle,longtitle,content,introtext,createdon"
&data - формат даты
По умолчанию "%d.%m.%Y - %A"
&tv_name - TV параметры через запятую.
В шаблон нужно добавить плейсхолдер [~+tv_name+~] в который выведется содержание TV .
Например есть TV-картинка и TV текстовое поле с системными именами image и text соответственно.
Что бы вывести их в шаблон вставляем плейсхолдеры [~+image+~] и [~+text+~].
А вызов добавляем &tv_name=`image,system`
По умолчанию все TV
Зависит от: &tv_enable
&tv_enable - Определяет, включен ли механизм подстановки TV параметров: значения TRUE / FALSE
По умолчанию FALSE
&tpl - шаблон документа - чанк, что содержит плейсхолдеры, соответствующие названиям заданных полей
По умолчанию: "<dl class="mininews"><dt><a href="[~+id+~]">[~+pagetitle+~]</a> - [~+createdon+~]</dt><dd>[~+introtext+~]</dd></dl>"
Поля (плейсхолдеры) по умолчанию:
[~[~+id+~]~] - ссылка
[~+id+~] - ID
[~+pagetitle+~] - заголовок
[~+description+~] - описание
[~+alias+~] - псевдоним
[~+menutitle+~] - название ссылки
[~+longtitle+~] - расширенный заголовок
[~+content+~] - содержание документа
[~+introtext+~] - сокращенное содержание
[~+createdon+~] - дата
*/
// Поехали! Кот, одмин, шредер!
// Проверка поля для сортировки
if(!isset($sort))$sort = 'createdon';
// Проверяем поля:
if(!isset($fields))
{
$fields = array('id','pagetitle','description','alias','menutitle','longtitle','content','introtext','createdon');
}ELSE{
$fields = explode(",",$fields);
}
// Проверка направления сортировки
if(!isset($dir))$dir = 'DESC';
// Проверка переменной формата даты
if(!isset($data))$data = '%d.%m.%Y - %A';
//удаляем пробелы из строки c id
$setids2 = trim($setids, " ");
//делаем массив родительских id
$ids = explode( "," , $setids2);
// Проверка ID родительского документа, если не установлена, то id документа не котором вызван сниппет
if(!isset($ids))$ids = $modx->documentIdentifier;
// определяем переменную child и говорим что она массив, иначе ругается
$child = array();
// Проверка TV?
if(!isset($tv_enable))$tv_enable=false;
// Проверка шаблона
if(isset($tpl)){
$chunk = $modx->getChunk($tpl);
}ELSE{
$chunk = '<dl class="mininews"><dt><a href="[~[~+id+~]~]">[~+pagetitle+~]</a> - [~+createdon+~]</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
// переводим указатель в массиве ids на первый элемент
reset($ids);
//получаем активные документы из указанных папок и записываем их в один массив
while (list($key, $id) = each($ids)) {
$child1 = $modx->getActiveChildren($id,$sort,$dir,$fields_txt);
$child = array_merge( $child,$child1);
}
//функция сортировке полученного массива по дате
function cmp ($a,$b)
{
return $b[createdon] - $a[createdon];
}
//вызываем функцию
usort($child, "cmp");
// Обработка даты
setlocale(LC_TIME, '');
foreach($child as $key => $value){
$data_i = strftime($data,$value["createdon"]);
$child[$key]["createdon"]= $data_i;
}
//print_r($child);
// Устанавливаем количество интераций
if(!isset($total))$total = sizeof($child);
if($total > sizeof($child))$total = sizeof($child);
// Выдергиваем TV
if($tv_enable==true){
// Формируем список всех ID
for ($i = 0; $i < $total; $i++){
$doc = $child[$i];
if(isset($id_arr))
{
$in = $id_arr.','.$doc['id'];
$id_arr = $in;
}ELSE{
$id_arr= $doc['id'];
}
}
// Вытаскиваем префикс
$dbprefix = $modx->db->config['table_prefix'];
// Формируем запрос к получению TV
if(isset($tv_name)){
$tv_que=str_replace(',','\',\'',$tv_name);
$q_i=' AND '.$dbprefix.'site_tmplvars.name IN (\''.$tv_que.'\')';
}ELSE{
}
$q='SELECT '.$dbprefix.'site_tmplvar_contentvalues.value, '.$dbprefix.'site_tmplvars.name, '.$dbprefix.'site_tmplvar_contentvalues.contentid FROM '.$dbprefix.'site_tmplvar_contentvalues INNER JOIN '.$dbprefix.'site_tmplvars ON '.$dbprefix.'site_tmplvar_contentvalues.tmplvarid = '.$dbprefix.'site_tmplvars.id WHERE '.$dbprefix.'site_tmplvar_contentvalues.contentid IN ('.$id_arr.')'.$q_i.'';
// Получаем TV
$result = $modx->db->query($q);
for ($tv_ar=array(); $row=mysql_fetch_assoc($result);$tv_ar[]=$row);
}
// Основной цикл
for ($i = 0; $i < $total; $i++) {
$doc = $child[$i];
// Поиск и замена плейсхолдеров
$parce = str_replace($place_arr,$doc,$chunk);
// Создание и добавление ссылки
$url = $modx->makeUrl($doc['id']);
$parse_with_links = str_replace('[~[~+id+~]~]',$url,$parce);
// Формируем TV
if($tv_enable==true){
foreach ($tv_ar as $value)
{
if($value['contentid']==$doc['id']){
$tv_place='[~+'.$value[name].'+~]';
if(isset($parse_with_tv))
{
$str_i = str_replace($tv_place,$value[value],$parse_with_tv);
$parse_with_tv = $str_i;
}ELSE{
$parse_with_tv = str_replace($tv_place,$value[value],$parse_with_links);
}
}
}
if (!empty($value[value])){
echo $parse_with_tv;
}ELSE{
echo $parse_with_links;
}
}ELSE{
echo $parse_with_links;
}
// УСЁ!!!
unset($parse_with_tv);
}
// удаляем переменные для возможности многократного вызова
unset($id, $sort, $dir, $fields_txt, $data, $tpl, $tv_name, $total, $i, $int, $tv_name,$tv_enable);
?>
Комментарии (53)
RSS свернуть / развернутьpitbull
abadello
NevroZ
abadello
iJack
Следуя принципам — вывести новости как можно менее затратным способом эта поддержка скорее полуавтоматическая. Подробности в коде, там все описано.
abadello
iJack
abadello
$modx->db->query();
Это позволит не делать лишнее подключение к БД + системный счетчик кол-ва запросов к БД.
iJack
abadello
abadello
abadello
abadello
аЂб�аЕб�б�б� аНаОаВаОб�б�б� — 01.01.1970
аЂб�аЕб�б�б� аНаОаВаОб�б�б�
а�аОб�б�б�аАб� аИаНб�аОб�аМаАб�аИб� аИаЗ аЖаИаЗаНаИ аНаАб�аЕаКаОаМб�б�…
а�аОаВаОб�б�б� аНаОаМаЕб� аДаВаА — 01.01.1970
а�аОаВаОб�б�б� аНаОаМаЕб� аДаВаА:
б�аАаМаАб� аПб�аЕаКб�аАб�аНаАб� аНаОаВаОб�б�б� аНаА б�аВаЕб�аЕ — аОб�аЕаНб� аИаНб�аЕб�аЕб�аНаАб� аНаОаВаОб�б�б� — б�аМаОб�б�аИб�аЕ, б�аИб�аАаЙб�аЕ, аВаНаИаМаАаЙб�аЕ…
а�аОаВаОб�б�б� аНаОаМаЕб� аОаДаИаН — 01.01.1970
а�аОаВаОб�б�б� аНаОаМаЕб� аОаДаИаН:
аНаЕаКаОб�аОб�аОаЕ аКб�аАб�аКаОаЕ аОаПаИб�аАаНаИаЕ аНаОаВаОб�б�аИ
« MODx Parse Error »
MODx encountered the following error while attempting to parse the requested resource:
« `` is not numeric and may not be passed to makeUrl() »
— EVO-1.0.2
kalina
abadello
abadello
abadello
Есть еще ошибки.
1. В разделе три документа. Дату публикации у документов я не ставил.
Все три вывелись нормально, за исключением их дат:
01.01.1970
2. Поставил у Двух документов даты публикации:
Новость номер два 26 02-02-2010 01:54:00
Новость номер один 22 01-02-2010 01:52:00
Новости вывелись в таком виде:
Новость номер два — 02.02.2010
Самая прекрасная новость на свете — очень интересная новость — смотрите, читайте, внимайте…
Новость номер один — 02.02.2010
некоторое краткое описание новости
Третья новость — 02.02.2010
Горячая информация из жизни насекомых…
т.е.
дата вывелась везде одинаковая, при этом у Третьего документа дата публикации не выставлена.
Шаблон использую дефолтный; EVO-102; кодировка UTF-8
kalina
iJack
Думал сначала публикацию выводить, но пото уже понял что createdon адекватнее воспримится массами ))
Просто нашел косяк, с которым никак не разберусь, как поправлю только, сразу все и выкачу.
abadello
Dorimen
Есть известная ошибка с использованием TV. Когда указано что TV есть а их нет.
Катастрофически не хватает времени.
abadello
abadello
А не подскажете, как например к документу через TV подцепить неограниченное количество изображений, а не только одно?
lesch
pitbull
Создал страницы с новостями (дочерними к той из которой вызываю снипет).
Вызываю сниппет [!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
и… ничего не наблюдаю. Подскажите, пожалуйста, что я делаю неправильно?
SlavaRom
Сниппет постоянно использую сам, все работает, кроме известного и описанного бага с TV — но вы их и не используете.
И еще — сниппет выводит пустой HTML или даже его не выводит?
abadello
SlavaRom
SlavaRom
Несколько новостей вывести у сниппета получается отлично.
А данная ошибка еще может возникать из-за того, что в выводе вы активировали поддержку TV, но не заполнили поля у документов (которые и должны вывестись) — эта ошибка известна.
abadello
Есть параметр &id — ID родительского документа, я так понял, что как и в Ditto, информация, которая должна выводится в новости должна находится в дочерних ресурсах (страницах). Выше я уже писал: Вы написали в ответ:Опишите, пожалуйста, подробно как запустить MiniNEWS на простейшем примере. Кроме сниппета, чанка и указанной строчки ничего вводить/выводить не надо?
SlavaRom
и пришлите мне исходный код страницы, пожалуйста.
abadello
Страница в при редактировании в админке (в режиме html):
SlavaRom
SlavaRom
А
abadello
SlavaRom
abadello
http://s54.radikal.ru/i144/1004/28/a3181dbae183.png
как это исправить?
Trent
Trent
abadello
ManManovich
ManManovich
abadello
[!MiniNEWS? &id=`1, 10, 42`!] Соответственно он ищет и выводит последние документы из нескольких указанных директорий.
ManManovich
Вместо параметра "&id=`19`" в вызове сниппета, будет "&setids=`19, 82, 49`"
ManManovich
Mini news:
время на запросы к базе данных: 0.0115 s
запросов к базе данных: 11
общее время на генерацию страницы: 0.0443 s
время на работу PHP скриптов: 0.0328 s
ListIndexer
время на запросы к базе данных: 0.1456 s
запросов к базе данных: 14
общее время на генерацию страницы: 0.1790 s
время на работу PHP скриптов: 0.0335 s
ManManovich
Просьба админа вот отсюда community.modx-cms.ru/blog/addons/436.html#comment7372 вырезать код — что бы не дублировать и не растягивать тему. Спасибо.
abadello
[!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:
&id — ID родительского документа (если несколько — то через запятую)
По умолчанию «ID текущей страницы»
на
[!MiniNEWS? &setids=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:
&setids — ID родительского документа (если несколько — то через запятую)
По умолчанию «ID текущей страницы»
Можно и код переписать, чтоб вызов &id=`13, 14,15`не менять. Те я его переписал, брать отсюда: чтоб не удлиннять тему ;)
ManManovich
Carw
abadello
ManManovich
Carw
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.