Создание прокси класса - PullRequest
2 голосов
/ 28 июня 2011

Я пытаюсь создать класс 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). Я думаю, это потому, что я не очень хорошо справляюсь с ссылкой на форму $, но пробовал разными способами с отрицательными результатами.

1 Ответ

0 голосов
/ 30 июня 2011

Ну, не имея какой-либо конкретной ошибки, держу пари, что ваша проблема в том, что переменная $form не определена в функции init.Это самая очевидная проблема.Вы можете исправить это, поместив $form = $this->_form; после if($this->_formatter != null){

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...