2013-04-23 4 views
0

Я пытаюсь обновить список классов студентов, установив флажки с выделенным в выпадающем меню. Я выбрал четыре флажка. Следовательно, отладка правильно показывает 248, 268, 244, 1220. но я получил ошибку Warning (2): Illegal string offset 'id' [APP/controllers/customers_controller.php, line 728] из-за "classroom_id". Есть ли когда-либо только отображение только списка выбранных флажков?cakephp 1.2 несколько обновлений с выпадающим меню

Я пытаюсь обновить несколько записей/строк, установив флажки. Как я могу отправить несколько выбранных идентификаторов контроллеру?

Любая помощь будет принята с благодарностью.

<?php echo $form->input('classroom_id', array('type' => 'select','empty' => '-- Select --','label' => false,'style'=>'width:254px;', 'options' => $classesfiltered,'validate'=>'required:true','div'=>'formfield')); ?> 

<?php foreach ($students as $student) { ?> 
<?php echo $form->input('Customer.'.$student['Customer']['id'].'.id', array('type' => 'checkbox', 'id' => "admin_checkbox_".$student['Customer']['id'], 'label' => false)); ?> 
<?php } ?> 

CONTROLLER

foreach($this->data['Customer'] as $key => $item) { 
    if ($item['id']) { 
      Debugger::Dump($this->data['Customer'][$key]); 
    } 
} 

ВЫВОД

Warning (2): Illegal string offset 'id' [APP/controllers/customers_controller.php, line 728] 

"classroom_id" 

248 

268 

244 

1220 

ответ

1

Причина, почему вы получаете 5 значений вместо из 4 из-за classroom_id ввода:

<?php echo $this->Form->input('classroom_id', array('type' => 'select','empty' => '-- Select --','label' => false,'style'=>'width:254px;', 'options' => $classesfiltered,'validate'=>'required:true','div'=>'formfield')); ?> 

Поскольку вы не включают в себя название модели в названии сторон исходного (например, Customer.classroom_id), он делает предположение, что вы хотите включить его в текущую модель (если вы не указали вручную модель в элементе формы, конечно).

Это правильно возвращает 5 значений.

В вашем контроллере, однако, предполагается, что единственными данными, которые вы собираетесь получить, являются флажки, а не поле выбора. Вы просматриваете все данные формы «Клиент», а не только флажки.

Есть 2 способа, которыми мы могли бы исправить это:

Вариант № 1: (Рекомендуется) Измените форму ввода, а затем обновить ваш цикл

<?php 
echo $this->Form->input('Customer.classroom_id', array('type' => 'select','empty' => '-- Select --','label' => false,'style'=>'width:254px;', 'options' => $classesfiltered,'validate'=>'required:true','div'=>'formfield')); 

foreach ($students as $student) { 
    echo $this->Form->input('Customer.id.'.$student['Customer']['id'], array('type' => 'checkbox', 'id' => "admin_checkbox_".$student['Customer']['id'], 'label' => false)); 
} 
?> 

Примечание: Я включил первый параметр на вход от 'Customer.'.$student['Customer']['id'].'.id' - 'Customer.id.'.$student['Customer']['id'] Это позволяет получить доступ к вашим данным POSTed в массиве. Полученная форма ввода будет выглядеть (где <student id> Ваш фактический студент ID):

<div class="input checkbox"> 
    <input type="hidden" name="data[Customer][id][<student id>]" id="admin_checkbox_<student id>_" value="0"> 
    <input type="checkbox" name="data[Customer][id][<student id>]" id="admin_checkbox_<student id>" value="1"> 
</div> 

Вы можете затем цикл через каждый флажок отдельный в контроллере, который должен выглядеть примерно так:

foreach ($this->data['Customer']['id'] as $id => $checked) { 
    if ($checked) { 
     Debugger::Dump($this->data['Customer'][$id]); 
    } 
} 

Option # 1 рекомендуется, так как он гарантирует, что ваши данные будут правильно разделены. Затем вы можете прокручивать только нужные вам данные, что быстрее.

Вариант № 2: Другой вариант, который я не рекомендую, чтобы использовать Исеть() для перебора всех данных, но действует только на данные, которые вы хотите

foreach ($this->data['Customer'] as $key => $item) { 
    if (isset($item['id']) && $item['id']) { 
     Debugger::Dump($this->data['Customer'][$key]); 
    } 
} 
+0

ты звезда! – DANLEE

0

Если вы уверены, что предупреждение не важно использование error_reporting(E_ERROR);

+0

, но она должна возвращать только 4 значения. в настоящее время он возвращает 4 проверенных значения с классом_id в каждом цикле. – DANLEE

0
Instead of creating single single check boxes you should use proper format of cakephp. Please check below: 

echo $this->Form->input('Model.field', array(
    'type' => 'select', 
    'multiple' => 'checkbox', 
    'options' => $students 
    ) 
)); 

In above code $students is holding your check boxes values like [0]=male, [1]=female. 

In your controller, you will one value same like you get value of textbox. 
+0

Привет Адия. Я не ищу несколько флажков. Я пытаюсь обновить несколько записей/строк, установив флажки. Благодарю. Как я могу отправить несколько выбранных идентификаторов контроллеру? – DANLEE