CakePHP: помощник формы с saveMany() для одновременного редактирования нескольких строк

На мой взгляд (/View/Tests/admin_edit.ctp), я хочу отредактировать несколько строк (из другой модели), указав форму на QsetsController и действие «admin_order», а затем использовать saveMany($this->request->data) для обновления всех изменений.

/View/Tests/admin_edit.ctp:

echo $this->Form->create( 'Qset', array('action'=>'order', 'admin'=>1));
$n = 1;
foreach ($qsets as $qset) : ?>
        <h3>Question set <?php echo $n; $n++;?></h3>
        <?php echo $this->Form->input('Qset.'.$n.'.order'); ?>
        <?php echo $this->Form->input('Qset.'.$n.'.id', array('type'=>'hidden') ); ?>
        ...
        $n++;

    endforeach;

echo $this->Form->end('save');

/Контроллер/QsetsController.php

public function admin_order() {

    $data = $this->request->data; //maybe just $this->data ?

    $this->Qset->saveAll($data);
    $this->Session->setFlash( "Order saved.");
    $this->redirect( Controller::referer() );
}

В настоящее время мои данные не сохраняются (хотя ошибок нет). Кроме того, только первый ввод, отраженный циклом foreach, отображается с правильным значением поля order. Каждый последующий не имеет никакой ценности.

Обновление: я изменил $n = 1 на $n = 0, и теперь первый И второй ввод отображается с правильными значениями порядка.

update2: разметка формы начинается так:

<form action="/admin/qsets/order" id="QsetOrderForm" method="post" accept-charset="utf-8">

Разметка для полей ввода, которые отображаются правильно:

<div class="input number"><label for="Qset2Order">Order</label>
<input name="data[Qset][2][order]" type="number" value="3" id="Qset2Order">
</div>

Разметка, полученная для пустых полей ввода:

<div class="input number"><label for="Qset3Order">Order</label>
<input name="data[Qset][3][order]" type="number" id="Qset3Order">
</div>

Update3: я решил проблему с некорректным отображением входных данных! Обратите внимание, что я увеличивал $n перед повторением входных данных, так что это создавало дубликаты в конце цикла. Я переместил $n++ после входных данных, и теперь они отображаются правильно. Фу. Теперь мне просто нужно заставить их сохраниться.

Полезные ссылки:
глава книги тортов о saveMany() /saveAll()
Похожий вопрос


person emersonthis    schedule 21.04.2013    source источник


Ответы (1)


Вы ссылаетесь на руководство, но, вероятно, недостаточно внимательно его прочитали :)

Цитата из раздела для saveMany():

Обратите внимание, что мы передаем числовые индексы вместо обычных $data, содержащих ключ Article. При сохранении нескольких записей одной и той же модели массивы записей должны быть просто численно проиндексированы без ключа модели.

Поэтому вместо $data передайте $data['Qset'] в saveAll()/saveMany().

Также Controller::referer() не является статическим методом, используйте $this->referer()

person ADmad    schedule 21.04.2013
comment
В порядке. Попробую в контроллере. Любая идея, почему помощник формы не создает все входные данные правильно? - person emersonthis; 21.04.2013
comment
Форма все еще не работает после этой модификации, но это может быть просто потому, что представление не отправляет данные должным образом. Ясно, что что-то не так, потому что только некоторые поля ввода заполнены правильными значениями. - person emersonthis; 21.04.2013
comment
Ну, вы только показали какой-либо код, как вы заполняете $this->request->data для представления admin_edit. От этого будет зависеть, как заполняются ваши входные данные. - person ADmad; 21.04.2013
comment
Я понял свою ошибку с вводом формы (см. update3 выше). Теперь я могу заставить значения отображаться правильно. Но теперь контроллер все еще не работает даже после изменения на $data['Qset'] в контроллере - person emersonthis; 21.04.2013
comment
Покажите вывод debug($data['Qset']) в вашем контроллере, прежде чем перейти к сохранению. - person ADmad; 21.04.2013