1

(デコレータを使用せずに Zend_Form を使用する方法については、この投稿を参照してください。)

アクション内で Zend_Form オブジェクトを作成し、レンダリングする前にフォームをビューに割り当てます。

public function indexAction()
{
        $form = new Zend_Form();
        $form->setAction('process')
            ->setMethod('post');

        $username = $form->createElement('text','username');
        $username->addValidator('alnum')
        ->setRequired(true)
        ->addFilter('StringtoLower');

        $description = $form->createElement('textarea','description');
        $description->addValidator('alnum')
                    ->setRequired(false)
                    ->addFilter('StringtoLower');

        $submit = $form->createElement('submit','Submit');

        $form->addElement($username);
        $form->addElement($description);
        $form->addElement($submit);

        $this->view->form = $form;
        $this->view->render('myForm/index.phtml'); //myForm is the actionController

    }

次に、次のコードをビュー スクリプト (index.phtml) に追加します。

<form>
    <table>
        <tr>
            <td><label>Username</label></td>
            <td><?php echo $this->form->getElement('username')->renderElement(); ?></td>
        </tr>
        <tr>
            <td><label>Description</label></td>
            <td><?php echo $this->form->getElement('description')->renderElement(); ?></td>
        </tr>
        <tr>
            <td></td>
            <td><?php echo $this->form->getElement('submit')->renderElement(); ?></td>
        </tr>
    </table>
</form>

しかし、それはエラーになります

メッセージ: 名前要素によるデコレータは存在しません

私はデコレータを使用しませんでした.私のコードの問題は何ですか.

これは完全なカスタム エラー メッセージです。

Application error
Exception information:

Message: Decorator by name Element does not exist
Stack trace:

#0 [internal function]: Zend_Form_Element->__call('renderElement', Array)
#1 C:\Program Files\Zend\Apache2\htdocs\Demo1\application\views\scripts\myForm\index.phtml(5): Zend_Form_Element_Text->renderElement()

#2 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\View.php(108): include('C:\Program File...')
#3 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\View\Abstract.php(833): Zend_View->_run('C:\Program File...')

#4 C:\Program Files\Zend\Apache2\htdocs\Demo1\application\controllers\MyFormController.php(38): Zend_View_Abstract->render('myForm/index.p...')
#5 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Action.php(513): myFormController->indexAction()

#6 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction')
#7 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))

#8 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Application\Bootstrap\Bootstrap.php(77): Zend_Controller_Front->dispatch()
#9 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Application.php(335): Zend_Application_Bootstrap_Bootstrap->run()

#10 C:\Program Files\Zend\Apache2\htdocs\Demo1\public\index.php(27): Zend_Application->run()
#11 {main} 

デコレータを使用せずにこの問題を解決する方法

4

3 に答える 3

4

実際には、デフォルトのデコレーターを削除し、ViewScript デコレーターを (エラー デコレーターと一緒に) 追加してレンダリングする必要があります。この記事を参照してください。

簡単な例:

class Demo_Form extends Zend_Form {
public function init() {
    $this->addElement('text', 'username', array( 'decorators' => array( 'ViewHeper', 'Errors' ) ));
    $this->addElement('text', 'lastname', array( 'decorators' => array( 'ViewHeper', 'Errors' ) ));
    $this->setDecorators(array( array('ViewScript' => array( 'script' => 'demoForm.phtml'))));
}
}

ビュー スクリプト (demoForm.phtml) を使用すると、次のようになります。

<form action="<?php echo $this->escape($this->form->getAction() ?>" method="<?php echo $this->escape($this->form->getMethod() ?>">
<table>
    <tr>
        <td>User Name:</td>
        <td><?php echo $this->form->username; ?></td>
    </tr>
    <tr>
        <td>Last Name:</td>
        <td><?php echo $this->form->lastname; ?></td>
    </tr>
</table>
</form>

要素をレンダリングする方法と場所を完全に制御できます。次に、最終的なビュー (コントローラーからのビュー) でフォームを同じように印刷します。?> viewScript をビューにレンダリングします。

于 2009-09-02T21:06:34.547 に答える
0

function indexAction () {

$form = new Zend_form();

..... $this->view->form = $form;

}

この手順の後、path/to/index.phtml に移動して、

<%php echo $this->form;

これがうまくいくことを願っています、それは私が行くのと同じ方法です!

于 2010-07-21T15:42:45.587 に答える