Снова о дополнительных TV-полях в TicketForm

Приветствую!
Вопрос, касающийся дополнительных tv-параметров для формы Tickets.

Было время, когда на многих ресурсах поднимался этот вопрос, но потом все как-то дружно замолчали, как будто узнали решение :) И всё, что я сейчас смог найти, это комментарии двух- а то и трёхлетней давности, из которых толком ничего почерпнуть не получилось.
Суть задачи в следующем: нужно добавить несколько полей типа select в форму создания тикета.
С обычными текстовыми полями проблем не возникает.

Выпадающий список оформил так:
<select name="tv_name" id="tv_id">[[+tv_name]]</select>
У сниппета в настройках allowedFields добавил tv_name.
Но в форме выпадающий список не работает — визуально он отображается, но самих данных в нём нет.

Из комментариев понял, что для отображения выпадающего меню нужно написать отдельный сниппет. А что это за сниппет, и как его прикрутить к форме, толком не объясняется.
Очень прошу помочь! без дополнительных полей никак не обойтись.
Александр
23 апреля 2015, 17:57
modx.pro
6
5 156
0

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

Александр
24 апреля 2015, 09:10
0
Неужели никому не нужны селект-боксы в тикетах?!
    but1head
    24 апреля 2015, 09:49
    +2
    Этого не хватит?
    if($mode == 'new' && $resource->class_key == 'Ticket' && $modx->event->name == 'OnDocFormSave'){
    	$resource->setTVValue('имя тв', $_POST['название поля']);
    }
    У меня тут все на tv, услуги и марки множественный селект в админке
      Александр
      24 апреля 2015, 10:00
      0
      Я извиняюсь, а куда это нужно прописать? ) в плагин Tickets или сниппет TicketForm?
      Пробовал и туда, и туда — безрезультатно (
        but1head
        24 апреля 2015, 10:02
        0
        новый плагин создайте, событие OnDocFormSave
        Александр
        24 апреля 2015, 10:02
        0
        Множественный селект нужно чтобы пользователь мог выбирать, в этом загвоздка вся.
          but1head
          24 апреля 2015, 10:03
          +1
          $services_services = implode("||", $_POST['services_services']);
          			if (!$resource->setTVValue('services_services', $services_services)) {
          				  $modx->log(xPDO::LOG_LEVEL_ERROR, 'services_services - ERROR');
          			}
          в админке разделитель ||
            Александр
            24 апреля 2015, 10:33
            0
            Запутался немного.

            У меня параметр: tv1
            Возможные значения ввода: Квартиры||Комнаты||Гаражи||Офисы||

            В чанке с формой такой код:
            <select name="tv1" id="ticket-type">[[+tv1]]</select>
            Создал плагин ticket_select с кодом:
            if($mode == 'new' && $resource->class_key == 'Ticket' && $modx->event->name == 'OnDocFormSave'){
            	$resource->setTVValue('tv1', $_POST['tv1']);
            }
            Куда нужно прописать вот этот код и что в нем нужно заменить?
            $services_services = implode("||", $_POST['services_services']);
            	if (!$resource->setTVValue('services_services', $services_services)) {
            		$modx->log(xPDO::LOG_LEVEL_ERROR, 'services_services - ERROR');
            	}
              but1head
              24 апреля 2015, 10:37
              +2
              Весь код плагина
              <?php
              if($mode == 'new' && $resource->class_key == 'Ticket' && $modx->event->name == 'OnDocFormSave'){
              	$tv1 = implode("||", $_POST['tv1']);
              	if (!$resource->setTVValue('tv1', $tv1)) {
              		$modx->log(xPDO::LOG_LEVEL_ERROR, 'tv1 - ERROR');
              	}
              }

              <select name="tv1" id="ticket-type">[[+tv1]]</select>
              вам тут равнозначные параметрам админки сделать надо, или спарсить все возможные значения
                Александр
                24 апреля 2015, 11:34
                0
                Заполнил все option вручную — заработало. Спасибо!

                А как парсить значения? ) чтобы каждый раз в чанк не лезть?
                  but1head
                  24 апреля 2015, 11:39
                  +2
                  у меня есть сниппет TicketGetTV, переделайте под свои нужды. но у меня он висит на update тикета, ибо тикеты создаются при регистрации (компании).

                  вызов такой, name название tv
                  [[!TicketGetTV? &tid=`[[+id]]` &name=`services_services`]]
                  код
                  <?php
                  $title = (!empty($title) ? $title : 'Услуги');
                  $output = '';
                  // current tv $name values
                  $page = $modx->getObject('modResource', $tid);
                  $tv_current_array = $page->getTVValue($name);
                  $tv_current = (!empty($tv_current_array) ? $tv_current = explode("||", $tv_current_array) : array());
                  // all tv $name values
                  $tvs = $modx->getObject('modTemplateVar', array('name' => $name));
                  $tv_all = explode('||', $tvs->get('elements'));
                  
                  if($type == 'select'){
                  	foreach ($tv_all as $i => $val){
                  	  $output .= '<option ' . (in_array ($val, $tv_current) ? 'selected' : '') . ' value="'.$val.'">'.$val.'</option>';
                  	}
                  	return '<div class="form-group params '.$name.'"><label>'.$title.'</label><div class="inner">
                  	<select class="chosen-select" multiple name="'.$name.'[]">'.$output.'</select></div><div class="clear"></div></div>';
                  }else{
                  
                  	$i = 0; $b = 0;
                  	foreach ($tv_all as $i => $val){
                  	  $output .= '<label class="checkbox" for="'.$name.'_'.$i++.'"><input type="checkbox" id="'.$name.'_'.$b++.'" name="'.$name.'[]"
                  	  ' . (in_array ($val, $tv_current) ? 'checked' : '') . ' value="'.$val.'"><i></i><div>'.$val.'</div></label>';
                    	}
                    	return '<div class="form-group params '.$name.' hidden"><label class="title_block">'.$tvs->get('caption').'</label><div class="inner_block">'.$output.'</div><div class="clear"></div></div>';
                  }
                    Александр
                    24 апреля 2015, 11:48
                    0
                    Огромно спасибо! Буду разбираться и прикручивать )
                      eflit
                      15 февраля 2018, 14:12
                      0
                      Здравствуйте подскажите этот плагин работает с select multiple множественным выбором?
                    Александр
                    24 апреля 2015, 11:39
                    0
                    В логи пишет ошибку:
                    [2015-04-24 11:37:54] (ERROR @ /home/bh57920/public_html/core/cache/includes/elements/modplugin/10.include.cache.php : 3) PHP warning: implode(): Invalid arguments passed
                    [2015-04-24 11:37:54] (ERROR @ /assets/components/tickets/action.php) modTemplateVarResource: Attempt to set NOT NULL field value to NULL
                      but1head
                      24 апреля 2015, 11:40
                      +1
                      условие добавьте если
                      if(!empty($_POST['tv1']))
                      Александр Иванов
                      23 апреля 2017, 16:53
                      0
                      Здравствуйте, столкнулся с похожей задачей и использовал ваш плагин, сохранение идёт, но у меня чекбоксы берутся из страницы с тегами:
                      <select name="tegs[]" class="form-control" id="ticket-tegs" multiple>
                      	[[pdoResources?
                          &parents=`5`
                          &depth=`0`
                          &tpl=`@INLINE <option value="[[+id]]">[[+pagetitle]]</option>`
                        ]]
                      	</select>
                      В tv такая конструкция:
                      @EVAL return $modx->runSnippet('pdoMenu',array('parents'=>5,'tplOuter'=>'@INLINE [[+wrapper]]','tpl'=>'@INLINE [[+pagetitle]]==<span><a href="/[[+uri]]">[[+pagetitle]]</a></span>||'));
                      На выходе получается, сохранение идёт но, как будто-бы передаёт значения в строку.
                      т.е. со стороны админки чекбоксы не отмечаются как активные.

                      Наверное есть смысл переписать конструкцию в tv?
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              15