Мне надо дать менеджеру возможность загружать в images картинки, чтобы потом дать возможность выбрать загруженную картинку в другой форме. посмотрел http://dbhelp.ru/form-file-upload/page/ но тут Item extends CActiveRecord что и не понятно. Может кто подскажет примерный план действий.
По ссылке, автор использует CActiveRecord для того что бы воспользоваться функцией валидации, проверит что передано через post в переменную image. Если тип загруженного файла будет jpg, gif, png то происходит запись чего то в базу, и сохранение файла на сервер. Если тип не соответствует, то сново отобразиться форма с сообщением об ошибке в image.
Если не нужно делать запись в базу то можно воспользоваться и CModel или что даже лучше сразу CFileValidator
я так понял рекомндуется сделать так:
-
в форме ввода итема должно быть поле выбора файла,
-
в модели итема должно быть правило валидации
при выборе файла и сабмите выбранный файл загружается на сервер в папку image. что дальше: если делается апдейт итема - можно сделать если пусто показывать таг выбора файла если что-то есть показывать файл. но что делать если файл есть и надо его менять.
думаю сделать отдельный контроллер именно для загрузки файлов а в контроллере итемов уже дроплист выбора нужного файла. поэтому сделал вот так:
модель:
<?php
class Image extends CFormModel
{
public $image;
public function rules()
{
return array(
array('image', 'file', 'types'=>'jpg, gif, png'),
);
}
}
?>
контроллер:
<?php
class ImageController extends CController
{
public function actionCreate()
{
$model=new Image;
echo $_POST['image'];
if(isset($_POST['image']))
{
$model->attributes=$_POST['image'];
$model->image=CUploadedFile::getInstance($model,'image');
if($model->save())
{
$model->image->saveAs('images/test');
}
}
$this->render('create', array('model'=>$model));
}
}
?>
и вью:
<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>
...
<?php echo CHtml::activeFileField($model, 'image'); ?>
<div class="row buttons">
<?php echo CHtml::submitButton('Create' ); ?>
</div>
</form>
…и что-то не работат - ошибок нет но и файлы не грузятся. кто подскажет?
Меня смущает строчка
if(isset($_POST['image']))
Имя модели то у вас с большой буквы начинается.
Само собой, проверьте, что есть права на запись в директорию.
$model->image->saveAs('images/test');
Файл у вас сохранится в директорию images под именем test (без расширения).
Еще я бы весь этот блок с сохранением вынес в метод afterSave() класса Image.
странно то что форма не возвращает никаких значений из
<?php echo CHtml::activeFileField($model, 'image'); ?>
- элемент массива $_post с именем image есть но он пустой.
сделал примерно так
<?php echo CHtml::beginForm('','post',array('enctype'=>'multipart/form-data')); ?>
<?php echo CHtml::activeFileField($model, 'image'); ?>
<?php echo CHtml::activeTextField($model, 'retro'); ?>
<?php echo CHtml::submitButton('Create' ); ?>
<?php echo CHtml::endForm(); ?>
в контроллере дописал
var_dump ( $_POST );
резльтат
array(2) { ["Item"]=> array(2) { ["image"]=> string(0) "" ["retro"]=> string(9) "text-text" } ["yt0"]=> string(6) "Create" }
получается поле retro возвращается а image - нет. мистика
так что тут может быть не так?
var_dump($_FILES);
ага все заработало. ошибка
if(isset($_POST['image']))