Вывод секций для публикаций Tickets

При создании нового тикета, в форме выводится список секций, доступных для пользователя. Чтобы иметь возможность публиковать тикеты, юзер должен быть авторизован и входить в группу, у которой есть разрешение section_add_children для секций тикетов.

По умолчанию, Tickets выбирает все доступные секции, что не очень удобно, если сайт большой. Поэтому, я написал простенький сниппет, который позволяет указать

  • &parents - список контейнеров, где искать секции тикетов
  • &depth - глубина выборки
  • &tpl - шаблон оформления секции
  • &sortby - сортировка, по умолчанию - "menuindex".
  • &sortdir - направление сортировки, по умолчанию "desc".
  • &where - дополнительные параметры выборки.

Возможно, он войдёт в состав Tickets на постоянной основе, но не факт.

<?php
if (!isset($parents)) {$parents = 0;}
if (!isset($depth)) {$depth = 0;}
if (empty($tpl)) {$tpl = '@INLINE <option value="[[+id]]" [[+selected]]>[[+pagetitle]]</option>';}
if (empty($sortby)) {$sortby = 'menuindex';}
if (empty($sortdir)) {$sortdir = 'asc';}

if (!$modx->getService('pdoFetch')) {return false;}
$pdoFetch = new pdoFetch($modx, array());

$class = 'TicketsSection';
$where = array('deleted' => 0, 'published' => 1, 'class_key' => 'TicketsSection');

// Получаем возможных родителей секций тикетов
if (!empty($parents)) {
    $parents = array_map('trim', explode(',', $parents));
    if (!empty($depth) && $depth > 0) {
        foreach ($parents as $pid) {
            $parents = array_merge($parents, $modx->getChildIds($pid, $depth));
        }
    }
    if (!empty($parents)) {
        $where['parent:IN'] = $parents;
    }	
}

// Определяем столбцы для получения из таблицы
$resourceColumns = array_keys($modx->getFieldMeta($class));
if (empty($includeContent)) {
    $key = array_search('content', $resourceColumns);
    unset($resourceColumns[$key]);
}
$select = array($class => implode(',',$resourceColumns));

// Добавляем дополнительные условия, если есть
foreach (array('where','select') as $v) {
    if (!empty($scriptProperties[$v])) {
        $tmp = $modx->fromJSON($scriptProperties[$v]);
        if (is_array($tmp)) {
            $$v = array_merge($$v, $tmp);
        }
    }
    unset($scriptProperties[$v]);
}

// Собираем всё в кучу
$default = array(
    'class' => $class,
    'where' => $modx->toJSON($where),
    'select' => $modx->toJSON($select),
    'sortby' => $sortby,
    'sortdir' => $sortdir,
    'limit' => 0,
    'return' => 'data',
    'checkPermissions' => 'section_add_children'
);

// Добавляем в конфиг и запускаем
$pdoFetch->setConfig(array_merge($default, $scriptProperties), false);
$rows = $pdoFetch->run();
$output = '';

// Перекомпонуем массив, чтобы id секций были его ключами
$sections = array();
foreach ($rows as $v) {
    $sections[$v['id']] = $v;
}

// Если это форма редактирования тикета - нужно получить id его секции
$cid = 0;
if (!empty($_REQUEST['tid']) && $current = $modx->getObject('Ticket', $_REQUEST['tid'])) {
    $cid = $current->get('parent');
    // Если текущая секция не была выбрана - нужно добавить отдельно
    if (!isset($sections[$cid]) && $parent = $modx->getObject('TicketsSection', $cid)) {
        $sections[$cid] = $parent->toArray();
    }
}

// Оформляем секции в чанк
foreach ($sections as $row) {
    $row['selected'] = ($cid == $row['id']) ? 'selected' : '';
    $output .= $pdoFetch->getChunk($tpl, $row);
}

return $output;

Требуется версия pdoTools не ниже 1.7.0-beta2 - она умеет проверять права на доступ к ресурсам.

Комментарии (7)
Алексей Карташов
18.09.2013 05:10

