Как я могу создать несколько форм на одной странице в CakePHP? - PullRequest
1 голос
/ 17 марта 2011

Я пытаюсь придумать стандартный способ создания нескольких форм для одной модели на странице индекса. Вот немного подробнее.

У меня есть список папок, в каждой из которых отображается заметка. Я хотел бы, чтобы заметки были редактируемыми со страницы индекса. Очевидно, что не просто скопировать и вставить представление для действия edit_memo, например:

<?php echo $this->Form->create('Binder');?>
    <fieldset>
        <legend><?php __('Edit Memo'); ?></legend>
    <?php
        echo $this->Form->input('id');
        echo $this->Form->input('memo');
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

Но это по сути то, что я хочу сделать. В контексте я просто циклически перебираю подшивки в действии index, а заметки являются частью модели.

Я пытался изменить $this->Form->create('Binder') на следующее:

$this->Form->create(null,array(
    'id'=>"BinderEditMemo.$i",
    'controller' => 'binders',
    'action' => 'edit_memo',
    'id' => $binder['Binder']['id']
));

Но не повезло. Записная книжка по-прежнему получает обычный идентификатор, поэтому я думаю, что мне, возможно, придется это изменить. Когда я отправляю форму, она выполняет действие, но не сохраняет. К вашему сведению, я направил параметр id к действию в моих маршрутах.

Я уверен, что должен быть стандартный способ рендеринга нескольких форм в цикле индекса. Есть мысли?

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

Это не так уж сложно, но вы должны несколько меньше полагаться на магию Cake FormHelper.Следующие работы (или работали для меня в ряде случаев, по крайней мере):

<?php
  $baseUrl = array('controller'=>'binders','action'=>'edit');
  foreach ($binders as $_binder) {

    $url = $baseUrl; $url['id'] = $_binder['id'];

    echo $this->Form->create('Binder',array('url'=>$url));
    echo $this->Form->input('Binder.id', array('type'=>'hidden','value'=>$_binder['id']));

    echo $this->Form->input('Binder.memo', array('value'=>$_binder['memo']));

    echo $this->Form->end(__('Submit',true));
  }
?>

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

1 голос
/ 17 марта 2011

Интересно, поможет ли эта ссылка решить вашу проблему: http://bakery.cakephp.org/articles/RabidFire/2010/06/26/multiple-forms-per-page-for-the-same-model

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

0 голосов
/ 17 марта 2011

Даниэль, ты был совершенно прав! Очень хорошо. Это код, которым я закончил. Это важно по одной основной причине. Спецификация HTML говорит, что идентификаторы должны быть уникальными. Поэтому я добавил к форме несколько полей и поля, чтобы избежать проблем. Все еще работает.

<?php
$baseUrl = array('controller'=>'binders','action'=>'edit_memo');
$url = $baseUrl; 
$url['id'] = $binder['Binder']['id'];

echo $this->Form->create(null,array(
    'id'=>"BinderEditMemo-{$binder['Binder']['id']}",
    'url'=>$url
));
?>
<fieldset>
    <legend><?php __('Memo'); ?></legend>
    <?php
    echo $this->Form->input('Binder.id', array('id' => "BinderId-{$binder['Binder']['id']}", 'type'=>'hidden','value'=>$binder['Binder']['id']));
    echo $this->Form->input('Binder.memo', array('id' => "BinderMemo-{$binder['Binder']['id']}", 'value' => $binder['Binder']['memo'], 'label' => '', ));
    ?>
</fieldset>             
<?php echo $this->Form->end(__('Update Memo',true)); ?>
...