Yii2 Bootstrap 3
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

2.8 KiB

Working with forms

The primary way of using forms in Yii is \yii\widgets\ActiveForm. It should be preferred when you have a model behind a form. Additionally there are some useful methods in \yii\helpers\Html that are typically used for adding buttons and help text.

First step creating a form is to create a model. It can be either Active Record or regular Model. Let's use regular login model as an example:

use yii\base\Model;

class LoginForm extends Model
{
	public $username;
	public $password;

	/**
	 * @return array the validation rules.
	 */
	public function rules()
	{
		return [
			// username and password are both required
			['username, password', 'required'],
			// password is validated by validatePassword()
			['password', 'validatePassword'],
		];
	}

	/**
	 * Validates the password.
	 * This method serves as the inline validation for password.
	 */
	public function validatePassword()
	{
		$user = User::findByUsername($this->username);
		if (!$user || !$user->validatePassword($this->password)) {
			$this->addError('password', 'Incorrect username or password.');
		}
	}

	/**
	 * Logs in a user using the provided username and password.
	 * @return boolean whether the user is logged in successfully
	 */
	public function login()
	{
		if ($this->validate()) {
			$user = User::findByUsername($this->username);
			return true;
		} else {
			return false;
		}
	}
}

In controller we're passing model to view where Active Form is used:

use yii\helpers\Html;
use yii\widgets\ActiveForm;

<?php $form = ActiveForm::begin([
	'id' => 'login-form',
	'options' => ['class' => 'form-horizontal'],
]) ?>
	<?= $form->field($model, 'username') ?>
	<?= $form->field($model, 'password')->passwordInput() ?>

	<div class="form-group">
		<div class="col-lg-offset-1 col-lg-11">
			<?= Html::submitButton('Login', ['class' => 'btn btn-primary']) ?>
		</div>
	</div>
<?php ActiveForm::end() ?>

In the code above ActiveForm::begin() not only creates form instance but marks the beginning of the form. All the content that is located between ActiveForm::begin() and ActiveForm::end() will be wrapped with appropriate <form> tag. Same as with any other widget you can specify some options passing an array to begin method. In our case we're adding extra CSS class and specifying ID that will be used in the tag.

In order to insert a form field along with its label all necessary validation JavaScript we're calling field method and it gives back \yii\widgets\ActiveField. It it's echoed directly it creates a regular input. In case you want to customize it you can add a chain of additional methods:

<?= $form->field($model, 'password')->passwordInput() ?>

// or

<?= $form->field($model, 'username')->textInput()->hint('Please enter your name')->label('Name') ?>