sfForm
フォームクラス作成
symfony propel:build-form
基底フォームクラス
class BaseMemberForm extends BaseFormPropel
{
public function setup()
{
$this->setWidgets(array(
'id' => new sfWidgetFormInputHidden(),
'name' => new sfWidgetFormInput(),
));
$this->setValidators(array(
'id' => new sfValidatorPropelChoice(array('model' => 'Member', 'column' => 'id', 'required' => false)),
'name' => new sfValidatorString(array('max_length' => 256)),
));
(略)
}
- lib/form/base/BaseMemberForm.class.php
- 基底フォームクラスはデータベースを基に自動的に生成される。
派生フォームクラス
class MemberForm extends BaseMemberForm
{
public function configure()
{
$this->widgetSchema['name'] = new sfWidgetFormInput();
$this->widgetSchema->setLabel('name', '名前');
$this->validatorSchema['name'] = new sfValidatorString();
$this->validatorSchema['name']->setMessage('min_length', sprintf('名前の文字数は%d文字以上で入力してください', 4));
$this->validatorSchema['name']->setOption('min_length', 4);
$this->validatorSchema['name']->setOption('required', true);
$this->validatorSchema['name']->setMessage('required', '名前は必須です');
(略)
}
}
- lib/form/MemberForm.class.php
- 派生フォームクラスに、業務に基づいたヴァリデーションや、ユーザにUIとして提供するラベルを設定する。
コントローラ
public function executeInput(sfWebRequest $request)
{
$this->form = new MemberForm();
}
public function executeRegister(sfWebRequest $request)
{
$member = $request->getParameter('member');
$this->form->bind($member);
if( $this->form->isValid() === true ){
// $memberをDBに入れる
} else {
$this->getUser()->setAttribute('member_data', $member);
$this->redirect('entry/input');
}
}
テンプレート
<form action="<?php echo url_for('entry/register') ?>" method="post">
名前:<?php echo $form['name'] ?><br />
<?php if( $form['name']->hasError() === true ) { ?>
エラー:<?php echo $form['name']->getError() ?><br />
<?php } ?>
<input type="submit" />
</form>
ウィジェット・バリデータ
ウィジェット
バリデータ
参考