У меня есть флажок в форме Cakephp, который может иметь несколько значений. В представлении:
<?php // Multiple checkbox form echo $this->Form->input('report_types', array( 'type'=>'select', 'label'=>'Report Type(s)', 'multiple'=>'checkbox', 'options'=>array( 'option 1'=>'option 1', 'option 2'=>'option 2', 'option 3'=>'option 3', ), )); ?>
Когда я загружаю это в базу данных, он возвращает «Столбец не найден: 1054 Неизвестный столбец« Массив »в поле« Список полей », потому что он пытается добавить массив, где он должен быть строкой.
Я попытался преобразовать любую из данных $this->request->data
которая находится в форме массива, в строку, но это мешает назначению даты, которое у меня было ранее в форме (они также хранятся как массивы).
Я также попытался преобразовать только значение поля многократного флажка в строку в beforeValidate()
в модели, но для этого требуется слишком много повторений и становится беспорядочным, когда мне нужно «распаковать» данные:
<?php class Request extends AppModel { ... function beforeValidate() { if(!empty($this->request->data['Request']['attachment_types'])) { $this->data['Request']['attachment_types'] = implode(',', $this->data['Request']['attachment_types']); } if(!empty($this->request->data['Request']['report_types'])) { $this->data['Request']['report_types'] = implode(',', $this->data['Request']['attachment_types']); } // Am I going to have to keep adding if-statements here? }?>
Кроме того, метод !empty()
Не работает, потому что поле никогда не будет пустым (из-за скрытого поля, автоматически создаваемого при вводе CakePHP).
Есть ли у кого-нибудь какие-либо идеи относительно того, как я могу подавать множественные флажки в базу данных? Это похоже на довольно скромный запрос … у CakePHP есть какие-то «автоматические» навыки в этом отношении?
Чтобы решить эту проблему, я изменил тип данных в массиве на набор с параметрами, определенными как ('option 1','option 2','option 3)
в моей базе данных. Если в вашей базе данных нет «набора» данных, все в порядке. Затем я изменил мою beforeValidate()
для сериализации данных.
<?php class Request extends AppModel { ... function beforeValidate() { if($this->request->data['Request']['attachment_types']!=0) { $this->data['Request']['attachment_types'] = implode(',', $this->data['Request']['attachment_types']); } if($this->request->data['Request']['report_types']!=0) { $this->data['Request']['report_types'] = implode(',', $this->data['Request']['report_types']); } // Yes, I will just have to keep adding if-statements :( }?>
Обратите внимание, что в приведенном выше примере у меня было два поля с флажками ('report_types' и 'attachment_types'), которые объясняют, почему у меня было два if-оператора.
Спасибо JvO за помощь!