フォームを扱う ============== > Note|注意: この節はまだ執筆中です。 Yii においてフォームを使用する主たる方法は [[yii\widgets\ActiveForm]] によるものです。 フォームがモデルに基づくものである場合はこの方法を優先すべきです。 これに加えて、[[yii\helpers\Html]] にはいくつかの有用なメソッドがあり、通常は、あらゆるフォームにボタンやヘルプテキストを追加するのに使うことが出来ます。 モデルに基づくフォームを作成する場合、最初のステップは、モデルそのものを定義することです。 モデルは、アクティブレコードクラス、あるいは、もっと汎用的な Model クラスから派生させることが出来ます。 このログインフォームの例では、汎用的なモデルを使用します。 ```php use yii\base\Model; class LoginForm extends Model { public $username; public $password; /** * @return array 検証規則 */ public function rules() { return [ // username と password はともに必須 [['username', 'password'], 'required'], // password は validatePassword() によって検証される ['password', 'validatePassword'], ]; } /** * パスワードを検証する * このメソッドがパスワードのインライン検証に使用される */ public function validatePassword() { $user = User::findByUsername($this->username); if (!$user || !$user->validatePassword($this->password)) { $this->addError('password', 'Incorrect username or password.'); } } /** * 提供された username と password でユーザをログインさせる。 * @return boolean ユーザのログインが成功したかどうか */ public function login() { if ($this->validate()) { $user = User::findByUsername($this->username); return true; } else { return false; } } } ``` コントローラはこのモデルのインスタンスをビューに渡し、ビューでは [[yii\widgets\ActiveForm|ActiveForm]] ウィジェットが使われます。 ```php use yii\helpers\Html; use yii\widgets\ActiveForm; 'login-form', 'options' => ['class' => 'form-horizontal'], ]) ?> field($model, 'username') ?> field($model, 'password')->passwordInput() ?>
'btn btn-primary']) ?>
``` 上記のコードでは、[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] がフォームのインスタンスを作成するだけでなく、フォームの開始をマークしています。 [[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] と [[yii\widgets\ActiveForm::end()|ActiveForm::end()]] の間に置かれた全てのコンテントが `
` タグによって囲まれます。 その他のウィジェットと同じように、ウィジェットをどのように構成すべきかに関するオプションを指定するために、`begin` メソッドに配列を渡すことが出来ます。 この例では、追加の CSS クラスと要素を特定するための ID が渡されて、開始 `` タグに適用されています。 フォームの中で、フォームの要素を作成するために、ActiveForm ウィジェットの [[yii\widgets\ActiveForm::field()|ActiveForm::field()]] メソッドが呼ばれています。このメソッドは、要素のラベルと、適用できる JavaScript の検証メソッドがあれば、それらも追加します。 このメソッドの呼び出し結果を直接にエコーすると、結果は通常の (text の) インプットになります。 出力結果をカスタマイズするためには、このメソッドの呼び出しに追加のメソッドをチェーンします。 ```php field($model, 'password')->passwordInput() ?> // または field($model, 'username')->textInput()->hint('お名前を入力してください')->label('お名前') ?> ``` これで、フォームのフィールドによって定義されたテンプレートに従って、`