Модель Cakephp 2 перед сохранением () не вызывается

Я не могу понять, почему этот код не работает. beforeSave не вызывается. Предполагается, что при сохранении произойдет сбой, и в журнал отладки будут добавлены некоторые строки, но на самом деле он сохраняет OK, и в журнал отладки не записывается ни одной строки.

<?php
class Link extends AppModel {
    var $name = "Link";
    var $belongsTo = array('Category' => array('className' => 'Category', 'foreignKey' => 'category_id'));

  public function beforeSave(){
        if ($this->data[$this->alias]['id'] == null) {
            $this->log("new record", 'debug');
            $link = $this->find('first',array('conditions' => array('Link.status = 1 AND Link.category_id = '.$this->data[$this->alias]['category_id']), 'order' => array('Link.order DESC') ));
            if (is_null($link)) {
                $this->data[$this->alias]['order'] = 1;
            }else{
                $this->data[$this->alias]['order'] = $link['Link']['order'] + 1;
            }
        }
        else {
            $this->log("old record", 'debug');
        }
        return false;
    }
}   
?>

Запускаю сохранение в контроллере так:

public function add($category_id = null)
    {
        if ($category_id == null) {
            $this->Session->setFlash(__('Category id cant be null'),'default', array('class' => 'error-message'));
            $this->redirect(array('action' => 'index', 'controller' => 'categories'));
        }
        else
        {
            if($this->request->is('post'))
            {
                $this->Link->create();
                $this->Link->set('category_id' => $category_id));
                if($this->Link->save($this->request->data))
                {
                    $this->Session->setFlash(__('The link has been saved'),'default', array('class' => 'success'));
                    $this->redirect(array('action' => 'index/'.$category_id));
                }
                else
                    $this->Session->setFlash(__('The link could not be saved. Please, try again.'),'default', array('class' => 'error-message'));
            }
            $this->set('category_id',$category_id);
        }
    }

Другой вопрос в StackOverflow указывает на то, что метод beforeSave должен быть объявлен в модели. Я также сделал то же самое с другой моделью.


person David Mauricio    schedule 16.07.2012    source источник
comment
В вашем методе добавления добавьте debug(get_class($this->Link)); Что он выводит?   -  person tigrang    schedule 17.07.2012
comment
Спасибо за комментарий. Он отображает: «AppModel» и строку # в контроллере.   -  person David Mauricio    schedule 17.07.2012
comment
И в этом заключается ваша проблема. Он не находит ваше моделирование ссылок, поэтому создает его на основе AppModel. Где вы разместили этот файл и как называется файл для вашей модели Link   -  person tigrang    schedule 17.07.2012
comment
Большое спасибо, расширение файла было проблемой. Если вы хотите вести запись с ответом, продолжайте ..   -  person David Mauricio    schedule 17.07.2012


Ответы (2)


Вот несколько общих советов и несколько комментариев к вашему коду для ответа:

1) Если обратный вызов модели или какой-либо метод модели не работает, убедитесь, что используется правильная модель, а не модель по умолчанию (AppModel). Проверьте имя файла, имя класса, расширение (в вашем случае) и местоположение.

2) Вы неправильно используете массив условий (в данном случае).

array('conditions' => array('Link.status = 1 AND Link.category_id = '.$this->data[$this->alias]['category_id'])

Вы действительно должны делать:

array('conditions' => array('Link.status' => 1, 'Link.category_id' => $this->data[$this->alias]['category_id'])

3) Ваш редирект используется неправильно

$this->redirect(array('action' => 'index/'.$category_id));

Должно быть:

$this->redirect(array('action' => 'index', $category_id));
person tigrang    schedule 17.07.2012
comment
Отлично, еще нужно много практиковаться с cakephp! - person David Mauricio; 17.07.2012
comment
также стоит упомянуть, что вы всегда должны вызывать родительский метод: public function beforeSave() {parent::beforeSave(); ...} чтобы убедиться, что код родительских классов также выполняется правильно. - person mark; 17.07.2012

Как написано, ваш save() всегда будет терпеть неудачу с этим beforeSave(). beforeSave() должен возвращать true, чтобы функция сохранения завершилась успешно. На самом деле ваш, кажется, всегда возвращает false, гарантируя неудачное сохранение.

Из инструкции к торту:

Убедитесь, что функция beforeSave() возвращает значение true, иначе ваше сохранение не удастся.

person DJ Far    schedule 23.02.2015
comment
Точно, проблема даже не вызывается, ложь просто для проверки, прежде чем я сделаю фактическое сохранение, но спасибо за разъяснение - person David Mauricio; 25.02.2015