Я пытаюсь создать класс Proxy, который позволяет мне устанавливать пользовательские значения для различных sfForm. Я должен сделать это таким образом, потому что php не имеет множественного наследования (все sfForm расширяют некоторые базовые *, созданные доктриной), и я всегда копирую один и тот же код в метод 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();
}
}
Я знаю, что прокси-класс может быть статическим, но сейчас он такой же.
Edit:
Моя проблема в том, что когда я делаю
$proxy = new FormProxy(new ClientForm(), array(
'formatter' => 'custom',
'CSRFProtection' => false,
));
$form = $proxy->getForm();
изменения, внесенные в FormProxy, не применяются снаружи (в переменной $ form). Я думаю, это потому, что я не очень хорошо справляюсь с ссылкой на форму $, но пробовал разными способами с отрицательными результатами.