Добавьте заполнитель HTML в Zend_Form - PullRequest
2 голосов
/ 13 января 2010

Я использую Zend_Form для заявления, используя этот код:

class Form_ApplicationForm extends Zend_Form
{
    public function init()
    {
        $this->setAction('/application/new')
             ->setMethod('post')
             ->setAttrib('id','application');

        $name = new Zend_Form_Element_Text('name');
        $name->setLabel('Your Name')
             ->setRequired(TRUE)
             ->addValidator('alpha', FALSE, array('allowWhiteSpace' => true));

        $email = new Zend_Form_Element_Text('email');
        $email->setLabel('Email Address')
              ->setRequired(TRUE)
              ->addValidator('EmailAddress');

        $this->addElements(array($name,$email));
    }
}

Я добавляю в эту форму загрузчик флэш-файлов (swfupload), для работы которого требуется фрагмент HTML, фрагмент выглядит следующим образом:

<div id="swfupload-control">
    <p>Upload upto 5 image files(jpg, png, gif), each having maximum size of 1MB(Use Ctrl/Shift to select multiple files)</p>
    <input type="button" id="button" />
    <p id="queuestatus" ></p>
    <ol id="log"></ol>
</div>

Каков наилучший способ вставить это так, чтобы он находился где-то внутри <form>, который я вставляю в свой контроллер следующим образом:

public function newAction()
{
    $form = new Form_ApplicationForm();
    if($this->_request->isPost()){
        $data = $_POST;
        if($form->isValid($data)){
            /// handle data here
        }else{
            $form->populate($data);
        }
    }
    $this->view->form = $form;
}

Есть ли способ добавить заполнитель или аналог в Zend_Form, или это нужно сделать с помощью декоратора или чего-то в этом роде?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 января 2010

Для этого вам нужно написать свой собственный элемент, например, My_Form_Element_SwfUpload вместе с рендерером. Смотрите эти уроки:

3 голосов
/ 13 января 2010

Самый простой способ сделать это в виде:

Путем echo каждого элемента вы можете распечатать его html. Вот один из способов сделать это:

<form id="<?= $this->form->getId() ?>" action="<?= $this->form->getAction() ?>">

<? foreach ($this->form as $element): ?>
<?= $element ?>
<? if ($element->getName() == 'email'): ?>
<div id="swfupload-control">
    <p>Upload upto 5 image files(jpg, png, gif), each having maximum size of 1MB(Use Ctrl/Shift to select multiple files)</p>
    <input type="button" id="button" />
    <p id="queuestatus" ></p>
    <ol id="log"></ol>
</div>
<? endif ?>
<? endforeach ?>

</form>

Для этого он печатает все элементы и помещает все, что вам нужно, после поля email. Если вы добавите или удалите поле из формы, этот код будет продолжать работать (конечно, он не будет работать, если вы удалите поле email).

...