Модификация формы создания тикета

Всем привет.

Есть такой вопрос по Тикетам. В форме создания тикета есть выпадающее меню с выбором раздела с тикетами. Вот так этот фрагмент выглядит в чанке tpl.Tickets.form.create
<select name="parent" class="input-xxlarge">[[+sections]]</select>
А вот так он выглядит на странице
<select name="parent" class="input-xxlarge">
<option value="76" >Тикет 1</option>
<option value="72" >Тикет 2</option>
</select>
Задача в следующем. Необходимо, чтобы в этом выпадающем списке Тикеты делились по родителям, оборачиваясь в тег . Примерно вот так
<select name="parent" class="input-xxlarge">
<optgroup label="Родитель 1">
<option value="76" >Тикет 1</option>
<option value="72" >Тикет 2</option>
</optgroup>
<optgroup label="Родитель 2">
<option value="76" >Тикет 3</option>
<option value="72" >Тикет 4</option>
</optgroup>
</select>
Родителя нельзя выбрать в этом выпадающем списке, это обычный документ-контейнер, в списке он будет служить для удобного отображения большого списка разделов с тикетами.
Где формируется этот выпадающий список и как лучше всего это воплотить?
Roman Smile
12 мая 2013, 02:29
modx.pro
2
1 975
0

Комментарии: 7

Василий Наумкин
12 мая 2013, 07:18
0
Формируется вот здесь, воплолить только изменением исходников.
    Алексей
    12 мая 2013, 09:12
    1
    0
    О, я такое делал, все просто.

    В чанке создания/редактирования тикета заменяем select на другой:
    <select name="parent" >[[!getSectionsList]]</select>
    И создаем сниппет getSectionsList с примерно такм кодом (только на 16 строке необходимо поменять условие, там задан родитель «0» и в моем случае template):
    <?php
    $tpl = '<option value="[[+id]]" [[+selected]]>[[+title]]</option>';
    $current = 0;
    if(isset($_REQUEST['parent'])){
        $current = intval($_REQUEST['parent']);
    }
    else if(isset($_REQUEST['tid'])){
        $post = $modx->getObject('modResource', intval($_REQUEST['tid']));
        if($post != null){
            $current = $post->get('parent');
        }
    }
    
    $q = $modx->newQuery('modResource');
    $q->where(array('parent' => 0, 'template' => 16, 'published' => 1, 'deleted' => 0));
    $q->sortby('menuindex', 'ASC');
    $parents = $modx->getCollection('modResource', $q);
    $parentsIds = array();
    foreach($parents as $parent){
        $parentsIds[] = $parent->get('id');
    }
    
    $q = $modx->newQuery('modResource');
    $q->where(array('parent:IN' => $parentsIds, 'template' => 14, 'published' => 1, 'deleted' => 0));
    $q->sortby('menuindex', 'ASC');
    $blogs = $modx->getCollection('modResource', $q);
    
    $output = array();
    foreach($parents as $parent){
        $output[] = '<optgroup label="'.$parent->get('pagetitle').'">';
        $pid = $parent->get('id');
        foreach($blogs as $blog){
            if($blog->get('parent') == $pid){
                $selected = $current == $blog->get('id') ? 'selected="selected"' : '';
                $option = str_replace('[[+title]]', $blog->get('pagetitle'), $tpl);
                $option = str_replace('[[+id]]', $blog->get('id'), $option);
                $option = str_replace('[[+selected]]', $selected, $option);
                $output[] = $option;
            }
        }
        $output[] = '</optgroup>';
    }
    return implode("\n", $output);
      Василий Наумкин
      12 мая 2013, 09:30
      0
      Толково! Я и не подумал про сниппет.

      Несколько замечаний:
      — при такой выборке не будет проверки разрешения юзера на публикацию тикета в секцию.
      — сниппет можно сократить раза в 2, если добавить джоинов и в условии сразу указать class_key = TicketsSection.
      str_replace принимает для замены массивы, 3 раза подряд запускать его не нужно.
        Алексей
        12 мая 2013, 10:00
        0
        Спасибо за замечания, на коленке писал, торопясь, надо у себя поправить.

        А насчет проверки — мне она не была нужна, поэтому даж чето и не думал об этом.
          Виталий Греков
          19 июня 2013, 21:57
          0
          на коленке писал, торопясь, надо у себя поправить.
          Скажите, Алексей, нашлось время поправить?

            Наумов Алексей
            20 июня 2013, 09:20
            0
            Нет, я больше ничего не делал в этом направлении!
        Roman Smile
        12 мая 2013, 11:34
        0
        Спасибо, работает, как родное)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7