@cms_admin
Интеллигентный веб-разработчик

Как обработать multiple select в php?

Столкнулся с проблемой при разработке конструктора форм обратной связи. Сначала в панели управления создаются поля и записываются в базу данных.

Потом для каждого поля формируется код. Для селекта с множественным выбором это происходит так
$fields[$i]['html']  = '<select name="'.$fields[$i]['id'].'"';
  if ($fields[$i]['config']['multi'] == 1) $fields[$i]['html'] .= ' multiple="multiple" ';
  $fields[$i]['html'] .= ' size="'.$size.'">';
  foreach ($items as $item){
    $fields[$i]['html']  .= '<option value="'.$item.'">'.$item.'</option>';
  }
  $fields[$i]['html']  .= '</select>';


Далее данные формы собираются с помощью jQuery функции serializeArray() и с помощью Ajax отправляются в php-контроллер codeigniter.

В контроллере поля получаю следующим образом:
foreach ($fields as $field){
  if ($field['type'] == 'checkbox'){
    if($this->input->post($field['id']) == 0) $post = lang("Да", 'cf_constructor');
    else $post = lang("Нет", 'cf_constructor');
  } elseif ($field['type'] == 'menu' && $field['config']['multi'] == 1){

    for ($i = 0; $i < count($this->input->post($field['id'])); $i++){
      $post_arr[$i] = $this->input->post($field['id']);
    }
    $post = implode(",", $post_arr);
  } else {
    $post = $this->input->post($field['id']);
  }
  $message .= $field['title'].': '.strip_tags(nl2br($post)).'<br/>';
}


Собираю всё это в сообщение и отправляю по e-mail.

Проблема в том, что когда в селекте выбрано несколько пунктов, контроллер принимает только последний из них, а надо, чтобы принял все.
Как это можно сделать?
  • Вопрос задан
  • 3232 просмотра
Решения вопроса 1
@cms_admin Автор вопроса
Интеллигентный веб-разработчик
Если просмотреть то, что передается на сервер, то serializeArray() передает все отмеченные пункты, но передает их несколько раз подряд следующим образом (например для поля с name="2"):
form_id:1
1:Александр
2:PHP
2:HTML
2:jQuery

И мне нужно все значения поля 2 собрать в массив.

Проблема решается следующим образом имя селекта должно быть задано как массив name="2[]".
Тогда в контроллере его можно преобразовать в строку следующим образом:
$post = implode(",", $this->input->post($field['id']));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А вы уверены что проблема не в serializeArray()?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы