CakePHP3 merge добавить и изменить - PullRequest
0 голосов
/ 18 июня 2019

После добавления herd в систему пользователь перенаправляется на контроллер herdimports, где он может вводить данные импорта.

Я хотел бы иметь форму добавления и редактирования в одномдействие и представление.

В контроллере это работает:

public function edit($herd_id = null)
{
    if($herd_id == null) 
    {
        // log error
        $this->Flash->success(__('No herd was selected.'));
        return $this->redirect(['action' => 'index']);
    }
    $herdimport = $this->Herdimports->find('all')->where(['herd_id'=>$herd_id]);
    if($herdimport->count() == 0)
    {
        $herdimport = $this->Herdimports->newEntity();
    }

    if ($this->request->is(['patch', 'post', 'put'])) {
        $herdimport = $this->Herdimports->patchEntities($herdimport, $this->request->getData());
        $this->Herdimports->deleteAll(['herd_id'=>$herd_id]);
        if ($this->Herdimports->saveMany($herdimport)) {
            $this->Flash->success(__('The herdimport has been saved.'));
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The herdimport could not be saved. Please, try again.'));
    }
    $this->set('herd_id', $herd_id);
    $this->set(compact('herdimport'));
}

В представлении у меня есть следующий код:

<?= $this->Form->create($herdimport) ?> 
<fieldset>
    <legend><?= __('Edit Herdimport') ?></legend>
    <? $i = 0; ?>
    <? foreach ($herdimport as $h) : ?>
    <div class="repeat"> 
        <?= $this->Form->hidden($i.'.herd_id'); ?> 
        <?= $this->Form->control($i.'.num',['data-default'=>""]); ?> 
        <?= $this->Form->control($i.'.date',['data-default'=>""]); ?> 
        <?= $this->Form->control($i.'.origin',['data-default'=>""]);?> 
        <?= $this->Form->control($i.'.weight',['data-default'=>""]); ?> 
        <?= $this->Form->control($i.'.price',['data-default'=>""]); ?> 
    </div>
    <? $i ++; ?>
    <? endforeach; ?>

    <button class="extra-row"><?=__('Extra row');?></button>
    <button class="delete-row" style="display: none;"><?=__('Delete row');?></button>

</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

, который прекрасно работает, когда у меня есть записидля этого стада.Но если записи еще есть (случай добавления), то foreach игнорируется.

Как я могу проверить в представлении, есть ли строки или нет.Я пробовал $herdimport->count(), но это дает ошибки, когда нет строк.
Также пробовал $herdimport->isNew(), что выдает ошибку, когда есть строки.

Есть идеи?

1 Ответ

1 голос
/ 18 июня 2019

Вы, вероятно, не должны этого делать:

$herdimport = $this->Herdimports->newEntity();

Если вы хотите добавить / отредактировать несколько элементов, то $herdimport всегда должен быть либо запросом, либо списком объектов, а не одним объектом.

Если основная цель / проблема состоит в том, чтобы иметь начальный набор входных данных в случае, если еще нет записей, тогда вы можете сделать что-то вроде этого:

$entity = $this->Herdimports->newEntity();
$entity->herd_id = $herd_id;

$herdimport = [$entity];

т.е. просто оберните исходную сущность в массив (и убедитесь, что вы заполнили поле внешнего ключа).

...