Это Yii или я не прав? - PullRequest
       3

Это Yii или я не прав?

0 голосов
/ 24 января 2012

Привет, я написал код, который перебирает весь массив, копирует изображения в папку и вставляет данные в запись.Самое смешное, что $model->save() не показывает ошибку, а возвращает true.и программа никогда не переходит в

. Теперь, что происходит, цикл продолжает работать и завершает свою работу без прерывания.Я не могу догадаться, кто не прав.у меня больше шансов, как и у меня большую часть времени:)

вот код

   protected function saveImage($formData,$model)
        {                   
               if ($formData === null)
                   return;                   
                $idx=0;

            foreach($formData['title'] as $image)
            {
                $model->title = $image;                    
                $file= dirname(Yii::app()->request->scriptFile) . DIRECTORY_SEPARATOR 
                        . DIRECTORY_SEPARATOR .'images\hotelImages'. DIRECTORY_SEPARATOR 
                        . $model->hotel->name;

                $model->image = Yii::app()->baseUrl. "/images/hotelImages/".$_FILES['HotelImages']['name'][$idx];//image path

                if($model->save())
                { 
                    echo $idx.'<br /> it was sucess<br />';

                    If(file_exists($file)) 
                    {
                        copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                    }
                    else
                    {
                         mkdir($file); 
                        copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                    }
                    $idx++;

                }//if there was error
                 else
                 {
                     print_r($model->getErrors());
                     yii::app()->end();                
                    return FALSE;
                 }
                 echo '<br />end reached <br />';


            }
             yii::app()->end(); 
             return true;
        }

var_dump для $ formdata равно

array
(
    'title' => array
    (
        '0' => 'title1'
        '1' => 'title2'
    )
)

Нет, что бы ни значилокогда-либо счетчик итераций для базы данных цикла foreach получает только одну строку

Ответы [ 4 ]

4 голосов
/ 24 января 2012

Метод save() вставляет запись в базу данных , если она еще не существует, и в противном случае обновляет эту же запись базы данных .

$model передается как параметр метода, и я просто предполагаю, что его атрибут title не является первичным ключом.

Другими словами, вы продолжаете обновлять одну и ту же запись базы данных снова и снова, поэтому вы видите только одну запись в базе данных.

0 голосов
/ 18 июля 2012

Yii CActiveRecord имеет переменную isNewRecord, ее значение равно true, когда объект создается, и остается истинным, пока не будет вызвана функция поиска или сохранения. Когда модель вызывает функцию сохранения, для isNewRecord устанавливается значение false.

Таким образом, в вашем случае вам нужно устанавливать значение true этой переменной "isNewRecord" каждый раз, прежде чем вызывать функцию сохранения, или каждый раз создавать новую модель, чем вызывать функцию сохранения.

Смотрите изменения в вашем коде ::

$model->setIsNewRecord(True); // changes code line

   protected function saveImage($formData,$model)
    {                   
           if ($formData === null)
               return;                   
            $idx=0;

        foreach($formData['title'] as $image)
        {
            $model->setIsNewRecord(True); // for each new record
            $model->title = $image;                    
            $file= dirname(Yii::app()->request->scriptFile) . DIRECTORY_SEPARATOR 
                    . DIRECTORY_SEPARATOR .'images\hotelImages'. DIRECTORY_SEPARATOR 
                    . $model->hotel->name;

            $model->image = Yii::app()->baseUrl. "/images/hotelImages/".$_FILES['HotelImages']['name'][$idx];//image path

            if($model->save())
            { 
                echo $idx.'<br /> it was sucess<br />';

                If(file_exists($file)) 
                {
                    copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                }
                else
                {
                     mkdir($file); 
                    copy($_FILES['HotelImages']['tmp_name'][$idx],$file."/".$_FILES['HotelImages']['name'][$idx]);
                }
                $idx++;

            }//if there was error
             else
             {
                 print_r($model->getErrors());
                 yii::app()->end();                
                return FALSE;
             }
             echo '<br />end reached <br />';


        }
         yii::app()->end(); 
         return true;
    }
0 голосов
/ 24 января 2012

И снова я ошибаюсь :)

Проблема заключалась в том, что в каждом foreach ietration $ model был предыдущий, и не было создано Новое мгновение $ model, и yii подумал, что, эй, его старый, вероятно, этот Geek обновляет его. так что это it.it обновления в базе данных.

только что сделал $model = new HotelImages;

до их заполнения

Благодарю Пятизначный Только за идею.

Я твердо верю в это


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

0 голосов
/ 24 января 2012

@ Пятизначный анализ верен.Мое предлагаемое исправление должно было бы уменьшить сложность этого метода.Поместите все в foreach в свой собственный метод (например, saveImage), затем сделайте что-то вроде:

foreach($formData['title'] as $image) {
  $this->saveImage($image, new Image);
}

Этот метод немного супер-метод, и вы можете найти его прощеразбить его на разные методы.Возможно, используйте компонент для управления копированием файлов вместо заполнения контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...