Требуется версия pdoTools не ниже 1.7.0-beta2 — она умеет проверять права на доступ к ресурсам.

Уже?? Вот это скорость! Мне б с такой же скоростью разрабатывать =)

bezumkinВасилий Наумкин
18.09.2013 06:51

Ну я умничать не стал, сделал проверку методами MODX - джойнить таблицы в один запрос не выйдет.

Недостатка 2: - Немного замедляется работа. Но это нивелируется возможностью включать\отключать проверку прав. - В выборке pdoResources, с разбивкой на страницы, могут пропадать записи. Типа лимит был 10, а вывело 9, потому что один ресурс не прошел проверку.

Но, в отличии от getResources, у меня хотя-бы плейсхолдер [[+total]] покажет верное значение, потому что при исключении документа из выборки ему делается -1.

Поэтому проверка прав остаётся на совести разработчика. Если не надо - не включаем. Если выводим меню, или личный кабинет, то:

[[!pdoResources?
    &checkPermissions=`view`
]]

По умолчанию, понятно, это отключено.

Алексей Карташов
18.09.2013 07:22

Ну вообще, по хорошему надо проверять не 'view', а 'list'. И нужным группам ресурсов назначать (или нет), соответственно, тоже 'list'-разрешение.

Потому что сам modx в своих getlist-процессорах проверяет именно 'list'. (это я пишу для тех, кто потом будет бездумно код копировать)). 'View' проверяется при просмотре объекта (в get-процессоре).

p.s. да по-любому можно как-то хитро к запросу приджойнить нужные условия. Надо будет на досуге погуглить-поэкспериментировать. Главное правильно запрос написать, а уж в pdoTools встроить будет делом техники =)

bezumkinВасилий Наумкин
18.09.2013 10:30

Это ты уж сам решай - указывать можно любые разрешения, даже через запятую.

Проверяться будет выбираемый ресурс, что ты к нему приджойнишь - не важно.

Виталий Князь
18.09.2013 06:26

Теперь бы еще в Tickets была возможность добавлять статьи в избранное (как на habrahabr) и тэги, иначе спустя какое-то время день со днем не сыщешь, хотя помнишь что где-то было на сайте bezumkin.ru.

bezumkinВасилий Наумкин
18.09.2013 06:52

Когда вернусь к разработке Tickets - сделаю.

Ты подвесь пока задачу на github, чтобы я не забыл.

susliktНиколай
23.12.2013 11:56

Если сниппет вызывать с параметром depth вываливает ошибку (ERROR @ /connectors/resource/index.php) Instantiated a derived class modDocument that is not a subclass of the requested class TicketsSection

Если не указывать,то ищет разделы с тикетами только на уровне родителя, глубже не идет.

ЕвгенийК
09.04.2022 03:35
Это хорошо, что такая возможность есть и может быть использована. А то тенденция, мания, что-то в по...
begoodco1
07.04.2022 05:49
Зарегистрировался чтобы выразить благодарность за доступное и подробное описание процесса. Была возм...
bezumkin
Василий Наумкин
18.03.2022 12:35
Авторизация есть из коробки, для входа в базовую админку. Можно установить через composer и собрать ...
bezumkin
Василий Наумкин
10.03.2022 12:08
Ну, я имел в виду, что по закону можно =) А в реальности с валютой очевидные проблемы.
Сергей Лелеко
04.03.2022 06:12
О как! не знал! спасибо
bezumkin
Василий Наумкин
01.03.2022 15:32
Я делал одного бота на botman/botman, но из-за своей универсальности конкретно с Телеграм на нём раб...
bezumkin
Василий Наумкин
25.02.2022 09:22
P.S. Кажется цитаты у тебя никак не стилизуются в комментариях... Спасибо, поправил!
Electrica
Михаил
08.02.2022 11:19
Работает!
Алексей
09.01.2019 10:55
Насыщенный год ) От души поздравляю с ДР! Счастья, успехов и семейного благополучия! Жаль лимит заме...
septa rose
28.05.2018 22:16
hmmm, keren abis