Sam Dark писал(а):И всё-таки код контроллера и тестовый набор не помешал бы…
Код контроллера:
Код: Выделить всё
public function actionCategoryEdit($id=null) // редактируем категорию
{
$cmodel=Category::model()->findbyPk($id!==null ? $id : $_GET['id']); // загружаем данные по категории
if($cmodel===null)// если данные в модели нет - вызываем ошибку
{
throw new CHttpException(404,'The requested page does not exist.');
}
if($_POST['Category']) // если к нам пришел POST
{
$cmodel->oldImage=$cmodel->txt_image;//сохраняем старую картинку, чтобы не стереть при сохранении модели, если нам не дали новую картинку
$cmodel->attributes=$_POST['Category'];//присваиваем данные из POST в модель
if($cmodel->validate())//валидируем данные
{
$txt_image=CUploadedFile::getInstance($cmodel,'txt_image');//а вдруг нам загрузили картинку к категории?
if (is_object($txt_image) && get_class($txt_image)==='CUploadedFile')//да, картинку нам все таки загрузили
{
$cmodel->txt_image=$txt_image;// присваиваем данные
}
else
{
//картинку нам не дали, восстанавливаем старую картинку
$cmodel->txt_image=$cmodel->oldImage;
}
if($cmodel->save())//сохраняем модель
{
$this->redirect($this->createUrl("admin/category/").'#id'.$_GET['id']);//переносим юзера
}
}
}
//получаем список категорий в виде дерева для <select>
$categoryTree=Category::model()->categoryGetForEdit(
array(
'txt_cattyp'=>$cmodel->txt_cattyp,//название доски
'id'=>$cmodel->id,//ИД, которые редактируем
)
);
// показываем страницу редактирования категории
// лежит здесь: /themes/[theme_name]/views/category/categoryEdit.php
$this->render('categoryEdit',array(
'model'=>$cmodel,
'categoryTree'=>$categoryTree,
'update'=>true
)
);
}
Код модели Category:
Код: Выделить всё
/**
* Processing before the record is saved
*/
protected function beforeSave()
{
$imagePath=Yii::getPathOfAlias('webroot').Yii::app()->params['filesUploadPath'];//путь куда сохраняем картинки
//если нам сказали "удалить картинку"
if(isset($this->deleteImage) and !empty($this->deleteImage))
{
@unlink($imagePath.$this->txt_image);//стираем ее
$this->txt_image='';//обнуляем "картинку"
}
if(is_object($this->txt_image))//тут у нас картинка? да!
{
$pi=pathinfo($this->txt_image->name);//делим на составляющие имя файла (картинки)
$file=mktime(date("H"),date("i"),date("s"),date("n"),date("j"),date("Y")).'.'.$pi['extension'];//генерируем случайное имя файла
//пытаемся сохранить картинку
if(!$this->txt_image->saveAs($imagePath.$file))
//if(!move_uploaded_file($this->txt_image->tempName,$imagePath.$file))
{
//не удалось сохранить картинку
$this->addError('txt_image',$this->txt_image->getError());
return false;
}
//*** сюда попали, если загрузка картинки прошла успешно ***
//удаляем старую картинку (мы ее получили в AdminControllers->actionCategoryEdit)
@unlink($imagePath.$this->oldImage);
$this->convertImage($imagePath,$file);//конвертируем картинку с заданными параметрами
$this->txt_image=$file;
}
if(isset($this->parentСhange) and !empty($this->parentСhange)) // если нам сказали "сменить родительскую категорию"
{
$this->pid=$this->parentСhange_pid;//устанавливаем "родительскую категорию" равной той, что нам передали
}
return parent::beforeSave();
}
Я там подписал: " //пытаемся сохранить картинку".
p.s. Попробовал сделать в CuploadedFile.php так: if((int)$this->_error===UPLOAD_ERR_OK) и все заработало. Видимо прав Caveman, что "приходят" разные типы.