我正在开发一个涉及在高抽象级别生成表单的应用程序(它是一个 CMS 应用程序)。我想动态创建 CFormModel 对象并即时设置表单字段。我想我可以通过扩展 CFormModel 来做到这一点,然后动态地创建代表表单字段的类属性(Yii 术语中的“属性”)。
为了说明,而不是在以下类中指定登录表单(在文件中定义):
// From: http://www.yiiframework.com/doc/guide/1.1/en/form.model
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
private $_identity;
public function rules()
{
return array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'), // assume function authenticate defined elsewhere
);
}
}
我想这样做:
class MyFormModel extends CFormModel {
protected $_rules = array();
public function __construct($attributes=array(), $rules=array()) {
foreach ($attributes as $i => $attr) {
$this->{$attr} = ???; // <<== This is the key here
}
// pass in array of rules as described in Yii doc for CFormModel
$this->_rules = $rules;
}
public function rules() {
return $_rules;
}
}
并在需要时调用它,如下所示:
$myModelObj = new MyFormModel($attr, $rules);
在哪里 :
$attr = array(
'username',
'rememberMe',
'password',
);
$rules = array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'), // assume function authenticate defined elsewhere
);
请注意,在我要完成的工作中,任何文件中都没有写入“LoginClass”,它是在代码中动态创建的。
这将允许我创建表单(在视图中)做这样的事情:
// based on http://www.yiiframework.com/doc/guide/1.1/en/form.view
<?php echo $wForm->textField($myModelObj,'username'); ?>
等等
我已经尝试过了,并且 $this->{$attr} 行失败了:
Property "MyFormModel.username" is not defined.
实际上,该行的代码只是:
$this->{$attr};
这 ???表示我不确定要为此分配什么。在 Yii 文档示例中,他们只是将字段定义为公共类变量。
我应该使用魔术方法吗?
我在这里尝试做的事情甚至可能吗?