Как редактировать форму с помощью hasMany (несколько строк)

У меня есть модуль с множеством изображений, и я пытаюсь отобразить форму редактирования для этих изображений на моей странице редактирования. Полученный в результате ввод html-формы показывает неправильную модель, поэтому правильное значение для этих данных не заполняется. Вот мой код просмотра:

<?php


echo $this->Form->create('Unit', array(
    'action' => 'edit',
    'inputDefaults' => array(
        'label' => false,
        'div' => false
        )
    )
);
echo $this->Form->hidden('id');

foreach($this->data['Image'] as $img) {

echo $this->Form->hidden('Image'.$img['id'].'id');

}
echo $this->Form->end('Update Photo');?>
<?php echo $this->Session->flash(); ?>

Мой html заканчивается так:

<form action="/units/edit/3" id="UnitEditForm" method="post" accept-charset="utf-8">
    <div style="display:none;">
       <input type="hidden" name="_method" value="POST"/>
    </div>
    <input type="hidden" name="data[Unit][id]" value="3" id="UnitId"/>
    <input type="hidden" name="data[Unit][Image1id]" id="UnitImage1id"/>
    <input type="hidden" name="data[Unit][Image2id]" id="UnitImage2id"/>
    <input type="hidden" name="data[Unit][Image3id]" id="UnitImage3id"/>
    <input type="hidden" name="data[Unit][Image4id]" id="UnitImage4id"/>
    <input type="hidden" name="data[Unit][Image5id]" id="UnitImage5id"/>
    <input type="hidden" name="data[Unit][Image6id]" id="UnitImage6id"/>
   <div class="submit">
       <input  type="submit" value="Update Photo"/>
   </div>
</form>

Я видел несколько руководств, в том числе руководство CakePHP, в котором показано, как вы можете ввести «имя модели. [0]. поле» и т. д., что хорошо и хорошо, когда вы знаете, сколько строк у вас есть, но когда это когда-либо происходило в CMS? Кажется, я не могу найти никакой информации о том, как создать эту форму, перебирая все записи в массиве доступных изображений. В конце концов, я хочу иметь скрытое поле идентификатора, чтобы запись могла быть обновлена, отображать фактическое изображение (и возможность его изменить), его альтернативное описание (и возможность его изменить) и, я полагаю, еще один скрытый поле для unit_id, которое связывает его с этой формой.

ОБНОВИТЬ с помощью

echo $this->Form->hidden('Image.'.$img['id'].'.id');

работает сейчас, но возвращает это:

<input type="hidden" name="data[Image][1][id]" value="2" id="Image1Id"/>
<input type="hidden" name="data[Image][2][id]" value="3" id="Image2Id"/>
<input type="hidden" name="data[Image][3][id]" value="4" id="Image3Id"/>
<input type="hidden" name="data[Image][4][id]" value="5" id="Image4Id"/>
<input type="hidden" name="data[Image][5][id]" value="6" id="Image5Id"/>
<input type="hidden" name="data[Image][6][id]" id="Image6Id"/>

Мне нужно начать с [0], а не [1]. Вместо того, чтобы получать число по «id», мне нужно получать подсчитанные числа в массиве $ img, верно? Как мне это сделать?


person huzzah    schedule 09.03.2012    source источник


Ответы (2)


Эта строка здесь, скорее всего, вызывает ваши проблемы:

    echo $this->Form->hidden('Image'.$img['id'].'id');

Это строит поле model.field как «Image1id», а не то, что Cake ожидает «Image.1.id». Попробуйте переписать так:

    echo $this->Form->hidden('Image.'.$img['id'].'.id');
person Adam Stanley    schedule 09.03.2012
comment
Это работает! К сожалению, $img[] возвращает значения, НАЧИНАЮЩИЕСЯ с [1] вместо [0], поэтому к тому времени, когда мой цикл доходит до последнего Image.id, он не отображает значение (потому что эта запись не существует в множество). Обновление OP для справки. - person huzzah; 09.03.2012

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

$count=0;
foreach($this->data['Image'] as $img) {
echo $this->Form->hidden('Image.'.$count.'.id');
$count++;
}

это выводит:

<input type="hidden" name="data[Unit][id]" value="3" id="UnitId"/>
<input type="hidden" name="data[Image][0][id]" value="1" id="Image0Id"/>
<input type="hidden" name="data[Image][1][id]" value="2" id="Image1Id"/>
<input type="hidden" name="data[Image][2][id]" value="3" id="Image2Id"/>
<input type="hidden" name="data[Image][3][id]" value="4" id="Image3Id"/>
<input type="hidden" name="data[Image][4][id]" value="5" id="Image4Id"/>
<input type="hidden" name="data[Image][5][id]" value="6" id="Image5Id"/>

Вы можете видеть, что правильное значение заполнено.

person huzzah    schedule 12.03.2012
comment
Привет, у меня была такая же идея (со счетом), и ввод имеет правильное значение и все такое. Но я не могу сохранить данные. Можете ли вы показать часть вашего контроллера? Я использую, чтобы получить статью и связать ее с patchEntity. - person Isengo; 24.06.2016