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オブジェクトを変更しません)。これに関する助けをいただければ幸いです。