Для редактирования статьи поставил pendalf89\filemanager\widgets\TinyMce Этот виджет меня обалдеть как устраивает создавая превьюшки разных размеров на лету, вставки их в текст, структура папок для загрузки как у меня в вордпресс, но есть один недостаток, куча фото загружается сами по себе и кроме как в теле статьи автоматом не выведешь.
Таким образом, нужна связь с ID статьи.
Имеется модель статей Article.
В виджете есть модель Mediafile. Добавил в таблицу колонку article_id
Связь между ними создал id = article_id
А вот как сохранить в article_id id статьи к которой загружается файл не понимаю как сделать, по тем примерам, что в документации и гугле нашел ничего не получается.
Вот содержимое Mediafile
Код: Выделить всё
<?php
namespace pendalf89\filemanager\models;
use backend\models\Article;
use Yii;
use yii\web\UploadedFile;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\imagine\Image;
use yii\data\ActiveDataProvider;
use yii\helpers\Html;
use yii\helpers\Inflector;
use pendalf89\filemanager\Module;
use pendalf89\filemanager\models\Owners;
use Imagine\Image\ImageInterface;
...
class Mediafile extends ActiveRecord
{
....
public function rules()
{
return [
[['filename', 'type', 'url', 'size'], 'required'],
[['url', 'alt', 'description', 'thumbs'], 'string'],
[['created_at', 'updated_at', 'size', 'article_id'], 'integer'],
[['filename', 'type'], 'string', 'max' => 255],
[['file'], 'file'],
[['tagIds'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Module::t('main', 'ID'),
'article_id' => Module::t('main', 'ID article'),
'filename' => Module::t('main', 'filename'),
'type' => Module::t('main', 'Type'),
'url' => Module::t('main', 'Url'),
'alt' => Module::t('main', 'Alt attribute'),
'size' => Module::t('main', 'Size'),
'description' => Module::t('main', 'Description'),
'thumbs' => Module::t('main', 'Thumbnails'),
'created_at' => Module::t('main', 'Created'),
'updated_at' => Module::t('main', 'Updated'),
'tagIds' => Module::t('main', 'Tags'),
];
}
....
/**
* Save just uploaded file
* @param array $routes routes from module settings
* @param bool $rename
* @return bool
*/
public function saveUploadedFile(array $routes, $rename = false)
{
$year = date('Y', time());
$month = date('m', time());
$structure = "$routes[baseUrl]/$routes[uploadPath]/$year/$month";
$basePath = Yii::getAlias($routes['basePath']);
$absolutePath = "$basePath/$structure";
// create actual directory structure "yyyy/mm"
if (!file_exists($absolutePath)) {
mkdir($absolutePath, 0777, true);
}
// get file instance
$this->file = UploadedFile::getInstance($this, 'file');
//if a file with the same name already exist append a number
$counter = 0;
do{
if($counter==0)
$filename = Inflector::slug($this->file->baseName).'.'. $this->file->extension;
else{
//if we don't want to rename we finish the call here
if($rename == false)
return false;
$filename = Inflector::slug($this->file->baseName). $counter.'.'. $this->file->extension;
}
$url = "$structure/$filename";
$counter++;
} while(self::findByUrl($url)); // checks for existing url in db
// save original uploaded file
$this->file->saveAs("$absolutePath/$filename");
$this->filename = $filename;
$this->type = $this->file->type;
$this->size = $this->file->size;
$this->url = $url;
return $this->save();
}....
Код: Выделить всё
.....
/**
* Provides upload file
* @return mixed
*/
public function actionUpload()
{
Yii::$app->response->format = Response::FORMAT_JSON;
$model = new Mediafile();
/*$model->article_id = */
$routes = $this->module->routes;
$rename = $this->module->rename;
$tagIds = Yii::$app->request->post('tagIds');
if ($tagIds !== 'undefined') {
$model->setTagIds(explode(',', $tagIds));
}
$model->saveUploadedFile($routes, $rename);
$bundle = FilemanagerAsset::register($this->view);
if ($model->isImage()) {
$model->createThumbs($routes, $this->module->thumbs);
}
$response['files'][] = [
'url' => $model->url,
'thumbnailUrl' => $model->getDefaultThumbUrl($bundle->baseUrl),
'name' => $model->filename,
'type' => $model->type,
'size' => $model->file->size,
'deleteUrl' => Url::to(['file/delete', 'id' => $model->id]),
'deleteType' => 'POST',
];
return $response;
}
.....