Cakephp Callback функция вызывается несколько раз

Сначала немного справочной информации:

Пользователь может заполнить несколько текстовых полей ввода и загрузить несколько изображений (в одном поле загрузки). После отправки формы текст из текстовых полей сохраняется в БД с $this->XXX->save(), Кроме того, данные (в частности, изображения из файла загрузки) обрабатываются в функции обратного вызова afterSave(), Все идет нормально.

Теперь к проблеме:

Кажется, что функция обратного вызова вызывается несколько раз (1 раз для каждого загруженного изображения). Так что проблема в том, что в первый раз все хорошо, но после этого $this->data массив в основном пустой (все текстовые поля = '') поэтому функция обратного вызова выдает некоторые исключения, потому что нет данных. Я решил проблему, просто проверив isset() и так далее, но я думаю, что это не решает проблему.

Поэтому мой вопрос: почему функция обратного вызова вызывается несколько раз и как я могу предотвратить это?

Изменить: после некоторых соответствующих фрагментов кода:

контроллер:

      if ($this->request->is('post') || $this->request->is('put')) {

        if($aid==null) $this->Article->create();
        if ($this->Article->save($this->data)) {
            $this->Session->setFlash(__('The article has been saved'), 'flash_custom');
            return $this->redirect(array('controller' => 'articles', 'action' => 'view', $this->id));
        } ...

Модель:

Я думаю, что большая часть этого здесь не актуальна.. В общем, я отправляю данные другим моделям, где эти данные сохраняются в других таблицах БД, как это для изображений

 if ($this->data['Article']['picture']) {
   foreach ($this->data['Article']['picture'] as $picture) {
       if (is_uploaded_file($picture['tmp_name']) && (substr($picture['type'], 0, 5) == "image") && $numberOfPictures < $pictures_allowed) {
           $this->Picture->addPicture($picture, $this->id);
       }
       $numberOfPictures++;
   }

Дамп ошибки:

Я думаю, что Дамп из $this->data массив довольно интересный здесь (объяснение ниже)

array(
'Article' => array(
    'pictures' => '0',
    'title' => 'Error Test',
    'abstract' => 'Test abstract',
    'body' => 'Testtext',
    'picture' => array(
        (int) 0 => array(
            [maximum depth reached]
        ),
        (int) 1 => array(
            [maximum depth reached]
        ),
        (int) 2 => array(
            [maximum depth reached]
        )
    ),
    'modified' => '2015-04-13 22:00:09',
    'created' => '2015-04-13 22:00:09',
    'id' => '294'
))


Notice (8): Undefined index: title [APP/Model/Article.php, line 723]
Notice (8): Undefined index: body [APP/Model/Article.php, line 724]
Notice (8): Undefined index: abstract [APP/Model/Article.php, line 725]

array(
    'Article' => array(
        'id' => '294',
        'pictures' => (int) 1,
        'modified' => '2015-04-13 22:00:09',
        'title' => '',
        'body' => '',
        'abstract' => '',
    )
)

Notice (8): Undefined index: picture [APP/Model/Article.php, line 777]

Notice (8): Undefined index: title [APP/Model/Article.php, line 723]

Notice (8): Undefined index: body [APP/Model/Article.php, line 724]

Notice (8): Undefined index: abstract [APP/Model/Article.php, line 725]

array(
    'Article' => array(
        'id' => '294',
        'pictures' => (int) 2,
        'modified' => '2015-04-13 22:00:10',
        'title' => '',
        'body' => '',
        'abstract' => '',
    )
)

Notice (8): Undefined index: picture [APP/Model/Article.php, line 777]

Notice (8): Undefined index: title [APP/Model/Article.php, line 723]

Notice (8): Undefined index: body [APP/Model/Article.php, line 724]

Notice (8): Undefined index: abstract [APP/Model/Article.php, line 725]

array(
    'Article' => array(
        'id' => '294',
        'pictures' => (int) 3,
        'modified' => '2015-04-13 22:00:10',
        'title' => '',
        'body' => '',
        'abstract' => '',
    )
)

Notice (8): Undefined index: picture [APP/Model/Article.php, line 777]

Объяснение:

Я только что бросил $this->data один раз, но, как вы видите, я загрузил 3 картинки и получил 3 звонка после сохранения и так 3 $this->data отвалов. В первый раз все хорошо, но после этого выдаются некоторые предупреждения, потому что массив больше не заполняется.

Я надеюсь, что эта дополнительная информация может помочь вам

1 ответ

Решение

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

Отключите обратные вызовы в методе сохранения, который вы используете в послесохранении

$this->save($data, array('callbacks' => false));

Документация

Другие вопросы по тегам