diff --git a/apps/advanced/backend/views/site/login.php b/apps/advanced/backend/views/site/login.php index f676b98..98ebbf6 100644 --- a/apps/advanced/backend/views/site/login.php +++ b/apps/advanced/backend/views/site/login.php @@ -14,10 +14,13 @@ $this->params['breadcrumbs'][] = $this->title;

Please fill out the following fields to login:

- array('class' => 'form-horizontal'))); ?> - field($model, 'username')->textInput(); ?> - field($model, 'password')->passwordInput(); ?> - field($model, 'rememberMe')->checkbox(); ?> + $model, + 'options' => array('class' => 'form-horizontal'), +)); ?> + field('username')->textInput(); ?> + field('password')->passwordInput(); ?> + field('rememberMe')->checkbox(); ?>
'btn btn-primary')); ?>
diff --git a/apps/advanced/frontend/views/site/contact.php b/apps/advanced/frontend/views/site/contact.php index 14a82bc..9c0b6b0 100644 --- a/apps/advanced/frontend/views/site/contact.php +++ b/apps/advanced/frontend/views/site/contact.php @@ -24,14 +24,15 @@ $this->params['breadcrumbs'][] = $this->title;

$model, 'options' => array('class' => 'form-horizontal'), 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), )); ?> - field($model, 'name')->textInput(); ?> - field($model, 'email')->textInput(); ?> - field($model, 'subject')->textInput(); ?> - field($model, 'body')->textArea(array('rows' => 6)); ?> - field($model, 'verifyCode')->widget(Captcha::className(), array( + field('name')->textInput(); ?> + field('email')->textInput(); ?> + field('subject')->textInput(); ?> + field('body')->textArea(array('rows' => 6)); ?> + field('verifyCode')->widget(Captcha::className(), array( 'options' => array('class' => 'input-medium'), )); ?>
diff --git a/apps/advanced/frontend/views/site/login.php b/apps/advanced/frontend/views/site/login.php index f676b98..98ebbf6 100644 --- a/apps/advanced/frontend/views/site/login.php +++ b/apps/advanced/frontend/views/site/login.php @@ -14,10 +14,13 @@ $this->params['breadcrumbs'][] = $this->title;

Please fill out the following fields to login:

- array('class' => 'form-horizontal'))); ?> - field($model, 'username')->textInput(); ?> - field($model, 'password')->passwordInput(); ?> - field($model, 'rememberMe')->checkbox(); ?> + $model, + 'options' => array('class' => 'form-horizontal'), +)); ?> + field('username')->textInput(); ?> + field('password')->passwordInput(); ?> + field('rememberMe')->checkbox(); ?>
'btn btn-primary')); ?>
diff --git a/apps/basic/views/site/contact.php b/apps/basic/views/site/contact.php index 14a82bc..9c0b6b0 100644 --- a/apps/basic/views/site/contact.php +++ b/apps/basic/views/site/contact.php @@ -24,14 +24,15 @@ $this->params['breadcrumbs'][] = $this->title;

$model, 'options' => array('class' => 'form-horizontal'), 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), )); ?> - field($model, 'name')->textInput(); ?> - field($model, 'email')->textInput(); ?> - field($model, 'subject')->textInput(); ?> - field($model, 'body')->textArea(array('rows' => 6)); ?> - field($model, 'verifyCode')->widget(Captcha::className(), array( + field('name')->textInput(); ?> + field('email')->textInput(); ?> + field('subject')->textInput(); ?> + field('body')->textArea(array('rows' => 6)); ?> + field('verifyCode')->widget(Captcha::className(), array( 'options' => array('class' => 'input-medium'), )); ?>
diff --git a/apps/basic/views/site/login.php b/apps/basic/views/site/login.php index f676b98..98ebbf6 100644 --- a/apps/basic/views/site/login.php +++ b/apps/basic/views/site/login.php @@ -14,10 +14,13 @@ $this->params['breadcrumbs'][] = $this->title;

Please fill out the following fields to login:

- array('class' => 'form-horizontal'))); ?> - field($model, 'username')->textInput(); ?> - field($model, 'password')->passwordInput(); ?> - field($model, 'rememberMe')->checkbox(); ?> + $model, + 'options' => array('class' => 'form-horizontal'), +)); ?> + field('username')->textInput(); ?> + field('password')->passwordInput(); ?> + field('rememberMe')->checkbox(); ?>
'btn btn-primary')); ?>
diff --git a/docs/guide/upgrade-from-v1.md b/docs/guide/upgrade-from-v1.md index ebfe94b..bd20b91 100644 --- a/docs/guide/upgrade-from-v1.md +++ b/docs/guide/upgrade-from-v1.md @@ -327,9 +327,9 @@ is a container consisting of a label, an input, and an error message. It is repr as an `ActiveField` object. Using fields, you can build a form more cleanly than before: ```php - - field($model, 'username')->textInput(); ?> - field($model, 'password')->passwordInput(); ?> + $model)); ?> + field('username')->textInput(); ?> + field('password')->passwordInput(); ?>
diff --git a/framework/yii/widgets/ActiveForm.php b/framework/yii/widgets/ActiveForm.php index eb14293..117c1a9 100644 --- a/framework/yii/widgets/ActiveForm.php +++ b/framework/yii/widgets/ActiveForm.php @@ -8,6 +8,7 @@ namespace yii\widgets; use Yii; +use yii\base\InvalidConfigException; use yii\base\Widget; use yii\base\Model; use yii\helpers\Html; @@ -31,6 +32,12 @@ class ActiveForm extends Widget */ public $method = 'post'; /** + * @var Model the model associated with this form. This property must be set if you call [[field()]] + * to create input fields. If a form is associated with multiple models, this property is not needed + * and you should use [[mfield()]] to create input fields. + */ + public $model; + /** * @var array the HTML attributes (name-value pairs) for the form tag. * The values will be HTML-encoded using [[Html::encode()]]. * If a value is null, the corresponding attribute will not be rendered. @@ -208,17 +215,50 @@ class ActiveForm extends Widget } /** - * Generates a form field. + * Generates a form field using [[model]] and the specified attribute. + * * A form field is associated with a model and an attribute. It contains a label, an input and an error message - * and use them to interact with end users to collect their inputs for the attribute. + * and uses them to interact with end users to collect their input for the attribute. + * + * This method is mainly used for a form with a single model. + * + * @param string $attribute the attribute name or expression. See [[Html::getAttributeName()]] for the format + * about attribute expression. + * @param array $options the additional configurations for the field object + * @return ActiveField the created ActiveField object + * @throws InvalidConfigException if [[model]] is not specified + * @see fieldConfig + * @see mfield + */ + public function field($attribute, $options = array()) + { + if (!$this->model instanceof Model) { + throw new InvalidConfigException('The "model" property must be set.'); + } + return Yii::createObject(array_merge($this->fieldConfig, $options, array( + 'model' => $this->model, + 'attribute' => $attribute, + 'form' => $this, + ))); + } + + /** + * Generates a form field using the specified model and attribute. + * + * This method differs from [[field()]] in that the model is passed as a parameter rather than obtained + * from [[model]]. + * + * This method is mainly used for a form with multiple models. + * * @param Model $model the data model * @param string $attribute the attribute name or expression. See [[Html::getAttributeName()]] for the format * about attribute expression. * @param array $options the additional configurations for the field object * @return ActiveField the created ActiveField object * @see fieldConfig + * @see field */ - public function field($model, $attribute, $options = array()) + public function mfield($model, $attribute, $options = array()) { return Yii::createObject(array_merge($this->fieldConfig, $options, array( 'model' => $model,