Группа чекбоков в форме

Создаю ТВ типа чекбокс, ставлю значение Moscow||SPB, внутри формы прописываю:
<div class="form-check">
  <input class="form-check-input" name="provides[]" type="checkbox" value="Moscow">
  <label class="form-check-label" for="Moscow">Moscow</label>
  
  <input class="form-check-input" name="provides[]" type="checkbox" value="SPB">
  <label class="form-check-label" for="SPB">Incall</label>
</div>
Чекбокс может быть выбран как первый, так и второй.
Вызов формы созержит:
&allowedFields=provides
&validate=provides:required[]

Но форма после нажания на кнопку не реагирует. Как правильно прописывать группу чекбоксов внутри формы?
Антон
23 августа 2022, 14:18
modx.pro
796
0

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

Артур Шевченко
23 августа 2022, 18:51
0
Параметр validate в FormIt не понимает квадратные скобки, ну и как следствие если ты уберёшь, то для вывода ошибку нужно будет отдельный блок создать с классом .error_provides
    Антон
    23 августа 2022, 22:04
    0
    я что-то на самом деле потерялся с этими чекбоксами в тикете. Вроде бы ничего сверхестественного нет, но не работает. ТВ provides. Из фронта заполняю чекбоксы таким образом:
    <div class="col-md-6 col-sm-12">
    <input type="hidden" name="provides" value="" />
    <div class="checkbox">
    <label>
    <input type="checkbox" name="provides[]" value="Outcall">
    Outcall
    </label>
    <label>
    <input type="checkbox" name="provides[]" value="Incall">
    Incall
    </label>
    
    
    <span class="error">[[!+fi.error.provides]]</span>
    </div>
    </div>
    Вызов тикетформ:
    [[!TicketForm?
    						&allowedFields=`provides`
    						&tplFormCreate=`tickets.form.create.tpl`
    						&tplFormUpdate=`tickets.form.update.tpl`
    						&redirectUnpublished=`11`
    						&redirectDeleted=`11`
    						&validate=`
                                provides:required
                        ]]
    Плагин на событие OnDocFormSave:
    <?php
    if($resource->class_key == 'Ticket' && $modx->event->name == 'OnDocFormSave' && $modx->context->key != 'mgr'){
    
        if(!empty($_POST['provides'])) {
            $provides = implode('||',$_POST['provides']);
        	if (!$resource->setTVValue('provides', $_POST['provides'])) {
        		$modx->log(xPDO::LOG_LEVEL_ERROR, 'provides - ERROR');
        	}       
        } else {
        	if (!$resource->setTVValue('provides', '') ) {
        		$modx->log(xPDO::LOG_LEVEL_ERROR, 'provides - ERROR');
        	}       
        }
        $modx->cacheManager->refresh();
    }
    И на итог: то форма не отправляется вообще, отправляется если только весь раздел валидации убрать. То отправляется, но в ТВ выбранные чекбоксы не записывает. Есть какие-то рабочие примеры, как в тиккете сделать чекбоксы?
      Артур Шевченко
      23 августа 2022, 22:56
      0
      Самый простой вариант сделать ещё одно поле и в него с помощью js записывать значения выбранных чекбоксов.
        Антон
        23 августа 2022, 23:29
        0
        Разобрался с записью в тв, вписал в плагин вместо implode('||',$_POST['provides' prices, не знаю как, но знпсениеив тв передал ось.
        Проблема в другом. Форма отправляется только если убрать абсолютно все аалидаторы в вызове ticketform. Убираешь валидацию для тв чекбокса не отправляет, Убираешь сам чекбокса в форме, все прекрасно работает. Чкдеса
          Артур Шевченко
          23 августа 2022, 23:52
          0
          Если форма не отправляется, должны быть ошибки.
            Антон
            24 августа 2022, 00:00
            0
            В логах пусто, в браузера аналогично. Куда ещё тикетыорм может ошибки писать?
        Гарри
        24 августа 2022, 01:05
        0
        Попробуйте записать параметр &validate без символов новой строки.
        [[!TicketForm?
        	...
        	&validate=`provides:required`
        ]]
          Антон
          24 августа 2022, 06:22
          0
          так работает:
          [[!TicketForm?
          						&allowedFields=`parent,name,gender,phone,email,location,age,hair-color,bust-size,
          										bust-type,height,ethnicity,smoker,nationality,weight,languages,provides,rates,video`
          						&tplFormCreate=`tickets.form.create.tpl`
          						&tplFormUpdate=`tickets.form.update.tpl`
          						&redirectUnpublished=`11`
          						&redirectDeleted=`11`
          						&validate=`provides:required`
                              ]]
          а так уже нет)
          <code>
          					[[!TicketForm?
          						&allowedFields=`parent,name,gender,phone,email,location,age,hair-color,bust-size,
          										bust-type,height,ethnicity,smoker,nationality,weight,languages,provides,rates,video`
          						&tplFormCreate=`tickets.form.create.tpl`
          						&tplFormUpdate=`tickets.form.update.tpl`
          						&redirectUnpublished=`11`
          						&redirectDeleted=`11`
          						&validate=`
                                      pagetitle:required,
                                      gender:required,
                                      phone:required,
                                      location:required,
                                      email:email:required,
                                      age:required,
                                      hair-color:required,
                                      bust-size:required,
                                      bust-type:required,
                                      height:required,
                                      ethnicity:required,
                                      smoker:required,
                                      nationality:required,
                                      weight:required,
                                      languages:required[],
                                      provides:required,
                                      content:required,
                                      rates:required`
                              ]]
          </code>
            Антон
            26 августа 2022, 11:13
            0
            методом проб понял, что форма не уходит из-за одной тв-шки: location:required.
            В форме tickets.form.create.tpl ее вызов происходит таким образом:
            <div class="col-md-6 col-sm-12">
            	        <label for="ticket-sections">Location</label>
            	        <select name="parent" class="form-control" id="ticket-sections">[[+sections]]</select>
            	        <span class="error"></span>
            	    </div>
            По факту она выводит названия секций тикетов. Для тикетов валидация по-другому как-то должны быть получается?
              Гарри
              26 августа 2022, 11:39
              0
              Либо измените правило проверки на parent:required, либо измените имя select на <select name="location">.
                Антон
                26 августа 2022, 14:29
                0
                спасибо, точно. Как вывести теперь чекбоксы из ТВ с возможностью изменения в tickets.form.update.tpl
                <div class="checkbox">
                <label>
                <input type="checkbox" name="provides[]" value="[[+provides]]">
                Outcall
                </label>
                <label>
                <input type="checkbox" name="provides[]" value="[[+provides]]">
                Incall
                </label>
                
                
                <span class="error">[[!+fi.error.provides]]</span>
                </div>
                так выводит просто значения, но не сами чекбоксы с галками
                  Гарри
                  26 августа 2022, 16:01
                  0
                  Возможно, вы можете использовать выходной фильтр FormItIsChecked из пакета FormIt.
                  <input type="checkbox" name="provides[]" value="Outcall" [[+provides:FormItIsChecked=`Outcall`]]>
                    Антон
                    26 августа 2022, 16:05
                    0
                    пробовал, не выводит значения из тв. Пусто
                      Гарри
                      26 августа 2022, 16:27
                      0
                      Для нескольких значений, разделенных ||, вы должны написать свой собственный сниппет.
                      <?php
                      $output = ' ';
                      $input = explode('||', $input);
                      if (!empty($input) && is_array($input) && in_array($options,$input)) {
                        $output = ' checked="checked"';
                      }
                      return $output;
                        Антон
                        29 августа 2022, 22:24
                        0
                        странная закономерность получается. Форма показывает сохраненные значения чекбокосов только для одного чекбокса. Если выбраны 2 — пустота
                          Антон
                          29 августа 2022, 22:38
                          0
                          если применять этот снипет в таком формате:
                          <input type="hidden" name="provides" value="" />	
                          <label><input type="checkbox" name="provides[]" value="Incall" [[!getTHEMchecks? &provides=`Incall`]] />Incall</label>
                          <label><input type="checkbox" name="provides[]" value="Outcall" [[!getTHEMchecks? &provides=`Outcall`]] />Outcall</label>
                          2 чекбокса постоянно нажаты, несмотря на то что в ТВ выбран один чекбокс
                            Гарри
                            29 августа 2022, 22:50
                            0
                            [[+provides:getTHEMchecks=`Incall`]] вместо [[!getTHEMchecks? &provides=`Incall`]]
                            Антон
                            29 августа 2022, 22:53
                            0
                            опять же, если один чекбокс выбран — показывает нормально, если два выбрано в ТВ — не показывает ничего (чекбоксы все пустые)
                            Гарри
                            29 августа 2022, 23:05
                            0
                            Kаково содержание плейсхолдера [[+provides]]?
                            Incall||Outcall?
                             
                            Kак вы храните значения в плагине?
                            $provides = implode('||',$_POST['provides']);
                            $resource->setTVValue('provides', $provides)
                            Антон
                            29 августа 2022, 23:07
                            0
                            ТВ параметры ввода: Outcall||Incall
                            ТВ параметры вывода: Разделитель

                            плагин:
                            <?php
                            if($resource->class_key == 'Ticket' && $modx->event->name == 'OnDocFormSave' && $modx->context->key != 'mgr'){
                            
                                if(!empty($_POST['provides'])) {
                                    $provides = implode('||',$_POST['provides']);
                                	if (!$resource->setTVValue('provides', $_POST['procent'])) {
                                		$modx->log(xPDO::LOG_LEVEL_ERROR, 'provides - ERROR');
                                	}       
                                } else {
                                	if (!$resource->setTVValue('provides', '') ) {
                                		$modx->log(xPDO::LOG_LEVEL_ERROR, 'provides - ERROR');
                                	}       
                                }
                                $modx->cacheManager->refresh();
                            }
                            Гарри
                            29 августа 2022, 23:15
                            0
                            Что такое $_POST['procent']?
                            if (!$resource->setTVValue('provides', $_POST['procent'])) {
                            ...
                            Антон
                            29 августа 2022, 23:18
                            0
                            взял с форума modx.pro/help/9684

                            Также задавался этим вопросом. Переменная нигде не объявлена, но с ней идет передача данных в ТВ при сохранении формы.
                            Гарри
                            29 августа 2022, 23:48
                            0
                            По-моему $_POST['procent'] это опечатка.
                             
                            Я бы использовал этот код в плагине:
                            $provides = implode('||',$_POST['provides']);
                            if (!$resource->setTVValue('provides', $provides)) {
                            ...
                             
                            ТВ параметры ввода:
                            Тип ввода = Список (множественный выбор)
                            Возможные значения = Outcall||Incall
                             
                            ТВ параметры вывода:
                            Тип вывода = Разделитель
                            Разделитель = ||
                            Антон
                            29 августа 2022, 23:59
                            0
                            секрет был в разделителе вывода) За procent также спасибо) заработал
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        24