Изменение значений в хуках BeforeInsert или BeforeSave

Я делаю это с очень простым классом, просто чтобы научиться, но я не могу заставить его работать, как я вижу в http://agiletoolkit.org/learn/understand/model/actions

Это определение класса:

class Model_Task extends Model_Table {
   public $table='task';
    function init(){
        parent::init();
        $this->addField('user_id')->system(true);
        $this->addField('name')->mandatory('No has indicado un nombre para la tarea');
        $this->addField('description')->dataType('text');
        $this->addField('state')->system(true);

        $this->addHook('beforeSave',function($m){
            $m->description='test'; 
                return $m;
        });
        $this->debug();
    }  
}

Я тоже пробовал формат страницы Samble:

class Model_Task extends Model_Table {

public $table='task';
    function init(){
        parent::init();
        $this->addField('user_id')->system(true);
        $this->addField('name')->mandatory('No has indicado un nombre para la tarea');
        $this->addField('description')->dataType('text');
        $this->addField('state')->system(true);

        $this->addHook('beforeSave',$this);
        $this->debug();
    }  

    function BeforeSave(){
        $this->description='test';
        return $this;
    }
}

Страница теста задачи тоже проста:

class page_Task extends Page {
    function init(){
        parent::init();

    $m=$this->add('Model_Task');
    $f=$this->add('Form');
        $f->setModel($m);
        $f->addSubmit('Guardar');

    //Task submit
    $f->onSubmit(function($form){
            $form->update();
            $form->js()->univ()->redirect('index?add_ok=1')->execute();
        });  
    }
}

В обеих реализациях описание модели сохраняется со значением, вставленным в форму, а не с «Тестом». Если я повторю $ this-> description или $ m-> description внутри функции beforeTest, он будет пустым, прежде чем я установлю его, а затем - «Test», но ничего не сделает с сгенерированным sql. Конечно, я что-то пропускаю, но ЧТО?

Спасибо!!


person Jaume    schedule 17.06.2012    source источник


Ответы (1)


Правильный способ изменить значение:

$this['description'] = 'test;
person romaninsh    schedule 17.06.2012
comment
Спасибо, Роман! Я начал с этого и перешел на - ›чтобы посмотреть, работает ли он, и я отправил свой образец с таким синтаксисом, но я проверил $ ​​this ['description'] раньше. - person Jaume; 17.06.2012
comment
Спасибо, Роман! Я начал с этого и перешел на - ›чтобы посмотреть, работает ли он, и я отправил свой образец с таким синтаксисом, но я проверил $ ​​this ['description'] раньше. Теперь я снова проверил его и вижу, что он работает в beforeSave, но не в BeforeInsert. В beforeInsert запускается ловушка, но запрос sql, который я вижу в режиме отладки, не изменяется. Для меня это не проблема, потому что я могу использовать beforSave и проверять идентификатор, чтобы узнать, вставляю ли я или обновляю, но я не знаю, почему это происходит. Спасибо, что ответили в воскресенье !! :) - person Jaume; 17.06.2012
comment
beforeInsert передается запрос во втором аргументе, поэтому значения, которые вы изменяете в модели, больше не влияют на него. function beforeInsert($q,$m){ $q->set('somefield','someval'); }, конечно, debug () тоже очень поможет. - person romaninsh; 19.06.2012
comment
Я улучшил документацию здесь: agiletoolkit.org/learn/understand/model/actions чтобы подробно объяснить, как работает каждый крючок и когда его следует использовать. - person romaninsh; 19.06.2012