私は、高レベルの抽象化でフォームを生成することを含むアプリケーション(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のドキュメントの例では、フィールドをパブリッククラス変数として定義しているだけです。
魔法の方法を使うべきですか?
私がここでやろうとしていることは可能ですか?