FormIt не сохраняет все выбранные значения с помощью bootstrap-select

Всем привет.
Использую для множественного выбора вот такой инструмент на фронт-энде developer.snapappointments.com/bootstrap-select/examples/

Через FormIt на фронт-энде пользователь заполняет форму и отправляет ее. После этого создается ресурс на основе заполненных полей. Всё работает (заполнение всех полей), кроме этого мульти-селекта: сохраняется только первое выбранное значение, а остальные — нет (при выбранных 3-5 категорий).

Если сделать всё чекбоксами, то сниппет обрабатывает всё правильно: все 3-5 категорий сохраняются в одном ТВ (в админке это тоже мульти-селект).

Можете помочь разобраться, пожалуйста?
Anton
20 января 2020, 13:47
modx.pro
840
0

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

Anton
23 января 2020, 11:12
0
Не туда написал?
    Александр Мельник
    23 января 2020, 13:24
    0
    Сумбурно (на мой взгляд) вы описали задачу.
    Сам по себе Formit не создает ресурсы, наверняка вы используете для этого какой-то самодельный сниппет, который вызываете как хук для Formit. О нем вы не сказали не слова, но именно в нем и нужно разбираться, там отлавливать какие данные приходят из формы, в каком виде и как их добавить в ресурс.
      Anton
      23 января 2020, 14:30
      0
      Привет. Спасибо за ответ.
      Мой код тупо отлавливает все поля и обрабатывает их.

      <?php
       
      $doc = $modx->getObject('modResource', array('id' => $hook->getValue('resource_id')));
       
      if (empty($doc)) {
          $doc = $modx->newObject('modResource');
          $doc->set('createdby', $modx->user->get('id'));
      } else {
          $doc->set('editedby', $modx->user->get('id'));
      }
       
      $allFormFields = $hook->getValues();
      foreach ($allFormFields as $field => $value) {
       
          if ($field !== 'spam' && $field !== 'resource_id') {
              $doc->set($field, $value);
          }
       
          //we need to parse the title into the alias
          if ($field == 'pagetitle') {
              //replace spaces with -
              $alias = preg_replace('/[\' \']/', '-', $value);
       
              //remove non alpha and a common injection string
              $alias = preg_replace('/[^a-z0-9\.\x0B\-]/i', '', $alias);
       
              //this is the standard revo regexp
              // \0\x0B\t\n\r\f\a&=+%#<>"~:`@\?\[\]\{\}\|\^'\
          }
      }
       
      // now set the alias
      $doc->set('alias', $alias);
      $isnew = $doc->isNew();
       
      if ($doc->save()) {
          if ($isnew) {
              $doc->set('alias', $doc->get('alias' . '-' . $doc->get('id')));
              $doc->save();
          }
      }
       
      //resource settings
      $doc->set('template', '3');
      $doc->set('parent', '30');
      $doc->set('hidemenu', '1');
      $doc->set('published', '0');
      $doc->set('show_in_tree', '0');
       
      //$time = date('Y-m-d H:i:s', strtotime('+10 minutes')); //Finds current time
      //$doc->set('unpub_date', '$time'); //needs to set unpublish date to 10min after published
      $doc->save();
       
      foreach ($allFormFields as $field => $value) {
          if ($tv = $modx->getObject('modTemplateVar', array('name' => $field))) {
              /* handles checkboxes & multiple selects elements */
              if (is_array($value)) {
                  $featureInsert = array();
                  while (list($featureValue, $featureItem) = each($value)) {
                      $featureInsert[count($featureInsert)] = $featureItem;
                  }
                  $value = implode('||', $featureInsert);
              }
              $tv->setValue($doc->get('id'), $value);
              $tv->save();
          }
      }
       
      $modx->cacheManager->refresh();
      return true;
        Anton
        28 января 2020, 11:09
        0
        По коду видно, что ловим все ТВшки и засовываем их в соответствующие поля, если их много, то соединяем с помощью разделителя ||
        В том и дело, что bootstrap-select отправляет только первый выбранный элемент. При этом мультиселекты в виде галочек — работает корректно с этим скриптом.

        Я так понимаю, что bootstrap-select как-то не всё отправляет?

        Может кто помочь разобраться, пожалуйста?
      Anton
      29 января 2020, 15:44
      0
      Ребят, помогите, пожалуйста, разобраться.
        Anton
        30 января 2020, 11:06
        0
        Прошу помощи у русскоязычного сообщества MODX Revolution, пожалуйста.

        Вместе в будущее с MODX 3!
          Наумов Алексей
          30 января 2020, 11:30
          +1
            Anton
            30 января 2020, 11:40
            0
            Привет,
            спасибо за ответ!

            Нет, не указан, код уже поправил. После теста отпишусь.

            UPD: Спасибо за помощь! Заработало!
            Я так понял, что [] обозначают массив данных, когда просто select — это только одно значение, поэтому в мануалах нет [].
            Правильно понял?
              Anton
              30 января 2020, 11:47
              0
              Спасибо, получилось.
                Наумов Алексей
                30 января 2020, 12:02
                +1
                Отлично. Да, [] в name означают, что будет массив
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10