Cakephp 2 моделът beforeSave() не се извиква

Не мога да разбера защо този код не работи. beforeSave не се извиква. Предполага се, че запазването е неуспешно и поставя някои редове в дневника за отстраняване на грешки, но всъщност записва ОК и няма записани редове в дневника за отстраняване на грешки.

<?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
Точно така, проблемът дори не е извикан, false е само за да го тествам, преди да направя действителното запазване, но благодаря за пояснението - person David Mauricio; 25.02.2015