我正在开发一个涉及在高级抽象中生成表单的应用程序(它是一个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 doc示例中,它们只是将字段定义为公共类变量.
我应该使用魔术方法吗?
我想在这里做什么甚至可能吗?