1

Zend_Formコンポーネントの研究を開始し、そのほとんどの側面を理解しました。フォーム要素を追加して構成オプションを設定する方法、フォームデコレータを適用する方法、バリデーターとフィルターを追加する方法を知っています...しかし、今日、私はそれらのフォームの処理に行き詰まりました。

私を困惑させる特定のことが1つあります。できるだけシンプルにした例で説明します。

まず、フォームを別のクラスとして作成します。ここでは特別なことは何もありません。ユーザー名とパスワードのフィールドと送信ボタンだけです。また、ラベルといくつかのフィルターとバリデーターを追加します。

class Login_Form extends Zend_Form
{
    public function init()
    {
        $this->setaction('/user/login')
             ->setMethod('post');

        $username = new Zend_Form_Element_Text('username');
        $username->setLabel('Username:')
                 ->setRequired(true)
                 ->addFilter('StringToLower')
                 ->addValidator('NotEmpty');

        $password = new Zend_Form_Element_Password('password');
        $password->setLabel('Password:')
                 ->setRequired(true);

        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setValue('Submit');

        $this->addElements(array(
            $username,
            $password,
            $submit
            ));

        return $this;  
    }
}

次に、「login」アクションメソッドを使用して「user」アクションコントローラーを作成します。ここでは、フォームが送信されたかどうかを確認し(表示されない場合は表示する必要があります)、検証します。2つの同じコード行に注意してください。$ formオブジェクトはその間に変更されませんでしたが、最初のオブジェクトは出力を生成せず、2番目のオブジェクトは出力を生成します。

class UserController extends Zend_Controller_Action
{
    public function loginAction()
    {
        $form = new Login_Form;

        // Check if form got submitted
        if ($this->getRequest()->isPost())
        {
            // This does not produce output
            echo 'Username: ' . $form->getValue('username');

            if ($form->isValid($_POST))
            {
                // This does produce output (same line of code as above)
                echo 'Username: ' . $form->getValue('username');
            }
            else
            {
                echo $form;
            }
        }
        else
        {
            echo $form;
        }
    }
}

フィルタリングされていない値が必要な場合は、リクエストオブジェクトから。を使用してそれらを取得できます$this->getRequest()->getPost()。ただし、フィルター処理された値が必要なので(フィルターはLogin_Formクラスで定義されます)、フォームオブジェクトから。を使用して値を取得する必要がありますgetValues()。$ formオブジェクトが呼び出された後に変更されるのは非常に奇妙だと思いますisValid()(これはブール値を返すだけで、$ formオブジェクトを変更しません)。これに関する助けをいただければ幸いです。

4

2 に答える 2

0

Zend_Formオブジェクトの仕組みは次のとおりです。送信された実際のデータを渡す必要があります。どこかからデータを取得することはありません。これは、データのソースが異なる可能性があるためです。1つのアプリケーションは常にPOSTを使用し、誰かがGETパラメーターも検証したいと考えており、まったく別のアプリケーションにはHTTP要求すらありませんが、コマンドラインからの入力を検証したいと考えています。

なぜあなたのコードは機能しているように見えるのだろうか。まず、フォームはメソッドを定義していません-確かに失敗します。次に、コントローラーでは$ form-> getValue('username')が機能することを期待しますが、プロパティへのアクセスは機能しないはずです-パブリックプロパティを設定するZend_Formソース内のコードは表示されません。

于 2012-10-13T19:34:19.837 に答える
0

次のようにフィルタリングされた値を取得する必要があります。

$filtered_values = $form->getValidValues ($_POST);
于 2012-10-13T18:44:54.880 に答える