M
M
Maila2017-07-22 21:07:41
Yii
Maila, 2017-07-22 21:07:41

Yii2 - why images are not loaded via widget-fileinput?

I'm trying the upload option using the kartik-v/yii2-widget-fileinput widget. Widget installed via composer. But there is no "Browse" upload line on the blog page - to upload images. What could be the problem?
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');

Answer the question

In order to leave comments, you need to log in

[[+comments_count]] answer(s)
M
Maxim Timofeev, 2017-07-24
@webinar

Widget installed via composer. But there is no "Browse" upload line on the blog page - to upload images.

That is, you think that the composer will guess where you need the widget and insert it? Composer just added the files you need to work with this widget. And why do you show your model if the view is displaying? If you need to add a widget to the form, you need to open the file with the form, most likely it is _form.php and add the widget there, the card itself has a very complete description of its widgets, installation and settings.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question