2015-04-13 6 views
1

первой некоторой справочной информации:функция CakePHP Callback вызывается несколько раз

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

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

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

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

Edit: После некоторых соответствующих фрагментов кода:

Контроллер:

 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)); 
     } ... 

Модель:

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

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

Показать код функции. объяснение не поможет вам. И, пожалуйста, укажите, где вы думаете, что происходит ошибка. –

ответ

1

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

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

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

Documentation

+0

хороший подход, но я не вызываю Model :: save через обратный вызов afterSave. Но, тем не менее, спасибо! – tobysas

+0

Итак, как вы сохраняете данные из обратного вызова?Опубликовать код –

+0

Я добавил код – tobysas