сохранение данных для другой модели и проблемы с перенаправлением, в cakephp - PullRequest
0 голосов
/ 14 октября 2010

Когда я сохраняю данные в одной модели, я хотел бы создать некоторые данные в другой модели и сохранить их тоже.Поскольку я не могу сделать это с помощью beforeSave () , я в конечном итоге решил использовать afterSave () для создания новых элементов данных в моей второй модели.Я не пишу приложение для блога, но для использования аналогии с блогом это эквивалентно автоматическому созданию серии комментариев для каждого добавляемого сообщения в блоге и, когда сообщение редактируется, удалению всех комментариев и повторному добавлению новых комментариев:

class Post extends AppModel {
    function afterSave() {
        ClassRegistry::init('Comments')->deleteAll(array('Post.id' => $this->id));
        ClassRegistry::init('Comments')->saveAll($comments); // comments contains the comments to be added
    }
}

Это прекрасно работает, за исключением того факта, что функция afterSave () вызывает перенаправление действий добавления / редактирования моего контроллера (на /posts/index), и меня перенаправляют обратно на добавление.Вместо этого используйте форму / edit (если я закомментирую весь метод afterSave (), перенаправление работает как задумано).

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

Я думаю, у меня есть два вопроса:

  • Есть ли лучший способ достичь такого результата?

  • Как я могу заставить перенаправление работать?

Спасибо, что прочитали это далеко, и если я не объяснил это ясно, я надеюсь, что вы можетеИспользуйте свое воображение, чтобы увидеть, что я пытаюсь сделать.

Ответы [ 3 ]

0 голосов
/ 14 октября 2010

В (несколько маловероятном) случае, когда у кого-то есть такая же проблема, я обнаружил, что настройка

'atomic' => false

в опциях saveAll () решает проблему с перенаправлением. Понятия не имею почему.

0 голосов
/ 15 октября 2010

Вы не можете сделать?:

<?php
function edit_post($id = null) {
    if (!$id && empty($this->data)) {
        // error...
    }       
    if (!empty($this->data)) {
        if ($this->Post->save($this->data)) {
            ClassRegistry::init('Comments')->deleteAll(array('Post.id' => $this->Post->id));
            ClassRegistry::init('Comments')->saveAll($comments); // comments contains the comments to be added
        } else {
            // error...
        }
    }       
    if (empty($this->data)) {
        $this->data = $this->Post->read(null, $id);
    }
}
?>
0 голосов
/ 14 октября 2010

Я думаю, вам нужно включить return true в конце вашей afterSave() функции. Это похоже на достойный подход, если вы не хотите помещать его в контроллер. Хотя я бы подумал о том, всегда ли вы захотите добавлять эти комментарии (или какими бы они ни были) после каждого сохранения, даже обновления в одном поле.

...