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');

/Controller/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>

Актуализация 3: Реших проблема с въвеждането, което не се показва правилно! Забележете, че увеличавах $n преди да повторя входовете, така че това създаваше дубликати в края на цикъла. Преместих $n++ след входовете и сега те се показват правилно. уф. Сега просто трябва да ги накарам да спасят.

Полезни препратки:
Глава от книгата за торти на saveMany() /saveAll()
Подобен въпрос


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


Отговори (1)


Позовавате се на ръководството, но вероятно не сте го прочели достатъчно добре :)

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

Обърнете внимание, че предаваме числови индекси вместо обичайните $data, съдържащи ключа на статията. Когато записвате множество записи от един и същи модел, масивите от записи трябва да бъдат само цифрово индексирани без ключа на модела.

Така че вместо $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