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;
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,