Добавить заполнитель HTML в Zend_Form

Я использую 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, или это нужно сделать с помощью декоратора или чего-то подобного?

Спасибо.


person robjmills    schedule 13.01.2010    source источник


Ответы (2)


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

person Gordon    schedule 13.01.2010
comment
это выглядит как хорошее решение, нужно будет больше узнать об этом - person robjmills; 13.01.2010
comment
это похоже на решение, которое я ищу, но примеры не дают контекста того, где должны быть размещены новые файлы. Есть ли какой-то принцип, которому я должен следовать, то есть создать новую папку в том же каталоге, что и сам ZF? - person robjmills; 13.01.2010
comment
Ну, имена классов соответствуют соглашению об именах PEAR, поэтому вы должны поместить вышеуказанный элемент в My/Form/Element/SwfUpload, а My_Decorator_Something — в My/Decorator/Something. - person Gordon; 13.01.2010
comment
Я вижу, я не знал об этом. В вашем примере с My/Form/Element/SwfUpload какой корень будет там, где My будет добавлен? будет ли это параллельно с приложением / общедоступной / библиотекой и т. д.? - person robjmills; 13.01.2010
comment
Либо в папке вашей библиотеки, либо в файле models. Но в основном все, что связано с определенным вами путем включения. - person Gordon; 13.01.2010
comment
Хорошо, если бы я создал экземпляр My_Form_Element_SwfUpload с помощью $custom = new My_Form_Element_SwfUpload(); тогда он знал бы, что этот класс нужно автоматически искать (например) в /library/my/form/element/swfupload.php? - person robjmills; 13.01.2010
comment
Если вы настроили Zend_Autoloader таким образом. да. - person Gordon; 13.01.2010
comment
заработало, добавив в автозагрузчик, но после всего этого, но все еще есть проблемы. может иметь смысл создать новый вопрос, но за этот вы получите баллы :) - person robjmills; 13.01.2010

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

С помощью echoing каждого элемента вы можете распечатать его 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).

person Emil Ivanov    schedule 13.01.2010
comment
Соглашаться. Это может показаться хакерским, но другое решение с реализацией декоратора требует гораздо больше времени. - person Emil Ivanov; 13.01.2010
comment
Я бы тоже пошел на это, когда мне нужен заполнитель, а не пользовательский элемент. - person Elzo Valugi; 12.03.2012