@Maila

Yii2 — почему не загружаются картинки через widget-fileinput?

Пробую вариант загрузки с помощью виджета kartik-v/yii2-widget-fileinput. Виджет установился через composer. Но на странице блога нет строки загрузки "Browse" - чтобы загружать картинки. В чем может быть проблема?
Blog.php
<?php

namespace common\models;

use common\components\behaviors\StatusBehavior;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\db\Expression;
use yii\web\UploadedFile;
use yii\helpers\Url;
use kartik\widgets\FileInput;
use kartik\widgets\ActiveForm;
use app\models\UploadForm;
use yii\imagine\Image;
use yii\helpers\FileHelper;
use yii\grid\GridView;






/**
 * This is the model class for table "blog".
 *
 * @property integer $id


 * @property string $title
 * @property string $image
 * @property string $text
 * @property string $date_create
 * @property string $date_update
 * @property string $url
 * @property integer $status_id
 * @property integer $sort
 * @package common\models

 */
   class Blog extends ActiveRecord {

  const STATUS_LIST = ['off','on'];
   /* public $tags_array;*/
   public $tags_array;
   public $file;
   

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'blog';
    }


    public function behaviors()
    {
         return [
         'timestampBehavior'=>[
            'class' => TimestampBehavior::className(),
            'createdAtAttribute' => 'date_create',
            'updatedAtAttribute' => 'date_update',
            'value' => new Expression('NOW()'),
            ],
            'statusBehavior'=> [
            'class' => StatusBehavior::className(),
            'statusList'=> self::STATUS_LIST,
              ]
         ];
      }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['title', 'url'], 'required'],
            [['text'], 'string'],
            [['url'], 'unique'],
            [['status_id', 'sort'], 'integer'],
            [['sort'], 'integer','max'=>99, 'min'=>1],
            [['title', 'url'], 'string', 'max' => 150],
            [['image'], 'string', 'max' => 100],
            [['image'], 'file', 'extensions'=>'jpg, gif, png'],
            [['tags_array','date_create','date_update'],'safe'],

        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'title' => 'Заголовок',
            'text' => 'Текст',
            'url' => 'ЧПУ',
            'status_id' => 'Статус',
            'sort' => 'Сортировка',
            'date_update' => 'Обновлено',
            'date_create' => 'Создано',
            'tags_array' => 'Тэги',
            'tagsAsString' => 'Тэги',
            'image' => 'Картинка',
            'file' => 'Картинка',
            'author.username'=>'Имя Автора',
            'author.email'=>'Почта Автора',

        ];
    }

    public function getAuthor () {
      return $this->hasOne (User::className(),['id'=>'user_id']);
    
    }

     public function getBlogTag () {
      return $this->hasMany(BlogTag::className(),['blog_id'=>'id']);
    }

      public function getTags()
    {
      return $this->hasMany(Tag::className(),['id'=>'tag_id'])->via('blogTag');
    }

      public function getTagsAsString() 
    {  
       $arr = \yii\helpers\ArrayHelper::map($this->tags,'id','name');
       return implode (', ',$arr);
    }


 public function getSmallImage() 
    {  
      if($this->image){
        $path = str_replace('admin.','',Url::home(true)).'uploads/images/blog/50x50/'.$this->image;
      }else{

        $path = str_replace('admin.','', Url::home(true)).'uploads/images/pic.svg';
      } 
      return $path;
     }

       public function afterFind() 
    {  
      parent::afterFind();
      $this->tags_array = $this->tags;
    }


 public function beforeSave ($insert)

{  
  if ($file = UploadedFile::getInstance($this,'file')) {
      $dir = Yii::getAlias('@images').'/blog/';

  if (!is_dir($dir . $this->image)) {
  if (file_exists($dir.$this->image)){
     unlink($dir.$this->image);
  }
  if (file_exists($dir.'50x50/'.$this->image)) {
     unlink($dir.'50x50/'.$this->image);
  }
  if (file_exists($dir. '800x/'.$this->image)) {
     unlink($dir.'800x/'.$this->image);
  }
}
    $this->image = strtotime ('now').'_'.Yii::$app->getSecurity()->generateRandomString(6) .'.'. $file->extension;
    $file ->saveAs($dir.$this->image);
    $imag = Yii::$app->image->load($dir.$this->image);
    $imag ->background ('#fff',0);
    $imag ->resize ('50','50', Yii\image\drivers\Image::INVERSE);
    $imag ->crop ('50','50');
    $imag ->save($dir.'50x50/'.$this->image, 90);
    $imag = Yii::$app->image->load($dir.$this->image);
    $imag->background('#fff',0);
    $imag->resize('800',null, Yii\image\drivers\Image::INVERSE);
    $imag->save($dir.'800x/'.$this->image, 90);

    }
      return parent::beforeSave($insert);
  }


   public function afterSave ($insert, $changedAttributes) 
    {
      parent::afterSave($insert, $changedAttributes);

      $arr = \yii\helpers\ArrayHelper::map($this->tags,'id','id');
      foreach ($this->tags_array as $one) {
       if(!in_array($one,$arr)){
          $model = new BlogTag();
          $model->blog_id = $this->id;
          $model->tag_id = $one;
          $model->save();
      }
      if(isset($arr[$one])) {
         unset ($arr[$one]);
      }
      }
       BlogTag::deleteAll(['tag_id'=>$arr]);
  }


 }


Bootstrap.php

<?php
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
Yii::setAlias('@images', dirname(dirname(dirname(__DIR__))) . '/public_html/uploads/images');
  • Вопрос задан
  • 771 просмотр
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Виджет установился через composer. Но на странице блога нет строки загрузки "Browse" - чтобы загружать картинки.

То есть Вы думаете, что композер, догадается где Вам нужен виджет и вставит его? Композер просто добавил Вам файлы необходимые для работы с этим виждетом. И зачем Вы модель свою показываете, если отображением view занимается? Если Вам надо добавить виджет в форму, надо открыть файл с формой, скорее всего это _form.php и добавить туда виджет, собственно у картика весьма полное описание его виджетов, установки и настройки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы