我正在尝试执行一个Proxy类,允许我将自定义值设置为不同的sfForm。我必须这样做,因为php没有多重继承(所有sfForm扩展了一些由doctrine制作的Base *)而且我总是将相同的代码复制粘贴到sfForm configure()方法。
到目前为止,我上课但却无法正常工作。我知道我必须通过引用传递对象,但我被困住了!
这是我做的
class FormProxy {
private $_form;
private $_formatter;
public function __construct(sfForm &$form, $params = array()) {
$this->_form = $form;
if(count($params)>0)
$this->set ($params);
}
public function set($array = array()){
if (count($array) == 0){
return;
}
if(isset ($array['formatter'])){
$this->setFormatter($array['formatter']);
}
if(isset ($array['CSRFProtection'])){
$this->disableCSRFProtection();
}
return $this;
}
public function setForm(sfForm &$form){
$this->_form = $form;
return $this;
}
public function & getForm(){
$this->init();
return $this->_form;
}
public function getFormatter(){
return $this->_formatter;
}
public function setFormatter($formatter = null){
$this->_formatter = $formatter;
return $this;
}
private function init(){
if($this->_formatter != null){
$decorator = new sfWidgetFormSchemaFormatterLocal($form->getWidgetSchema(), $form->getValidatorSchema());
$form->getWidgetSchema()->addFormFormatter($this->_formatter, $decorator);
$form->getWidgetSchema()->setFormFormatterName($this->_formatter);
}
}
public function disableCSRFProtection(){
$this->_form->disableCSRFProtection();
}
}
我知道代理类可能是静态的,但现在它是一样的。
编辑:
我的问题是,当我做
时 $proxy = new FormProxy(new ClientForm(), array(
'formatter' => 'custom',
'CSRFProtection' => false,
));
$form = $proxy->getForm();
对FormProxy所做的更改似乎没有在外部应用(在$ form变量中)。我认为这是因为我没有很好地处理$ form的引用,但是以不同的方式尝试了负面结果。
答案 0 :(得分:0)
好吧,没有任何具体错误,我会打赌您的问题是函数$form
中的变量init
未定义。这是最明显的问题。您可以在$form = $this->_form;
if($this->_formatter != null){
来解决此问题