ivankff / yii2-upim
yii2 manage images for AR without database
Installs: 170
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:yii2-extension
Requires
- php: >=5.6.0
- beberlei/assert: ^2.7
- kartik-v/yii2-widgets: ^3.4.0
- yiisoft/yii2: ~2.0
- yurkinx/yii2-image: dev-master
Requires (Dev)
- phpunit/phpunit: 4.*
README
Application bootstrap
Yii::setAlias('@cache-image', dirname(dirname(dirname(__DIR__))) . '/alias/cache/image'); Yii::setAlias('@image', dirname(dirname(dirname(__DIR__))) . '/alias/image');
Application config
'components' => [ 'image' => [ 'class' => 'yii\image\ImageDriver', 'driver' => 'GD', //GD or Imagick ], ],
Application params
[ 'images.widen' => 2000, 'images.securityKey' => 'some.security.key', ],
Active Record Entity
/** * @property-read ImagesInterface $images */ class Product extends ActiveRecord { public function behaviors() { return [ 'images' => [ 'class' => 'ivankff\yii2UploadImages\behaviors\ImagesBehavior', 'dir' => '@image/product', 'widen' => (int)ArrayHelper::getValue(Yii::$app->params, 'image.widen', 0), ], ]; } }
Backend controller
public function actions() { return [ 'delete-file' => 'ivankff\yii2UploadImages\actions\DeleteFileAction', ]; }
Backend form model
/** * @property-read string[] $uploadImagesFiles */ class ProductForm extends Model { /** @var UploadedFile */ public $uploadImages; /** * {@inheritdoc} */ public function behaviors() { return [ 'upload' => [ 'class' => 'ivankff\yii2UploadImages\behaviors\UploadBehavior', 'formAttribute' => 'uploadImages', 'initFiles' => $this->_ar->images->getAll(), ], ]; } /** * {@inheritdoc} */ public function rules() { return [ [['uploadImages_keys'], 'string'], [['uploadImages'], 'image', 'maxFiles' => 20], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'uploadImages' => 'Изображения', ]; } /** * @param bool $runValidation * @return bool */ public function save($runValidation = true) { if ($runValidation && !$this->validate()) return false; $this->_ar->images->replace($this->uploadImagesFiles); return $this->_ar->save($runValidation); } }
Backend _form view
$uploadImages = []; foreach ($model->uploadImagesFiles as $i => $image) $uploadImages[] = Yii::$app->router->productThumbnailDop($model->product, $i); echo $form->field($model, 'uploadImages[]')->widget('ivankff\yii2UploadImages\FileInputWidget', [ 'options' => [ 'multiple' => true, ], 'pluginOptions' => [ 'initialPreview' => $uploadImages, 'overwriteInitial' => false, ] ]);
Router component
class Router extends Component { /** * @var string компонент-менеджер фронтенда */ public $urlManagerFrontend = 'urlManagerFrontend'; /** @var UrlManager */ private $_frontendManager; /** * @param Product $product * @param array $params * @param int $i * @return null|string */ public function productThumbnail(Product $product, int $i, $params = []) { $req = $this->_getImageRequest($params, $product->id, $i); return $this->_frontendManager->createUrl(ArrayHelper::merge( ['/catalog/product/picture', 'name' => Inflector::slug($product->title)], $req->getRequestParams() )); } /** * @param array $params * @param int $id * @param int|null $i * @return \ivankff\yii2UploadImages\ImageActionRequest * @throws */ private function _getImageRequest($params, $id, $i = null) { $params['class'] = 'ivankff\yii2UploadImages\actions\ImageActionRequest'; $params['id'] = $id; $params['i'] = $i; return Yii::createObject($params); } }
Frontend controller
public function actions() { return [ 'picture' => [ 'class' => 'ivankff\yii2UploadImages\actions\ImageAction', 'activeRecordClass' => 'common\entities\Product\Product', ], ]; }
_urlManager.php config
['pattern' => 'picture/<name>__p<id:\d+>m.jpg', 'route' => 'catalog/product/picture', 'suffix' => false, 'defaults' => ['i' => 1]], ['pattern' => 'picture/<name>__p<id:\d+>d<i:\d+>.jpg', 'route' => 'catalog/product/picture', 'suffix' => false],