Прием значений из динамически созданных элементов формы с Zend Framework - PullRequest
2 голосов
/ 23 марта 2012

Если этот вопрос существует где-то еще на ТАК, пожалуйста, просветите меня, мне не повезло в моих поисках.

Дилемма:

Я создаю интерфейс, который позволит моей жене загружать фотографии на свой сайт и управлять ими. Чтобы упростить процесс - я построил компонент для дублирования строки формы «добавить фотографию», в которую она сможет добавлять несколько изображений одновременно. Вот так:

Наценка: (генерируется Zend_Form)

<section id="add-photos">
    <form enctype="multipart/form-data" action="/admin/photo/add-photos" method="post">
        <dl class="zend_form">
            <dt id="AddPhotos-label">&#160;</dt>
                <dd id="AddPhotos-element">
                    <fieldset id="fieldset-AddPhotos">
                       <dl> <-- This element is what get's duplicated on the 'add 
                                another image' button -->
                         <input type="hidden" name="id" value="" id="id" />
                         <dt id="image_name-label">
                             <label for="image_name" class="required">Image Name</label>
                         </dt>   
                         <dd id="image_name-element">
                             <input type="text" name="image_name" id="image_name"    
                                 value="" />
                         </dd>
                         <dt id="album_name-label">
                             <label for="album_name" class="required">Album Name</label> 
                         </dt>
                         <dd id="album_name-element">
                              <input type="text" name="album_name" id="album_name" 
                                  value="" />
                         </dd>
                         <dt id="category_name-label">
                              <label for="category_name" class="required">Category 
                                   Name</label>
                         </dt>
                         <dd id="category_name-element">
                               <input type="text" name="category_name"  
                                       id="category_name" value="" />
                         </dd>
                         <dt id="image-label">
                               <label for="image" class="optional">Image:</label>
                         </dt>
                         <dd>
                             <input type="hidden" name="MAX_FILE_SIZE" value="134217728" 
                                  id="MAX_FILE_SIZE" />
                             <input type="file" name="image" id="image" />
                         </dd>
                         <dt id="thumbnail-label">
                             <label for="thumbnail" class="optional">Is Thumbnail?
                             </label>       
                         </dt>
                         <dd id="thumbnail-element">
                             <input type="hidden" name="thumbnail" value="0" />
                             <input type="checkbox" name="thumbnail" id="thumbnail" 
                                 value="1" />
                         </dd>
                         <dt id="AddAnotherPhoto-label">&#160;</dt>
                         <dd id="AddAnotherPhoto-element">
                             <button name="AddAnotherPhoto" id="AddAnotherPhoto"  
                                 type="button">Add Another Photo</button>
                         </dd>
                     </dl>
                 </fieldset>
             </dd>
            <dt id="submit-label">&#160;</dt>
                <dd id="submit-element">
                    <input type="submit" name="submit" id="submit" value="Submit" />
                </dd>
            </dl>
        </form>     
</section>

Если бы пользователь щелкнул по кнопке «AddAnotherPhoto», он добавил бы еще <dl> внутри <fieldset>. Таким образом, структура станет:

<fieldset>
    <dl></dl>
    <dl></dl>
</fieldset>

Но, как и следовало ожидать с моим действием контроллера:

public function addPhotosAction()
{
    $form = new Form_AddPhoto();
    if($this->_request->isPost()){
        if($form->isValid($_POST)){
            $photo_model = new Admin_Model_Photo();

            $photo_model->addPhoto(
                $form->getValue('image_name'),
                $form->getValue('album_name'),
                $form->getValue('category_name'),
                $form->getValue('thumbnail')
            );
        }
    }
    $form->setAction('/admin/photo/add-photos');
    $this->view->form = $form;
}   

Он захватывает только один набор элементов. Итак, мои вопросы: как мне собрать все входящие элементы сгруппированным способом? Есть ли способ перебрать объект запроса и вызвать метод addPhoto в фотомодели для каждого набора?

Я попытался сделать это во внешнем интерфейсе через $.ajax(), где итерация была легко выполнена, однако данные было не так легко передать действию.

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

Спасибо, Кен

Мне было трудно объяснить это, поэтому дайте мне знать, если вам нужно что-то прояснить.

1 Ответ

1 голос
/ 23 марта 2012

Если бы я, где вы, я бы создал подчиненную форму для каждой части addphoto. затем, если вы скопируете его, убедитесь, что вы изменили идентификатор, с которым он будет сгруппирован.

С этой подчиненной формой вы можете использовать следующую функцию

$form->setElementsBelongTo(<uniqid>);

Это позволяет сгруппировать элементы в uniqid, чтобы вы получили все результаты публикации.

Таким образом, ваш элемент будет иметь имя, которое выглядит как name = "test [image_name]"

В вашем контроллере вы можете затем использовать $ form-> getValues ​​(), чтобы получить все значения вашей формы, а затем зациклить эти данные с циклом foreach

...