Im довольно новый для Yii, и просто добавил функцию, которую администратор может загружать несколькими файлами. Тем не менее, модель сохраняет изображения, которые загружаются в соответствующую папку, но не сохраняет пути/имена изображений в базе данных.
Как я могу это сделать?
база данных выглядит так:
id | naam | беспроигрышные | prijs | actieprijs | категоризация | подкатегория | изображения | toegevoegd | aangepast | aangepast_door
контроллер:
$model=$this->loadModel($id);
$dir = Yii::getPathOfAlias('webroot.images.producten');
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Producten']))
{
$model->attributes=$_POST['Producten'];
$images = CUploadedFile::getInstancesByName('images');
// proceed if the images have been set
if (isset($images) && count($images) > 0) {
// go through each uploaded image
foreach ($images as $image => $pic) {
$fn = str_replace(" ", "-", $pic->name);
if ($pic->saveAs($dir.'/'.$fn)) {
// add it to the main model now
$img_add = new Producten();
$img_add->images = $fn; //it might be $img_add->name for you, filename is just what I chose to call it in my model
$img_add->save(); // DONE
}
}
}
else{
// handle the errors here, if you want
}
// save the rest of your information from the form
if ($model->save()) {
$this->redirect(array('view','id'=>$model->id));
}
/*
$model->images=CUploadedFile::getInstance($model,'images');
$nf = str_replace(" ", "+", $model->images);
if($model->save()){
$model->images->saveAs($dir.'/'.$nf);
$model->images = $nf;
$this->redirect(array('view','id'=>$model->id));
}
*/
}
$this->render('create',array(
'model'=>$model,
));
Пожалуйста помоги!!
Я понял, что он сохранил изображение в базе данных, поэтому, если я загрузил 5 фотографий, в базе данных будет только последняя фотография. Тем не менее, они сохранили все 5 на правильный путь. Теперь я сделал это, и, похоже, он работает:
public function actionCreate()
{
$model=new Producten;
$dir = Yii::getPathOfAlias('webroot.images.producten');
if(isset($_POST['Producten']))
{
$old_images = explode(',',strtoupper($model->images));
$model->attributes=$_POST['Producten'];
$images = CUploadedFile::getInstancesByName('images');
if (isset($images) && count($images) > 0) {
$img_add = new Producten();
foreach ($images as $image => $pic) {
$fn = str_replace(" ", "-", strtoupper($pic->name));
if ($pic->saveAs($dir.'/'.$fn)) {
if(!in_array($fn, $old_images)){
$model->images .= $fn.",";
}
}
}
}
$model->toegevoegd=date('Y-m-d H:i:s', strtotime('now'));
$model->aangepast=date('Y-m-d H:i:s', strtotime('now'));
$model->aangepast_door=Yii::app()->user->id;
if ($model->save()) {
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create',array(
'model'=>$model,
));
}
Кажется, у вас код в порядке. Здесь я предлагаю вам добавить отчет об ошибках, чтобы увидеть, есть ли какая-либо ошибка. Просто попробуйте ниже коды
$img_add->images = $fn;
if(!$img_add->save()){
var_dump($img_add->getErrors());
}
Не нужно создавать объект Producten
model несколько раз в foreach()
. Вы можете разместить $img_add = new Producten();
перед foreach()
. Также можно использовать unset($img_add->images)
перед назначением $img_add->images = $fn;
если необходимо.