Вывод секций для публикаций 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 - она умеет проверять права на доступ к ресурсам.
0
👍
👎
❤️
🔥
😮
😢
😀
😡
2 095
18.09.2013 08:31:25