© Сделано на LiveStreet
Дизайн - ©2009 MODx RED Group
Реализованная без 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';
// Проверка ID родительского документа
if(!isset($id))$id = $modx->documentIdentifier;
// Проверка 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
$child = $modx->getActiveChildren($id,$sort,$dir,$fields_txt);
// Обработка даты
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
foreach ($tv_ar as $value){if($value['contentid']==$doc['id']){$tv_on=true;break;}ELSE{$tv_on=false;}}
if($tv_enable==true && $tv_on=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);
}
}
}
echo $parse_with_tv;
}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);
?>
Комментарии (23)
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
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.