Как я могу обернуть текст по Zend_Form результат рендеринга - PullRequest
1 голос
/ 03 февраля 2011

Мне нужно обернуть текст по результатам рендера Zend_Form:

Вы сможете понять все по коду (потому что мой английский плох) (этот пример не работает):

$HTML = $Form -> render( new Zend_View('asdasd') );

Я должен получить:

<form>
asdasd
</form>

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

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

Во-первых, давайте создадим наш собственный помощник вида. По умолчанию это Zend_View_Helper_Form. Zend_Form использует Zend_Form_Decorator_Form для рендеринга, который в свою очередь использует Zend_View_Helper_Form для фактического создания xhtml-представления формы. Таким образом, мы могли бы создать наш собственный помощник по форме, например, называется My_View_Helper_CustomForm, что расширяет Zend_View_Helper_Form следующим образом:

 // Example file location: APPLICATION_PATH/views/helpers/CustomForm.php
 class My_View_Helper_CustomForm extends Zend_View_Helper_Form {


     /**
     * Render HTML form
     *
     * @param  string $name Form name
     * @param  null|array $attribs HTML form attributes
     * @param  false|string $content Form content
     * @return string
     */
    public function customForm($name, $attribs = null, $content = false)
    {

        // THE FOLLOWING FEW LINES ARE NEW.
        // get myText and unset it from $attribs afterwards.        
        $myText = '';        
        if (array_key_exists('myText', $attribs)) {
            $myText = $attribs['myText'];
            unset($attribs['myText']);
        }

        // this is from orginal form view helper
        $info = $this->_getInfo($name, $content, $attribs);
        extract($info);

        if (!empty($id)) {
            $id = ' id="' . $this->view->escape($id) . '"';
        } else {
            $id = '';
        }

        if (array_key_exists('id', $attribs) && empty($attribs['id'])) {
            unset($attribs['id']);
        }

        $xhtml = '<form'
               . $id
               . $this->_htmlAttribs($attribs)
               . '>';


        // THE NEXT LINE IS AGAIN NEW        
        // WE PUT $myText after opening <form> tag (as in your example).
        $xhtml .= $myText . 'sadfsf';



        // the rest of the form, as usuall.
        if (false !== $content) {
            $xhtml .= $content
                   .  '</form>';
        }

        return $xhtml;
    }

}

Где-то в Bootsrap.php вы должны добавить локализацию помощников вида в автозагрузчик. Вероятно, вы также можете сделать это, добавив каталог помощников вида в Zend_View. тем не менее, я просто делаю это с помощью автозагрузчика следующим образом:

    $autoLoader = Zend_Loader_Autoloader::getInstance();

    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
                'basePath' => APPLICATION_PATH,
                'namespace' => '',
            ));

    $resourceLoader->addResourceType('view', 'views/helpers/', 'My_View_Helper_');
    $autoLoader->pushAutoloader($resourceLoader);

Сделав это, я продемонстрирую пример кода в testAction, который будет использовать приведенную выше customForm:

    $myForm = new My_Form_SomeForm();

    // set your text you want to put in the form
    // Just don't forget to unset it the new view helper.
    $myForm->setAttrib('myText', 'asdasd'); 


    // get form decorator (i.e. Zend_Form_Decorator_Form)
    $formDecorator = $myForm->getDecorator('form');

    // $formDecorator uses Form helper to actually cunstruct xhtml of the form.
    // So we set our new helper (i.e. My_View_Helper_CustomForm)
    //  instead of default one (i.e. Zend_View_Helper_Form).
    // setHelper() method takes only string, thus ZF will need to know how to find
    // the new view helper. This was the reason I added it to the autoloader.
    $formDecorator->setHelper('customForm');

    $HTML = $myForm->render();

Надеюсь, что это будет полезно для вас и поможет вам решить проблему.

0 голосов
/ 03 февраля 2011

Вы можете легко визуализировать форму из контроллера, например:

В контроллере

$form = new Zend_Form();
//Create your form elements

$this->view->form = $form

Затем в вашем контроллере

echo $this->form

Объект Zend_Form имеет__toString() метод, который визуализирует форму, просто используя echo.

...