Ошибка при создании компонента для работы с рисунками

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
romaten1
Сообщения: 6
Зарегистрирован: 2013.09.25, 17:36

Ошибка при создании компонента для работы с рисунками

Сообщение romaten1 »

В контроллере в actionCreate() нужно сохранить рисунок и обработать его. Этот код в контроллере работает (тоесть сохраняется рисунок в нужной папке, уменшается, создается thumb)

Код: Выделить всё

public function actionCreate()
    {
        $model = new Cafedra();
        if ($model->load(Yii::$app->request->post())) {
            // Получаем массив данных по загружамому файлу
            $image_id = UploadedFile::getInstance($model, 'image_id');
            $filename = $image_id->name;
            $ext = end((explode(".", $image_id->name)));
            // Генерируем уникальное имя файла
            $model->title_en =  TransliterateHelper::cyrillicToLatin($model->title);
            $model->image_id = 'cafedra-'. 
                                substr($model->title_en, 0, 6) . '-' . 
                                Yii::$app->getSecurity()->generateRandomString(5). '.'.$ext;
            $image_name = $model->image_id;
            // Путь к папке где будет хранится файл
            $path = Yii::$app->basePath . '/uploads/cafedra/' . $model->image_id;
            
            if($model->save()){
                
                // Сохраняем рисунок
                $image_id->saveAs($path);
                // Обработка загруженного изображения '600', '400'
                $image_full = Yii::$app->image->load($path);
                $full_path = Yii::$app->basePath . '/uploads/cafedra/' . $image_name;
                $image_full->resize('600', '400');
                $image_full->save($full_path);
                // Создание thumbs
                $image_less = Yii::$app->image->load($path);
                $less_path = Yii::$app->basePath . '/uploads/cafedra/thumbs/thumb_' . $image_name;
                $image_less->resize('50', '50');
                $image_less->save($less_path);
                return $this->redirect(['view', 'id'=>$model->id]);
            } else {
                throw new NotFoundHttpException('Не удалось загрузить данные');
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                ]);
        }
    }
 
Для удобства работы хочу создать компонент

Код: Выделить всё

namespace app\components\imageHandler;

use yii\base\Component;
use yii\web\UploadedFile;
use yii\imagine\Image;
use app\helpers\TransliterateHelper;

class ImageHandler extends Component
{
    public static function createImage($model, $module, $attribute = 'image_id' )
        {
                   // Получаем массив данных по загружамых файлах
            $image_id = UploadedFile::getInstance($model, $attribute);
            $filename = $image_id->name;
            $ext = end((explode(".", $image_id->name)));
            // Генерируем уникальное имя файла
            $model->title_en =  TransliterateHelper::cyrillicToLatin($model->title);
            $model->image_id = $attribute . '-'. 
                                substr($model->title_en, 0, 6) . '-' . 
                                //Yii::$app->getSecurity()->generateRandomString(5). '.'.$ext;
                                'abcde.'.$ext;
            $image_name = $model->image_id;
            // Путь к папке где будет хранится файл
            $path = \Yii::$app->basePath . '/uploads/'.$module.'/' . $model->image_id;
            
            if($model->save()){
                
                // Сохраняем рисунок
                $image_id->saveAs($path);

                $image_full = \Yii::$app->image->load($path);
                $full_path = \Yii::$app->basePath . '/uploads/'.$module.'/' . $image_name;
                $image_full->resize('600', '400');
                $image_full->save($full_path);
                // Обработка загруженного изображения и создание thumbs
                $image_less = \Yii::$app->image->load($path);
                $less_path = \Yii::$app->basePath . '/uploads/'.$module.'/' .' thumbs/thumb_' . $image_name;
                $image_less->resize('50', '50');
                $image_less->save($less_path);
                return $this->redirect(['view', 'id'=>$model->id]);
            } else {
                throw new NotFoundHttpException('Не удалось загрузить данные');
            }           
}
и использую его

Код: Выделить всё

Yii::$app->imageHandler->createImage($model, 'cafedra');
То выдает ошибку Directory must be writable:
Я так понимаю что оно пытается создать новый екземпляр приложения, а не использовать существующий. Или возможно причина ошибки в чем то другом?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Ошибка при создании компонента для работы с рисунками

Сообщение slavcodev »

Пробел лишний в пути, и т.к. такой директории нет, то и ошибка "Directory must be writable"

Код: Выделить всё

$less_path = \Yii::$app->basePath . '/uploads/'.$module.'/' .' thumbs/thumb_' . $image_name;
Жду Yii 3!
romaten1
Сообщения: 6
Зарегистрирован: 2013.09.25, 17:36

Re: Ошибка при создании компонента для работы с рисунками

Сообщение romaten1 »

Обычная очепятка ((
Я уже начал было теории создавать, что есть причиной. Не думал, что простое отсуствие папки может быть причиной Directory must be writable:. Теперь буду знать.
Работает! Спасибо!
Закрыто