We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 257
    • 6 Posts
    Давно хотел написать легкий сниппет выводящий несколько новостей.
    Тем паче что 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);
    ?>