CakePHP - $this-›data исчезает до того, как Model::save

У меня есть страница для редактирования записей модели Venue в моем приложении. Эта страница работала на каком-то этапе, но сейчас не работает.

в действии контроллера отладка $this->data дает ожидаемый массив значений формы. Однако в модели Venue отладка $this->data в beforeSave дает только значения для полей из связанной (HABTM) модели, Категория:

app/models/venue.php (line 89)
Array
(
    [Category] => Array
        (
            [Category] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 8
                )

        )

)

Что может происходить с этими данными между отправкой формы в действие контроллера и вызовом beforeSave? Где я должен искать, чтобы отладить это?

Благодарность

Редактировать - вот что находится в $this->data в контроллере (фактические данные изменены, чтобы удалить номера телефонов, адреса и т. д.).

app/controllers/venues_controller.php (line 63)
Array
(
    [Venue] => Array
        (
            [id] => 19
            [city_id] => 1
            [user_id] => 130
            [name] => Acme Zoo
            [email] => [email protected]
            [description] => 
Some text...

            [blurb] => Truncated description...
            [contact_id] => 
            [address_1] => Acme Zoo
            [address_2] => Some Road
            [postcode] => PP9 4DD
            [telephone] => 010101010101
            [website] => 
            [latitude] => 55.21222
            [longtitude] => -2.111111
            [featured] => 0
            [active] => 1
            [flagged] => 0
            [smg] => 0
            [smg_custom_icon] => 1
            [listings] => 1
            [send_email] => 0
            [file] => Array
                (
                    [name] => 
                    [type] => 
                    [tmp_name] => 
                    [error] => 4
                    [size] => 0
                )

        )

    [Category] => Array
        (
            [Category] => Array
                (
                    [0] => 3
                    [1] => 6
                    [2] => 10
                )

        )

)

И вот мой код для сохранения данных...

    if (!empty($this->data)) {
        if ($this->Venue->save($this->data)) {
            $this->Session->setFlash('The venue has been saved','success');
            $countryId = $this->Venue->City->field('country_id',array('id'=>$this->data['Venue']['city_id']));
            if (!empty($this->data['Venue']['send_email'])){
                $this->_emailVenue($this->Venue->id,'venue_added',$countryId);
            }
            $this->redirect(array('action' => 'index','city'=>$this->data['Venue']['city_id']));
        } else {
            $this->Session->setFlash('The venue could not be saved. Please, try again.','failure');
        }
    }

person Will    schedule 06.09.2011    source источник
comment
Не могли бы вы опубликовать $this-›данные с вашего контроллера? Мне не нравится внешний вид ['Категории']['Категории']!   -  person Leo    schedule 06.09.2011
comment
покажи код сохранения()   -  person Harsha M V    schedule 06.09.2011
comment
Я добавил эти биты, спасибо. Насколько мне известно, ['Категория']['Категория'] — это то, как Cake взаимодействует с ассоциациями HABTM? В представлении я просто использую $form-›input('Category');   -  person Will    schedule 06.09.2011


Ответы (3)


Я думаю, что нашел решение этой проблемы, но я действительно не уверен, следует ли считать это «хорошим» решением. Я делаю резервную копию данных запроса перед сохранением, а затем восстанавливаю их в случае сбоя.

$temp = $this->request->data;

if ($this->Post->save($this->request->data)) {

}else{
$this->request->data = $temp;
}
person O F    schedule 05.06.2012

Возможно, глупый вопрос, но вы передаете содержимое контроллера $data в модель при вызове метода save()?

$this->Venue->save($this->data)
person nIcO    schedule 06.09.2011
comment
Совсем не глупый вопрос, но да, я передаю данные, как указано выше. Спасибо - person Will; 06.09.2011
comment
ОК :-) Затем я воспользуюсь своим любимым редактором, чтобы запустить действие с XDEBUG, поставлю точку останова перед вызовом save() и пошагово найду, где этот массив изменен. - person nIcO; 06.09.2011
comment
К сожалению, я разрабатываю удаленно в среде общего хостинга, поэтому ничего не могу установить. - person Will; 06.09.2011
comment
Еще одна идея: реализует ли ваша модель Venue поведение, которое каким-либо образом изменит данные? Например, через обратный вызов beforeSave(), который объявит себя? Если я правильно помню, обратные вызовы поведения beforeSave() вызываются перед обратными вызовами моделей. - person nIcO; 07.09.2011
comment
Спасибо, я использую это поведение Revision: bakery.cakephp.org/articles/alkemann/2008/12/18/ и это поведение Sluggable: bakery.cakephp.org/articles/mariano/2007/03/24/. Насколько я вижу, функция beforeSave Sluggable добавляет/изменяет $this-›data['Model']['slug'] и никак не влияет на $this-›data. Похоже, что поведение Revision перед сохранением вообще не влияет на данные $this-›. - person Will; 07.09.2011

Вы одновременно пытаетесь сохранить запись в таблице категорий? Если это так, вы можете использовать $this->Venue->saveAll($this->data) вместо save(). Если вы просто хотите сохранить данные места проведения, просто передайте их в save() вместо всего $this->data следующим образом: $this->Venue->save($this->data['Venue']);

person Brian Glaz    schedule 06.09.2011
comment
Спасибо, Брайан, я сохраняю связь между этим заведением и различными категориями, а не добавляю записи в таблицу категорий. - person Will; 06.09.2011