Commit 1f90c5f48da7bc5796ed1296bac863cbd5efe170

Authored by Karnovsky A
1 parent 74aca081

ArtboxImage resizer

common/components/artboximage/ArtboxImage.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\components\artboximage;
  4 +
  5 +use Yii;
  6 +use yii\base\Component;
  7 +use yii\base\ErrorException;
  8 +use yii\image\drivers\Image;
  9 +
  10 +//use common\components\artboximage\drivers\Image;
  11 +
  12 +class ArtboxImage extends Component {
  13 +
  14 + public $driver;
  15 +
  16 + public $presets = [];
  17 +
  18 + public $rootPath;
  19 + public $rootUrl;
  20 +
  21 + public $extensions = [
  22 + 'jpg' => 'jpeg',
  23 + 'jpeg' => 'jpeg',
  24 + 'png' => 'png',
  25 + 'gif' => 'gif',
  26 + 'bmp' => 'bmp',
  27 + ];
  28 +
  29 + public function load($file = null, $driver = null) {
  30 + if(empty($file) || !realpath($file)) {
  31 + throw new ErrorException('File name can not be empty and exists');
  32 + }
  33 + return Image::factory($file, $driver ? $driver : $this->driver);
  34 + }
  35 +}
0 36 \ No newline at end of file
... ...
common/components/artboximage/ArtboxImageHelper.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\components\artboximage;
  4 +
  5 +use Yii;
  6 +use yii\base\Object;
  7 +use yii\helpers\ArrayHelper;
  8 +use yii\helpers\Html;
  9 +use yii\web\HttpException;
  10 +
  11 +class ArtboxImageHelper extends Object {
  12 + /** @var ArtboxImage $imageDriver */
  13 + private static $imageDriver;
  14 + private static $presets;
  15 +
  16 + public function getDriver() {
  17 + if (empty(self::$imageDriver)) {
  18 + self::$imageDriver = Yii::$app->artboximage;
  19 + }
  20 + return self::$imageDriver;
  21 + }
  22 +
  23 + public function getPreset($preset) {
  24 + if (empty(self::$presets)) {
  25 + self::$presets = self::getDriver()->presets;
  26 + }
  27 + return empty(self::$presets[$preset]) ? null : self::$presets[$preset];
  28 + }
  29 +
  30 + public static function getImage($file, $preset, $imgOptions = []) {
  31 + return Html::img(self::getImageSrc($file, $preset), $imgOptions);
  32 + }
  33 +
  34 + public static function getImageSrc($file, $preset, $preset_alias = null) {
  35 + if (is_string($preset)) {
  36 + $preset_alias = $preset;
  37 + $preset = self::getPreset($preset);
  38 + }
  39 + if (empty($preset) || empty($preset_alias)) {
  40 + return $file;
  41 + }
  42 + $filePath = self::getPathFromUrl($file);
  43 + if (!file_exists($filePath) || !preg_match('#^(.*)\.(' . self::getExtensionsRegexp() . ')$#', $file, $matches)) {
  44 + return $file;
  45 + }
  46 + return self::getPresetUrl($filePath, $preset, $preset_alias);
  47 + }
  48 +
  49 + private static function getPathFromUrl($url) {
  50 + return substr_replace($url, self::getDriver()->rootPath, 0, strlen(self::getDriver()->rootUrl));
  51 + }
  52 +
  53 + private static function getUrlFromPath($path) {
  54 + return substr_replace($path, self::getDriver()->rootUrl, 0, strlen(self::getDriver()->rootPath));
  55 + }
  56 +
  57 + private static function getPresetUrl($filePath, $preset, $preset_alias) {
  58 + $pathinfo = pathinfo($filePath);
  59 + $presetPath = $pathinfo['dirname'] .'/styles/'. strtolower($preset_alias);
  60 + $presetFilePath = $presetPath .'/'. $pathinfo['basename'];
  61 + $presetUrl = self::getUrlFromPath($presetFilePath);
  62 + if (file_exists($presetFilePath)) {
  63 + return $presetUrl;
  64 + }
  65 + if (!file_exists($presetPath)) {
  66 + @mkdir($presetPath, 0777, true);
  67 + }
  68 + $output = self::createPresetImage($filePath, $preset, $preset_alias);
  69 + if ( !empty($output) ) {
  70 + $f = fopen($presetFilePath, 'w');
  71 + fwrite($f, $output);
  72 + fclose($f);
  73 + return $presetUrl;
  74 + }
  75 + return false;
  76 + }
  77 +
  78 + private static function createPresetImage($filePath, $preset, $preset_alias)
  79 + {
  80 + $image = self::getDriver()->load($filePath);
  81 + foreach ($preset as $action => $data) {
  82 + switch($action) {
  83 + case 'resize':
  84 + $image->resize($data['width'], $data['height'], @$data['master']);
  85 + break;
  86 + case 'flip':
  87 + $image->flip(@$data['direction']);
  88 + break;
  89 + default:
  90 + break;
  91 + }
  92 + }
  93 + return $image->render();
  94 + }
  95 +
  96 + /**
  97 + * Get extensions regexp
  98 + * @return string regexp
  99 + */
  100 + private function getExtensionsRegexp()
  101 + {
  102 + $keys = array_keys(self::getDriver()->extensions);
  103 + return '(?i)' . join('|', $keys);
  104 + }
  105 +
  106 + /**
  107 + * Get size from suffix
  108 + * @param string $suffix
  109 + * @return string size
  110 + */
  111 + private function getSizeFromSuffix($suffix)
  112 + {
  113 + return array_search($suffix, $this->getSizeSuffixes());
  114 + }
  115 +
  116 + /**
  117 + * Get suffix from size
  118 + * @param string $size
  119 + * @return string suffix
  120 + */
  121 + private function getSufixFromSize($size)
  122 + {
  123 + return ArrayHelper::getValue($this->getSizeSuffixes(), $size);
  124 + }
  125 +
  126 + private function getSizeSuffixes()
  127 + {
  128 + $suffixes = [];
  129 + foreach ($this->sizes as $size => $sizeConf) {
  130 + $suffixes[$size] = ArrayHelper::getValue($this->sizeSuffixes, $size, $this->defaultSizeSuffix . $size);
  131 + }
  132 + return $suffixes;
  133 + }
  134 +}
0 135 \ No newline at end of file
... ...
common/components/artboximage/drivers/Image.php 0 → 100644
  1 +<?php
  2 +namespace common\components\artboximage\drivers;
  3 +
  4 +use common\components\artboximage\drivers\Kohana\Kohana_Image;
  5 +
  6 +abstract class Image extends Kohana_Image {}
  7 +?>
0 8 \ No newline at end of file
... ...
common/components/artboximage/drivers/Image/GD.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\components\artboximage\drivers\Image;
  4 +
  5 +use common\components\artboximage\drivers\Kohana\Image\Kohana_Image_GD;
  6 +
  7 +/**
  8 + * Support for image manipulation using [Imagick](http://php.net/Imagick).
  9 + *
  10 + * @package Kohana/Image
  11 + * @category Drivers
  12 + * @author Tamas Mihalik tamas.mihalik@gmail.com
  13 + * @copyright (c) 2009-2012 Kohana Team
  14 + * @license http://kohanaphp.com/license.html
  15 + */
  16 +class Image_GD extends Kohana_Image_GD {}
  17 +
  18 +?>
0 19 \ No newline at end of file
... ...
common/components/artboximage/drivers/Image/Imagick.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\components\artboximage\drivers\Image;
  4 +use common\components\artboximage\drivers\Kohana\Image\Kohana_Image_Imagick;
  5 +
  6 +/**
  7 + * Support for image manipulation using [Imagick](http://php.net/Imagick).
  8 + *
  9 + * @package Kohana/Image
  10 + * @category Drivers
  11 + * @author Tamas Mihalik tamas.mihalik@gmail.com
  12 + * @copyright (c) 2009-2012 Kohana Team
  13 + * @license http://kohanaphp.com/license.html
  14 + */
  15 +class Image_Imagick extends Kohana_Image_Imagick {}
0 16 \ No newline at end of file
... ...
common/components/artboximage/drivers/Kohana/Image/GD.php 0 → 100644
  1 +<?php
  2 +namespace common\components\artboximage\drivers\Kohana\Image;
  3 +
  4 +use common\components\artboximage\drivers\Kohana\Kohana_Image;
  5 +use yii\base\ErrorException;
  6 +/**
  7 + * Support for image manipulation using [GD](http://php.net/GD).
  8 + *
  9 + * @package Kohana/Image
  10 + * @category Drivers
  11 + * @author Kohana Team
  12 + * @copyright (c) 2008-2009 Kohana Team
  13 + * @license http://kohanaphp.com/license.html
  14 + */
  15 +class Kohana_Image_GD extends Kohana_Image {
  16 +
  17 + // Which GD functions are available?
  18 + const IMAGEROTATE = 'imagerotate';
  19 + const IMAGECONVOLUTION = 'imageconvolution';
  20 + const IMAGEFILTER = 'imagefilter';
  21 + const IMAGELAYEREFFECT = 'imagelayereffect';
  22 + protected static $_available_functions = array();
  23 +
  24 + /**
  25 + * Checks if GD is enabled and verify that key methods exist, some of which require GD to
  26 + * be bundled with PHP. Exceptions will be thrown from those methods when GD is not
  27 + * bundled.
  28 + *
  29 + * @return boolean
  30 + */
  31 + public static function check()
  32 + {
  33 + if ( ! function_exists('gd_info'))
  34 + {
  35 + throw new ErrorException('GD is either not installed or not enabled, check your configuration');
  36 + }
  37 + $functions = array(
  38 + Image_GD::IMAGEROTATE,
  39 + Image_GD::IMAGECONVOLUTION,
  40 + Image_GD::IMAGEFILTER,
  41 + Image_GD::IMAGELAYEREFFECT
  42 + );
  43 + foreach ($functions as $function)
  44 + {
  45 + Image_GD::$_available_functions[$function] = function_exists($function);
  46 + }
  47 +
  48 + if (defined('GD_VERSION'))
  49 + {
  50 + // Get the version via a constant, available in PHP 5.2.4+
  51 + $version = GD_VERSION;
  52 + }
  53 + else
  54 + {
  55 + // Get the version information
  56 + $info = gd_info();
  57 +
  58 + // Extract the version number
  59 + preg_match('/\d+\.\d+(?:\.\d+)?/', $info['GD Version'], $matches);
  60 +
  61 + // Get the major version
  62 + $version = $matches[0];
  63 + }
  64 +
  65 + if ( ! version_compare($version, '2.0.1', '>='))
  66 + {
  67 + throw new ErrorException(sprintf('Image_GD requires GD version 2.0.1 or greater, you have %s',$version));
  68 + }
  69 +
  70 + return Image_GD::$_checked = TRUE;
  71 + }
  72 +
  73 + /* @var resource Temporary image resource */
  74 + protected $_image;
  75 +
  76 + /* @var string Function name to open Image */
  77 + protected $_create_function;
  78 +
  79 + /**
  80 + * Runs [Image_GD::check] and loads the image.
  81 + *
  82 + * @param string $file image file path
  83 + * @return void
  84 + * @throws ErrorException
  85 + */
  86 + public function __construct($file)
  87 + {
  88 + if ( ! Image_GD::$_checked)
  89 + {
  90 + // Run the install check
  91 + Image_GD::check();
  92 + }
  93 +
  94 + parent::__construct($file);
  95 +
  96 + // Set the image creation function name
  97 + switch ($this->type)
  98 + {
  99 + case IMAGETYPE_JPEG:
  100 + $create = 'imagecreatefromjpeg';
  101 + break;
  102 + case IMAGETYPE_GIF:
  103 + $create = 'imagecreatefromgif';
  104 + break;
  105 + case IMAGETYPE_PNG:
  106 + $create = 'imagecreatefrompng';
  107 + break;
  108 + }
  109 +
  110 + if ( ! isset($create) OR ! function_exists($create))
  111 + {
  112 + throw new ErrorException(sprintf('Installed GD does not support %s images',image_type_to_extension($this->type, FALSE)));
  113 + }
  114 +
  115 + // Save function for future use
  116 + $this->_create_function = $create;
  117 +
  118 + // Save filename for lazy loading
  119 + $this->_image = $this->file;
  120 + }
  121 +
  122 + /**
  123 + * Destroys the loaded image to free up resources.
  124 + *
  125 + * @return void
  126 + */
  127 + public function __destruct()
  128 + {
  129 + if (is_resource($this->_image))
  130 + {
  131 + // Free all resources
  132 + imagedestroy($this->_image);
  133 + }
  134 + }
  135 +
  136 + /**
  137 + * Loads an image into GD.
  138 + *
  139 + * @return void
  140 + */
  141 + protected function _load_image()
  142 + {
  143 + if ( ! is_resource($this->_image))
  144 + {
  145 + // Gets create function
  146 + $create = $this->_create_function;
  147 +
  148 + // Open the temporary image
  149 + $this->_image = $create($this->file);
  150 +
  151 + // Preserve transparency when saving
  152 + imagesavealpha($this->_image, TRUE);
  153 + }
  154 + }
  155 +
  156 + /**
  157 + * Execute a resize.
  158 + *
  159 + * @param integer $width new width
  160 + * @param integer $height new height
  161 + * @return void
  162 + */
  163 + protected function _do_resize($width, $height)
  164 + {
  165 + // Presize width and height
  166 + $pre_width = $this->width;
  167 + $pre_height = $this->height;
  168 +
  169 + // Loads image if not yet loaded
  170 + $this->_load_image();
  171 +
  172 + // Test if we can do a resize without resampling to speed up the final resize
  173 + if ($width > ($this->width / 2) AND $height > ($this->height / 2))
  174 + {
  175 + // The maximum reduction is 10% greater than the final size
  176 + $reduction_width = round($width * 1.1);
  177 + $reduction_height = round($height * 1.1);
  178 +
  179 + while ($pre_width / 2 > $reduction_width AND $pre_height / 2 > $reduction_height)
  180 + {
  181 + // Reduce the size using an O(2n) algorithm, until it reaches the maximum reduction
  182 + $pre_width /= 2;
  183 + $pre_height /= 2;
  184 + }
  185 +
  186 + // Create the temporary image to copy to
  187 + $image = $this->_create($pre_width, $pre_height);
  188 +
  189 + if (imagecopyresized($image, $this->_image, 0, 0, 0, 0, $pre_width, $pre_height, $this->width, $this->height))
  190 + {
  191 + // Swap the new image for the old one
  192 + imagedestroy($this->_image);
  193 + $this->_image = $image;
  194 + }
  195 + }
  196 +
  197 + // Create the temporary image to copy to
  198 + $image = $this->_create($width, $height);
  199 +
  200 + // Execute the resize
  201 + if (imagecopyresampled($image, $this->_image, 0, 0, 0, 0, $width, $height, $pre_width, $pre_height))
  202 + {
  203 + // Swap the new image for the old one
  204 + imagedestroy($this->_image);
  205 + $this->_image = $image;
  206 +
  207 + // Reset the width and height
  208 + $this->width = imagesx($image);
  209 + $this->height = imagesy($image);
  210 + }
  211 + }
  212 +
  213 + /**
  214 + * Adaptation the image.
  215 + *
  216 + * @param integer $width image width
  217 + * @param integer $height image height
  218 + * @param integer $bg_width background width
  219 + * @param integer $bg_height background height
  220 + * @param integer $offset_x offset from the left
  221 + * @param integer $offset_y offset from the top
  222 + */
  223 + protected function _do_adapt($width, $height, $bg_width, $bg_height, $offset_x, $offset_y)
  224 + {
  225 + $this->_load_image();
  226 + $image = $this->_image;
  227 + $this->_image = $this->_create($bg_width, $bg_height);
  228 + $this->width = $bg_width;
  229 + $this->height = $bg_height;
  230 + imagealphablending($this->_image, false);
  231 + $col = imagecolorallocatealpha($this->_image, 0, 255, 0, 127);
  232 + imagefilledrectangle($this->_image, 0, 0, $bg_width, $bg_height, $col);
  233 + imagealphablending($this->_image, true);
  234 + imagecopy($this->_image, $image, $offset_x, $offset_y, 0, 0, $width, $height);
  235 + imagealphablending($this->_image, false);
  236 + imagesavealpha($this->_image, true);
  237 + imagedestroy($image);
  238 + }
  239 +
  240 + /**
  241 + * Execute a crop.
  242 + *
  243 + * @param integer $width new width
  244 + * @param integer $height new height
  245 + * @param integer $offset_x offset from the left
  246 + * @param integer $offset_y offset from the top
  247 + * @return void
  248 + */
  249 + protected function _do_crop($width, $height, $offset_x, $offset_y)
  250 + {
  251 + // Create the temporary image to copy to
  252 + $image = $this->_create($width, $height);
  253 +
  254 + // Loads image if not yet loaded
  255 + $this->_load_image();
  256 +
  257 + // Execute the crop
  258 + if (imagecopyresampled($image, $this->_image, 0, 0, $offset_x, $offset_y, $width, $height, $width, $height))
  259 + {
  260 + // Swap the new image for the old one
  261 + imagedestroy($this->_image);
  262 + $this->_image = $image;
  263 +
  264 + // Reset the width and height
  265 + $this->width = imagesx($image);
  266 + $this->height = imagesy($image);
  267 + }
  268 + }
  269 +
  270 + /**
  271 + * Execute a rotation.
  272 + *
  273 + * @param integer $degrees degrees to rotate
  274 + * @return void
  275 + */
  276 + protected function _do_rotate($degrees)
  277 + {
  278 + if (empty(Image_GD::$_available_functions[Image_GD::IMAGEROTATE]))
  279 + {
  280 + throw new ErrorException('This method requires imagerotate, which is only available in the bundled version of GD');
  281 + }
  282 +
  283 + // Loads image if not yet loaded
  284 + $this->_load_image();
  285 +
  286 + // Transparent black will be used as the background for the uncovered region
  287 + $transparent = imagecolorallocatealpha($this->_image, 0, 0, 0, 127);
  288 +
  289 + // Rotate, setting the transparent color
  290 + $image = imagerotate($this->_image, 360 - $degrees, $transparent, 1);
  291 +
  292 + // Save the alpha of the rotated image
  293 + imagesavealpha($image, TRUE);
  294 +
  295 + // Get the width and height of the rotated image
  296 + $width = imagesx($image);
  297 + $height = imagesy($image);
  298 +
  299 + if (imagecopymerge($this->_image, $image, 0, 0, 0, 0, $width, $height, 100))
  300 + {
  301 + // Swap the new image for the old one
  302 + imagedestroy($this->_image);
  303 + $this->_image = $image;
  304 +
  305 + // Reset the width and height
  306 + $this->width = $width;
  307 + $this->height = $height;
  308 + }
  309 + }
  310 +
  311 + /**
  312 + * Execute a flip.
  313 + *
  314 + * @param integer $direction direction to flip
  315 + * @return void
  316 + */
  317 + protected function _do_flip($direction)
  318 + {
  319 + // Create the flipped image
  320 + $flipped = $this->_create($this->width, $this->height);
  321 +
  322 + // Loads image if not yet loaded
  323 + $this->_load_image();
  324 +
  325 + if ($direction === Image::HORIZONTAL)
  326 + {
  327 + for ($x = 0; $x < $this->width; $x++)
  328 + {
  329 + // Flip each row from top to bottom
  330 + imagecopy($flipped, $this->_image, $x, 0, $this->width - $x - 1, 0, 1, $this->height);
  331 + }
  332 + }
  333 + else
  334 + {
  335 + for ($y = 0; $y < $this->height; $y++)
  336 + {
  337 + // Flip each column from left to right
  338 + imagecopy($flipped, $this->_image, 0, $y, 0, $this->height - $y - 1, $this->width, 1);
  339 + }
  340 + }
  341 +
  342 + // Swap the new image for the old one
  343 + imagedestroy($this->_image);
  344 + $this->_image = $flipped;
  345 +
  346 + // Reset the width and height
  347 + $this->width = imagesx($flipped);
  348 + $this->height = imagesy($flipped);
  349 + }
  350 +
  351 + /**
  352 + * Execute a sharpen.
  353 + *
  354 + * @param integer $amount amount to sharpen
  355 + * @return void
  356 + */
  357 + protected function _do_sharpen($amount)
  358 + {
  359 + if (empty(Image_GD::$_available_functions[Image_GD::IMAGECONVOLUTION]))
  360 + {
  361 + throw new ErrorException('This method requires imageconvolution, which is only available in the bundled version of GD');
  362 + }
  363 +
  364 + // Loads image if not yet loaded
  365 + $this->_load_image();
  366 +
  367 + // Amount should be in the range of 18-10
  368 + $amount = round(abs(-18 + ($amount * 0.08)), 2);
  369 +
  370 + // Gaussian blur matrix
  371 + $matrix = array
  372 + (
  373 + array(-1, -1, -1),
  374 + array(-1, $amount, -1),
  375 + array(-1, -1, -1),
  376 + );
  377 +
  378 + // Perform the sharpen
  379 + if (imageconvolution($this->_image, $matrix, $amount - 8, 0))
  380 + {
  381 + // Reset the width and height
  382 + $this->width = imagesx($this->_image);
  383 + $this->height = imagesy($this->_image);
  384 + }
  385 + }
  386 +
  387 + /**
  388 + * Execute a reflection.
  389 + *
  390 + * @param integer $height reflection height
  391 + * @param integer $opacity reflection opacity
  392 + * @param boolean $fade_in TRUE to fade out, FALSE to fade in
  393 + * @return void
  394 + */
  395 + protected function _do_reflection($height, $opacity, $fade_in)
  396 + {
  397 + if (empty(Image_GD::$_available_functions[Image_GD::IMAGEFILTER]))
  398 + {
  399 + throw new ErrorException('This method requires imagefilter, which is only available in the bundled version of GD');
  400 + }
  401 +
  402 + // Loads image if not yet loaded
  403 + $this->_load_image();
  404 +
  405 + // Convert an opacity range of 0-100 to 127-0
  406 + $opacity = round(abs(($opacity * 127 / 100) - 127));
  407 +
  408 + if ($opacity < 127)
  409 + {
  410 + // Calculate the opacity stepping
  411 + $stepping = (127 - $opacity) / $height;
  412 + }
  413 + else
  414 + {
  415 + // Avoid a "divide by zero" error
  416 + $stepping = 127 / $height;
  417 + }
  418 +
  419 + // Create the reflection image
  420 + $reflection = $this->_create($this->width, $this->height + $height);
  421 +
  422 + // Copy the image to the reflection
  423 + imagecopy($reflection, $this->_image, 0, 0, 0, 0, $this->width, $this->height);
  424 +
  425 + for ($offset = 0; $height >= $offset; $offset++)
  426 + {
  427 + // Read the next line down
  428 + $src_y = $this->height - $offset - 1;
  429 +
  430 + // Place the line at the bottom of the reflection
  431 + $dst_y = $this->height + $offset;
  432 +
  433 + if ($fade_in === TRUE)
  434 + {
  435 + // Start with the most transparent line first
  436 + $dst_opacity = round($opacity + ($stepping * ($height - $offset)));
  437 + }
  438 + else
  439 + {
  440 + // Start with the most opaque line first
  441 + $dst_opacity = round($opacity + ($stepping * $offset));
  442 + }
  443 +
  444 + // Create a single line of the image
  445 + $line = $this->_create($this->width, 1);
  446 +
  447 + // Copy a single line from the current image into the line
  448 + imagecopy($line, $this->_image, 0, 0, 0, $src_y, $this->width, 1);
  449 +
  450 + // Colorize the line to add the correct alpha level
  451 + imagefilter($line, IMG_FILTER_COLORIZE, 0, 0, 0, $dst_opacity);
  452 +
  453 + // Copy a the line into the reflection
  454 + imagecopy($reflection, $line, 0, $dst_y, 0, 0, $this->width, 1);
  455 + }
  456 +
  457 + // Swap the new image for the old one
  458 + imagedestroy($this->_image);
  459 + $this->_image = $reflection;
  460 +
  461 + // Reset the width and height
  462 + $this->width = imagesx($reflection);
  463 + $this->height = imagesy($reflection);
  464 + }
  465 +
  466 + /**
  467 + * Execute a watermarking.
  468 + *
  469 + * @param Kohana_Image $image watermarking Kohana_Image
  470 + * @param integer $offset_x offset from the left
  471 + * @param integer $offset_y offset from the top
  472 + * @param integer $opacity opacity of watermark
  473 + * @return void
  474 + */
  475 + protected function _do_watermark(Kohana_Image $watermark, $offset_x, $offset_y, $opacity)
  476 + {
  477 + if (empty(Image_GD::$_available_functions[Image_GD::IMAGELAYEREFFECT]))
  478 + {
  479 + throw new ErrorException('This method requires imagelayereffect, which is only available in the bundled version of GD');
  480 + }
  481 +
  482 + // Loads image if not yet loaded
  483 + $this->_load_image();
  484 +
  485 + // Create the watermark image resource
  486 + $overlay = imagecreatefromstring($watermark->render());
  487 +
  488 + imagesavealpha($overlay, TRUE);
  489 +
  490 + // Get the width and height of the watermark
  491 + $width = imagesx($overlay);
  492 + $height = imagesy($overlay);
  493 +
  494 + if ($opacity < 100)
  495 + {
  496 + // Convert an opacity range of 0-100 to 127-0
  497 + $opacity = round(abs(($opacity * 127 / 100) - 127));
  498 +
  499 + // Allocate transparent gray
  500 + $color = imagecolorallocatealpha($overlay, 127, 127, 127, $opacity);
  501 +
  502 + // The transparent image will overlay the watermark
  503 + imagelayereffect($overlay, IMG_EFFECT_OVERLAY);
  504 +
  505 + // Fill the background with the transparent color
  506 + imagefilledrectangle($overlay, 0, 0, $width, $height, $color);
  507 + }
  508 +
  509 + // Alpha blending must be enabled on the background!
  510 + imagealphablending($this->_image, TRUE);
  511 +
  512 + if (imagecopy($this->_image, $overlay, $offset_x, $offset_y, 0, 0, $width, $height))
  513 + {
  514 + // Destroy the overlay image
  515 + imagedestroy($overlay);
  516 + }
  517 + }
  518 +
  519 + /**
  520 + * Execute a background.
  521 + *
  522 + * @param integer $r red
  523 + * @param integer $g green
  524 + * @param integer $b blue
  525 + * @param integer $opacity opacity
  526 + * @return void
  527 + */
  528 + protected function _do_background($r, $g, $b, $opacity)
  529 + {
  530 + // Loads image if not yet loaded
  531 + $this->_load_image();
  532 +
  533 + // Convert an opacity range of 0-100 to 127-0
  534 + $opacity = round(abs(($opacity * 127 / 100) - 127));
  535 +
  536 + // Create a new background
  537 + $background = $this->_create($this->width, $this->height);
  538 +
  539 + // Allocate the color
  540 + $color = imagecolorallocatealpha($background, $r, $g, $b, $opacity);
  541 +
  542 + // Fill the image with white
  543 + imagefilledrectangle($background, 0, 0, $this->width, $this->height, $color);
  544 +
  545 + // Alpha blending must be enabled on the background!
  546 + imagealphablending($background, TRUE);
  547 +
  548 + // Copy the image onto a white background to remove all transparency
  549 + if (imagecopy($background, $this->_image, 0, 0, 0, 0, $this->width, $this->height))
  550 + {
  551 + // Swap the new image for the old one
  552 + imagedestroy($this->_image);
  553 + $this->_image = $background;
  554 + }
  555 + }
  556 +
  557 + /**
  558 + * Execute a save.
  559 + *
  560 + * @param string $file new image filename
  561 + * @param integer $quality quality
  562 + * @return boolean
  563 + */
  564 + protected function _do_save($file, $quality)
  565 + {
  566 + // Loads image if not yet loaded
  567 + $this->_load_image();
  568 +
  569 + // Get the extension of the file
  570 + $extension = pathinfo($file, PATHINFO_EXTENSION);
  571 +
  572 + // Get the save function and IMAGETYPE
  573 + list($save, $type) = $this->_save_function($extension, $quality);
  574 +
  575 + // Save the image to a file
  576 + $status = isset($quality) ? $save($this->_image, $file, $quality) : $save($this->_image, $file);
  577 +
  578 + if ($status === TRUE AND $type !== $this->type)
  579 + {
  580 + // Reset the image type and mime type
  581 + $this->type = $type;
  582 + $this->mime = image_type_to_mime_type($type);
  583 + }
  584 +
  585 + return TRUE;
  586 + }
  587 +
  588 + /**
  589 + * Execute a render.
  590 + *
  591 + * @param string $type image type: png, jpg, gif, etc
  592 + * @param integer $quality quality
  593 + * @return string
  594 + */
  595 + protected function _do_render($type, $quality)
  596 + {
  597 + // Loads image if not yet loaded
  598 + $this->_load_image();
  599 +
  600 + // Get the save function and IMAGETYPE
  601 + list($save, $type) = $this->_save_function($type, $quality);
  602 +
  603 + // Capture the output
  604 + ob_start();
  605 +
  606 + // Render the image
  607 + $status = isset($quality) ? $save($this->_image, NULL, $quality) : $save($this->_image, NULL);
  608 +
  609 + if ($status === TRUE AND $type !== $this->type)
  610 + {
  611 + // Reset the image type and mime type
  612 + $this->type = $type;
  613 + $this->mime = image_type_to_mime_type($type);
  614 + }
  615 +
  616 + return ob_get_clean();
  617 + }
  618 +
  619 + /**
  620 + * Get the GD saving function and image type for this extension.
  621 + * Also normalizes the quality setting
  622 + *
  623 + * @param string $extension image type: png, jpg, etc
  624 + * @param integer $quality image quality
  625 + * @return array save function, IMAGETYPE_* constant
  626 + * @throws ErrorException
  627 + */
  628 + protected function _save_function($extension, & $quality)
  629 + {
  630 + if ( ! $extension)
  631 + {
  632 + // Use the current image type
  633 + $extension = image_type_to_extension($this->type, FALSE);
  634 + }
  635 +
  636 + switch (strtolower($extension))
  637 + {
  638 + case 'jpg':
  639 + case 'jpeg':
  640 + // Save a JPG file
  641 + $save = 'imagejpeg';
  642 + $type = IMAGETYPE_JPEG;
  643 + break;
  644 + case 'gif':
  645 + // Save a GIF file
  646 + $save = 'imagegif';
  647 + $type = IMAGETYPE_GIF;
  648 +
  649 + // GIFs do not a quality setting
  650 + $quality = NULL;
  651 + break;
  652 + case 'png':
  653 + // Save a PNG file
  654 + $save = 'imagepng';
  655 + $type = IMAGETYPE_PNG;
  656 +
  657 + // Use a compression level of 9 (does not affect quality!)
  658 + $quality = 9;
  659 + break;
  660 + default:
  661 + throw new ErrorException(sprintf('Installed GD does not support %s images',$extension));
  662 + break;
  663 + }
  664 +
  665 + return array($save, $type);
  666 + }
  667 +
  668 + /**
  669 + * Create an empty image with the given width and height.
  670 + *
  671 + * @param integer $width image width
  672 + * @param integer $height image height
  673 + * @return resource
  674 + */
  675 + protected function _create($width, $height)
  676 + {
  677 + // Create an empty image
  678 + $image = imagecreatetruecolor($width, $height);
  679 +
  680 + // Do not apply alpha blending
  681 + imagealphablending($image, FALSE);
  682 +
  683 + // Save alpha levels
  684 + imagesavealpha($image, TRUE);
  685 +
  686 + return $image;
  687 + }
  688 +
  689 +} // End Image_GD
... ...
common/components/artboximage/drivers/Kohana/Image/Imagick.php 0 → 100644
  1 +<?php
  2 +namespace common\components\artboximage\drivers\Kohana\Image;
  3 +
  4 +use common\components\artboximage\drivers\Kohana\Kohana_Image;
  5 +use yii\base\ErrorException;
  6 +use \Imagick;
  7 +use \ImagickPixel;
  8 +/**
  9 + * Support for image manipulation using [Imagick](http://php.net/Imagick).
  10 + *
  11 + * @package Kohana/Image
  12 + * @category Drivers
  13 + * @author Tamas Mihalik tamas.mihalik@gmail.com
  14 + * @copyright (c) 2009-2012 Kohana Team
  15 + * @license http://kohanaphp.com/license.html
  16 + */
  17 +
  18 +class Kohana_Image_Imagick extends Kohana_Image {
  19 +
  20 + /**
  21 + * @var Imagick image magick object
  22 + */
  23 + protected $im;
  24 +
  25 + /**
  26 + * Checks if ImageMagick is enabled.
  27 + *
  28 + * @throws ErrorException
  29 + * @return boolean
  30 + */
  31 + public static function check()
  32 + {
  33 + if ( ! extension_loaded('imagick'))
  34 + {
  35 + throw new ErrorException('Imagick is not installed, or the extension is not loaded');
  36 + }
  37 +
  38 + return Image_Imagick::$_checked = TRUE;
  39 + }
  40 +
  41 + /**
  42 + * Runs [Image_Imagick::check] and loads the image.
  43 + *
  44 + * @return void
  45 + * @throws ErrorException
  46 + */
  47 + public function __construct($file)
  48 + {
  49 + if ( ! Image_Imagick::$_checked)
  50 + {
  51 + // Run the install check
  52 + Image_Imagick::check();
  53 + }
  54 +
  55 + parent::__construct($file);
  56 +
  57 + $this->im = new Imagick;
  58 + $this->im->readImage($file);
  59 +
  60 + if ( ! $this->im->getImageAlphaChannel())
  61 + {
  62 + // Force the image to have an alpha channel
  63 + $this->im->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET);
  64 + }
  65 + }
  66 +
  67 + /**
  68 + * Destroys the loaded image to free up resources.
  69 + *
  70 + * @return void
  71 + */
  72 + public function __destruct()
  73 + {
  74 + $this->im->clear();
  75 + $this->im->destroy();
  76 + }
  77 +
  78 + protected function _do_resize($width, $height)
  79 + {
  80 + if ($this->im->scaleImage($width, $height))
  81 + {
  82 + // Reset the width and height
  83 + $this->width = $this->im->getImageWidth();
  84 + $this->height = $this->im->getImageHeight();
  85 +
  86 + return TRUE;
  87 + }
  88 +
  89 + return FALSE;
  90 + }
  91 +
  92 + /**
  93 + * Adaptation the image.
  94 + *
  95 + * @param integer $width image width
  96 + * @param integer $height image height
  97 + * @param integer $bg_width background width
  98 + * @param integer $bg_height background height
  99 + * @param integer $offset_x offset from the left
  100 + * @param integer $offset_y offset from the top
  101 + */
  102 + protected function _do_adapt($width, $height, $bg_width, $bg_height, $offset_x, $offset_y)
  103 + {
  104 + $image = new Imagick();
  105 + $image->newImage($bg_width, $bg_height, "none");
  106 + $image->compositeImage($this->im, Imagick::COMPOSITE_ADD, $offset_x, $offset_y);
  107 + $this->im->clear();
  108 + $this->im->destroy();
  109 + $this->im = $image;
  110 + $this->width = $bg_width;
  111 + $this->height = $bg_height;
  112 + }
  113 +
  114 + protected function _do_crop($width, $height, $offset_x, $offset_y)
  115 + {
  116 + if ($this->im->cropImage($width, $height, $offset_x, $offset_y))
  117 + {
  118 + // Reset the width and height
  119 + $this->width = $this->im->getImageWidth();
  120 + $this->height = $this->im->getImageHeight();
  121 +
  122 + // Trim off hidden areas
  123 + $this->im->setImagePage($this->width, $this->height, 0, 0);
  124 +
  125 + return TRUE;
  126 + }
  127 +
  128 + return FALSE;
  129 + }
  130 +
  131 + protected function _do_rotate($degrees)
  132 + {
  133 + if ($this->im->rotateImage(new ImagickPixel('transparent'), $degrees))
  134 + {
  135 + // Reset the width and height
  136 + $this->width = $this->im->getImageWidth();
  137 + $this->height = $this->im->getImageHeight();
  138 +
  139 + // Trim off hidden areas
  140 + $this->im->setImagePage($this->width, $this->height, 0, 0);
  141 +
  142 + return TRUE;
  143 + }
  144 +
  145 + return FALSE;
  146 + }
  147 +
  148 + protected function _do_flip($direction)
  149 + {
  150 + if ($direction === Image::HORIZONTAL)
  151 + {
  152 + return $this->im->flopImage();
  153 + }
  154 + else
  155 + {
  156 + return $this->im->flipImage();
  157 + }
  158 + }
  159 +
  160 + protected function _do_sharpen($amount)
  161 + {
  162 + // IM not support $amount under 5 (0.15)
  163 + $amount = ($amount < 5) ? 5 : $amount;
  164 +
  165 + // Amount should be in the range of 0.0 to 3.0
  166 + $amount = ($amount * 3.0) / 100;
  167 +
  168 + return $this->im->sharpenImage(0, $amount);
  169 + }
  170 +
  171 + protected function _do_reflection($height, $opacity, $fade_in)
  172 + {
  173 + // Clone the current image and flip it for reflection
  174 + $reflection = $this->im->clone();
  175 + $reflection->flipImage();
  176 +
  177 + // Crop the reflection to the selected height
  178 + $reflection->cropImage($this->width, $height, 0, 0);
  179 + $reflection->setImagePage($this->width, $height, 0, 0);
  180 +
  181 + // Select the fade direction
  182 + $direction = array('transparent', 'black');
  183 +
  184 + if ($fade_in)
  185 + {
  186 + // Change the direction of the fade
  187 + $direction = array_reverse($direction);
  188 + }
  189 +
  190 + // Create a gradient for fading
  191 + $fade = new Imagick;
  192 + $fade->newPseudoImage($reflection->getImageWidth(), $reflection->getImageHeight(), vsprintf('gradient:%s-%s', $direction));
  193 +
  194 + // Apply the fade alpha channel to the reflection
  195 + $reflection->compositeImage($fade, Imagick::COMPOSITE_DSTOUT, 0, 0);
  196 +
  197 + // NOTE: Using setImageOpacity will destroy alpha channels!
  198 + $reflection->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA);
  199 +
  200 + // Create a new container to hold the image and reflection
  201 + $image = new Imagick;
  202 + $image->newImage($this->width, $this->height + $height, new ImagickPixel);
  203 +
  204 + // Force the image to have an alpha channel
  205 + $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET);
  206 +
  207 + // Force the background color to be transparent
  208 + // $image->setImageBackgroundColor(new ImagickPixel('transparent'));
  209 +
  210 + // Match the colorspace between the two images before compositing
  211 + $image->setColorspace($this->im->getColorspace());
  212 +
  213 + // Place the image and reflection into the container
  214 + if ($image->compositeImage($this->im, Imagick::COMPOSITE_SRC, 0, 0)
  215 + AND $image->compositeImage($reflection, Imagick::COMPOSITE_OVER, 0, $this->height))
  216 + {
  217 + // Replace the current image with the reflected image
  218 + $this->im = $image;
  219 +
  220 + // Reset the width and height
  221 + $this->width = $this->im->getImageWidth();
  222 + $this->height = $this->im->getImageHeight();
  223 +
  224 + return TRUE;
  225 + }
  226 +
  227 + return FALSE;
  228 + }
  229 +
  230 + protected function _do_watermark(Kohana_Image $image, $offset_x, $offset_y, $opacity)
  231 + {
  232 + // Convert the Image intance into an Imagick instance
  233 + $watermark = new Imagick;
  234 + $watermark->readImageBlob($image->render(), $image->file);
  235 +
  236 + if ($watermark->getImageAlphaChannel() !== Imagick::ALPHACHANNEL_ACTIVATE)
  237 + {
  238 + // Force the image to have an alpha channel
  239 + $watermark->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);
  240 + }
  241 +
  242 + if ($opacity < 100)
  243 + {
  244 + // NOTE: Using setImageOpacity will destroy current alpha channels!
  245 + $watermark->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA);
  246 + }
  247 +
  248 + // Match the colorspace between the two images before compositing
  249 + // $watermark->setColorspace($this->im->getColorspace());
  250 +
  251 + // Apply the watermark to the image
  252 + return $this->im->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, $offset_x, $offset_y);
  253 + }
  254 +
  255 + protected function _do_background($r, $g, $b, $opacity)
  256 + {
  257 + // Create a RGB color for the background
  258 + $color = sprintf('rgb(%d, %d, %d)', $r, $g, $b);
  259 +
  260 + // Create a new image for the background
  261 + $background = new Imagick;
  262 + $background->newImage($this->width, $this->height, new ImagickPixel($color));
  263 +
  264 + if ( ! $background->getImageAlphaChannel())
  265 + {
  266 + // Force the image to have an alpha channel
  267 + $background->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET);
  268 + }
  269 +
  270 + // Clear the background image
  271 + $background->setImageBackgroundColor(new ImagickPixel('transparent'));
  272 +
  273 + // NOTE: Using setImageOpacity will destroy current alpha channels!
  274 + $background->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA);
  275 +
  276 + // Match the colorspace between the two images before compositing
  277 + $background->setColorspace($this->im->getColorspace());
  278 +
  279 + if ($background->compositeImage($this->im, Imagick::COMPOSITE_DISSOLVE, 0, 0))
  280 + {
  281 + // Replace the current image with the new image
  282 + $this->im = $background;
  283 +
  284 + return TRUE;
  285 + }
  286 +
  287 + return FALSE;
  288 + }
  289 +
  290 + protected function _do_save($file, $quality)
  291 + {
  292 + // Get the image format and type
  293 + list($format, $type) = $this->_get_imagetype(pathinfo($file, PATHINFO_EXTENSION));
  294 +
  295 + // Set the output image type
  296 + $this->im->setFormat($format);
  297 +
  298 + // Set the output quality
  299 + $this->im->setImageCompressionQuality($quality);
  300 +
  301 + if ($this->im->writeImage($file))
  302 + {
  303 + // Reset the image type and mime type
  304 + $this->type = $type;
  305 + $this->mime = image_type_to_mime_type($type);
  306 +
  307 + return TRUE;
  308 + }
  309 +
  310 + return FALSE;
  311 + }
  312 +
  313 + protected function _do_render($type, $quality)
  314 + {
  315 + // Get the image format and type
  316 + list($format, $type) = $this->_get_imagetype($type);
  317 +
  318 + // Set the output image type
  319 + $this->im->setFormat($format);
  320 +
  321 + // Set the output quality
  322 + $this->im->setImageCompressionQuality($quality);
  323 +
  324 + // Reset the image type and mime type
  325 + $this->type = $type;
  326 + $this->mime = image_type_to_mime_type($type);
  327 +
  328 + return (string) $this->im;
  329 + }
  330 +
  331 + /**
  332 + * Get the image type and format for an extension.
  333 + *
  334 + * @param string $extension image extension: png, jpg, etc
  335 + * @return string IMAGETYPE_* constant
  336 + * @throws ErrorException
  337 + */
  338 + protected function _get_imagetype($extension)
  339 + {
  340 + // Normalize the extension to a format
  341 + $format = strtolower($extension);
  342 +
  343 + switch ($format)
  344 + {
  345 + case 'jpg':
  346 + case 'jpeg':
  347 + $type = IMAGETYPE_JPEG;
  348 + break;
  349 + case 'gif':
  350 + $type = IMAGETYPE_GIF;
  351 + break;
  352 + case 'png':
  353 + $type = IMAGETYPE_PNG;
  354 + break;
  355 + default:
  356 + throw new ErrorException(sprintf('Installed ImageMagick does not support %s images',$extension));
  357 + break;
  358 + }
  359 +
  360 + return array($format, $type);
  361 + }
  362 +} // End Kohana_Image_Imagick
... ...
common/components/artboximage/drivers/Kohana/Kohana_Image.php 0 → 100644
  1 +<?php
  2 +namespace common\components\artboximage\drivers\Kohana;
  3 +
  4 +use common\components\artboximage\drivers\Image;
  5 +use yii\base\ErrorException;
  6 +/**
  7 + * Image manipulation support. Allows images to be resized, cropped, etc.
  8 + *
  9 + * @package Kohana/Image
  10 + * @category Base
  11 + * @author Kohana Team
  12 + * @copyright (c) 2008-2009 Kohana Team
  13 + * @license http://kohanaphp.com/license.html
  14 + */
  15 +abstract class Kohana_Image {
  16 +
  17 + // Resizing constraints
  18 + const NONE = 0x01;
  19 + const WIDTH = 0x02;
  20 + const HEIGHT = 0x03;
  21 + const AUTO = 0x04;
  22 + const INVERSE = 0x05;
  23 + const PRECISE = 0x06;
  24 + const ADAPT = 0x07;
  25 + const CROP = 0x08;
  26 +
  27 + // Flipping directions
  28 + const HORIZONTAL = 0x11;
  29 + const VERTICAL = 0x12;
  30 +
  31 + /**
  32 + * @var string default driver: GD, ImageMagick, etc
  33 + */
  34 + public static $default_driver = 'GD';
  35 +
  36 + // Status of the driver check
  37 + protected static $_checked = FALSE;
  38 +
  39 + /**
  40 + * Loads an image and prepares it for manipulation.
  41 + *
  42 + * $image = Image::factory('upload/test.jpg');
  43 + *
  44 + * @param string $file image file path
  45 + * @param string $driver driver type: GD, ImageMagick, etc
  46 + * @return Image
  47 + * @uses Image::$default_driver
  48 + */
  49 + public static function factory($file, $driver = NULL)
  50 + {
  51 + if ($driver === NULL)
  52 + {
  53 +
  54 + // Use the default driver
  55 + $driver = Image::$default_driver;
  56 + }
  57 +
  58 + // Set the class name
  59 + $class = 'Image_'.$driver;
  60 +
  61 + return new Image\Image_GD(); // $class($file);
  62 + }
  63 +
  64 + /**
  65 + * @var string image file path
  66 + */
  67 + public $file;
  68 +
  69 + /**
  70 + * @var integer image width
  71 + */
  72 + public $width;
  73 +
  74 + /**
  75 + * @var integer image height
  76 + */
  77 + public $height;
  78 +
  79 + /**
  80 + * @var integer one of the IMAGETYPE_* constants
  81 + */
  82 + public $type;
  83 +
  84 + /**
  85 + * @var string mime type of the image
  86 + */
  87 + public $mime;
  88 +
  89 + /**
  90 + * Loads information about the image. Will throw an exception if the image
  91 + * does not exist or is not an image.
  92 + *
  93 + * @param string $file image file path
  94 + * @return void
  95 + * @throws ErrorException
  96 + */
  97 + public function __construct($file)
  98 + {
  99 + try
  100 + {
  101 + // Get the real path to the file
  102 + $file = realpath($file);
  103 +
  104 + // Get the image information
  105 + $info = getimagesize($file);
  106 + }
  107 + catch (Exception $e)
  108 + {
  109 + // Ignore all errors while reading the image
  110 + }
  111 +
  112 + if (empty($file) OR empty($info))
  113 + {
  114 + throw new ErrorException(sprintf('Not an image or invalid image: %s',$file));
  115 + }
  116 +
  117 + // Store the image information
  118 + $this->file = $file;
  119 + $this->width = $info[0];
  120 + $this->height = $info[1];
  121 + $this->type = $info[2];
  122 + $this->mime = image_type_to_mime_type($this->type);
  123 + }
  124 +
  125 + /**
  126 + * Render the current image.
  127 + *
  128 + * echo $image;
  129 + *
  130 + * [!!] The output of this function is binary and must be rendered with the
  131 + * appropriate Content-Type header or it will not be displayed correctly!
  132 + *
  133 + * @return string
  134 + */
  135 + public function __toString()
  136 + {
  137 + try
  138 + {
  139 + // Render the current image
  140 + return $this->render();
  141 + }
  142 + catch (ErrorException $e)
  143 + {
  144 + /*
  145 + if (is_object(Kohana::$log))
  146 + {
  147 + // Get the text of the exception
  148 + $error = ErrorException::text($e);
  149 +
  150 + // Add this exception to the log
  151 + Yii::error($error);
  152 + }
  153 + */
  154 +
  155 + // Showing any kind of error will be "inside" image data
  156 + return '';
  157 + }
  158 + }
  159 +
  160 + /**
  161 + * Resize the image to the given size. Either the width or the height can
  162 + * be omitted and the image will be resized proportionally.
  163 + *
  164 + * // Resize to 200 pixels on the shortest side
  165 + * $image->resize(200, 200);
  166 + *
  167 + * // Resize to 200x200 pixels, keeping aspect ratio
  168 + * $image->resize(200, 200, Image::INVERSE);
  169 + *
  170 + * // Resize to 500 pixel width, keeping aspect ratio
  171 + * $image->resize(500, NULL);
  172 + *
  173 + * // Resize to 500 pixel height, keeping aspect ratio
  174 + * $image->resize(NULL, 500);
  175 + *
  176 + * // Resize to 200x500 pixels, ignoring aspect ratio
  177 + * $image->resize(200, 500, Image::NONE);
  178 + *
  179 + * // Resize to 400 pixels on the shortest side, puts it in the center
  180 + * // of the image with the transparent edges, keeping aspect ratio,
  181 + * // output size will be 400x400 pixels
  182 + * $image->resize(400, 400, Image::ADAPT);
  183 + *
  184 + * @param integer $width new width
  185 + * @param integer $height new height
  186 + * @param integer $master master dimension
  187 + * @return $this
  188 + * @uses Image::_do_resize
  189 + */
  190 + public function resize($width = NULL, $height = NULL, $master = NULL)
  191 + {
  192 + if ($master === NULL)
  193 + {
  194 + // Choose the master dimension automatically
  195 + $master = Image::AUTO;
  196 + }
  197 + elseif ($master === Image::CROP)
  198 + {
  199 + if (empty($width) || empty($height))
  200 + {
  201 + return $this->resize($width, $height, Image::AUTO);
  202 + }
  203 +
  204 + $master = $this->width / $this->height > $width / $height ? Image::HEIGHT : Image::WIDTH;
  205 + $this->resize($width, $height, $master);
  206 +
  207 + if ($this->width !== $width || $this->height !== $height)
  208 + {
  209 + $offset_x = round(($this->width - $width) / 2);
  210 + $offset_y = round(($this->height - $height) / 2);
  211 + $this->crop($width, $height, $offset_x, $offset_y);
  212 + }
  213 +
  214 + return $this;
  215 + }
  216 + // Image::WIDTH and Image::HEIGHT deprecated. You can use it in old projects,
  217 + // but in new you must pass empty value for non-master dimension
  218 + elseif ($master == Image::WIDTH AND ! empty($width))
  219 + {
  220 + $master = Image::AUTO;
  221 +
  222 + // Set empty height for backward compatibility
  223 + $height = NULL;
  224 + }
  225 + elseif ($master == Image::HEIGHT AND ! empty($height))
  226 + {
  227 + $master = Image::AUTO;
  228 +
  229 + // Set empty width for backward compatibility
  230 + $width = NULL;
  231 + }
  232 + elseif ($master === Image::ADAPT)
  233 + {
  234 + if (empty($width))
  235 + {
  236 + $width = $this->width * $height / $this->height;
  237 + }
  238 + elseif (empty($height))
  239 + {
  240 + $height = $this->height * $width / $this->width;
  241 + }
  242 + }
  243 +
  244 + if (empty($width))
  245 + {
  246 + if ($master === Image::NONE)
  247 + {
  248 + // Use the current width
  249 + $width = $this->width;
  250 + }
  251 + else
  252 + {
  253 + // If width not set, master will be height
  254 + $master = Image::HEIGHT;
  255 + }
  256 + }
  257 +
  258 + if (empty($height))
  259 + {
  260 + if ($master === Image::NONE)
  261 + {
  262 + // Use the current height
  263 + $height = $this->height;
  264 + }
  265 + else
  266 + {
  267 + // If height not set, master will be width
  268 + $master = Image::WIDTH;
  269 + }
  270 + }
  271 +
  272 + switch ($master)
  273 + {
  274 + case Image::AUTO:
  275 + // Choose direction with the greatest reduction ratio
  276 + $master = ($this->width / $width) > ($this->height / $height) ? Image::WIDTH : Image::HEIGHT;
  277 + break;
  278 + case Image::INVERSE:
  279 + // Choose direction with the minimum reduction ratio
  280 + $master = ($this->width / $width) > ($this->height / $height) ? Image::HEIGHT : Image::WIDTH;
  281 + break;
  282 + }
  283 +
  284 + switch ($master)
  285 + {
  286 + case Image::WIDTH:
  287 + // Recalculate the height based on the width proportions
  288 + $height = $this->height * $width / $this->width;
  289 + break;
  290 + case Image::HEIGHT:
  291 + // Recalculate the width based on the height proportions
  292 + $width = $this->width * $height / $this->height;
  293 + break;
  294 + case Image::PRECISE:
  295 + // Resize to precise size
  296 + $ratio = $this->width / $this->height;
  297 +
  298 + if ($width / $height > $ratio)
  299 + {
  300 + $height = $this->height * $width / $this->width;
  301 + }
  302 + else
  303 + {
  304 + $width = $this->width * $height / $this->height;
  305 + }
  306 + break;
  307 + }
  308 +
  309 + // Convert the width and height to integers, minimum value is 1px
  310 + $width = max(round($width), 1);
  311 + $height = max(round($height), 1);
  312 +
  313 + // Adapt the image if the ratios are not equivalent
  314 + if ($master === Image::ADAPT && $width / $height !== $this->width / $this->height)
  315 + {
  316 + $image_width = $bg_width = $this->width;
  317 + $image_height = $bg_height = $this->height;
  318 +
  319 + $offset_x = $offset_y = 0;
  320 +
  321 + if ($width / $height > $image_width / $image_height)
  322 + {
  323 + $bg_width = floor($image_height * $width / $height);
  324 + $offset_x = abs(floor(($bg_width - $image_width) / 2));
  325 + }
  326 + else
  327 + {
  328 + $bg_height = floor($image_width * $height / $width);
  329 + $offset_y = abs(floor(($bg_height - $image_height) / 2));
  330 + }
  331 +
  332 + $this->_do_adapt($image_width, $image_height, $bg_width, $bg_height, $offset_x, $offset_y);
  333 + }
  334 +
  335 + $this->_do_resize($width, $height);
  336 +
  337 + return $this;
  338 + }
  339 +
  340 + /**
  341 + * Crop an image to the given size. Either the width or the height can be
  342 + * omitted and the current width or height will be used.
  343 + *
  344 + * If no offset is specified, the center of the axis will be used.
  345 + * If an offset of TRUE is specified, the bottom of the axis will be used.
  346 + *
  347 + * // Crop the image to 200x200 pixels, from the center
  348 + * $image->crop(200, 200);
  349 + *
  350 + * @param integer $width new width
  351 + * @param integer $height new height
  352 + * @param mixed $offset_x offset from the left
  353 + * @param mixed $offset_y offset from the top
  354 + * @return $this
  355 + * @uses Image::_do_crop
  356 + */
  357 + public function crop($width, $height, $offset_x = NULL, $offset_y = NULL)
  358 + {
  359 + if ($width > $this->width)
  360 + {
  361 + // Use the current width
  362 + $width = $this->width;
  363 + }
  364 +
  365 + if ($height > $this->height)
  366 + {
  367 + // Use the current height
  368 + $height = $this->height;
  369 + }
  370 +
  371 + if ($offset_x === NULL)
  372 + {
  373 + // Center the X offset
  374 + $offset_x = round(($this->width - $width) / 2);
  375 + }
  376 + elseif ($offset_x === TRUE)
  377 + {
  378 + // Bottom the X offset
  379 + $offset_x = $this->width - $width;
  380 + }
  381 + elseif ($offset_x < 0)
  382 + {
  383 + // Set the X offset from the right
  384 + $offset_x = $this->width - $width + $offset_x;
  385 + }
  386 +
  387 + if ($offset_y === NULL)
  388 + {
  389 + // Center the Y offset
  390 + $offset_y = round(($this->height - $height) / 2);
  391 + }
  392 + elseif ($offset_y === TRUE)
  393 + {
  394 + // Bottom the Y offset
  395 + $offset_y = $this->height - $height;
  396 + }
  397 + elseif ($offset_y < 0)
  398 + {
  399 + // Set the Y offset from the bottom
  400 + $offset_y = $this->height - $height + $offset_y;
  401 + }
  402 +
  403 + // Determine the maximum possible width and height
  404 + $max_width = $this->width - $offset_x;
  405 + $max_height = $this->height - $offset_y;
  406 +
  407 + if ($width > $max_width)
  408 + {
  409 + // Use the maximum available width
  410 + $width = $max_width;
  411 + }
  412 +
  413 + if ($height > $max_height)
  414 + {
  415 + // Use the maximum available height
  416 + $height = $max_height;
  417 + }
  418 +
  419 + $this->_do_crop($width, $height, $offset_x, $offset_y);
  420 +
  421 + return $this;
  422 + }
  423 +
  424 + /**
  425 + * Rotate the image by a given amount.
  426 + *
  427 + * // Rotate 45 degrees clockwise
  428 + * $image->rotate(45);
  429 + *
  430 + * // Rotate 90% counter-clockwise
  431 + * $image->rotate(-90);
  432 + *
  433 + * @param integer $degrees degrees to rotate: -360-360
  434 + * @return $this
  435 + * @uses Image::_do_rotate
  436 + */
  437 + public function rotate($degrees)
  438 + {
  439 + // Make the degrees an integer
  440 + $degrees = (int) $degrees;
  441 +
  442 + if ($degrees > 180)
  443 + {
  444 + do
  445 + {
  446 + // Keep subtracting full circles until the degrees have normalized
  447 + $degrees -= 360;
  448 + }
  449 + while ($degrees > 180);
  450 + }
  451 +
  452 + if ($degrees < -180)
  453 + {
  454 + do
  455 + {
  456 + // Keep adding full circles until the degrees have normalized
  457 + $degrees += 360;
  458 + }
  459 + while ($degrees < -180);
  460 + }
  461 +
  462 + $this->_do_rotate($degrees);
  463 +
  464 + return $this;
  465 + }
  466 +
  467 + /**
  468 + * Flip the image along the horizontal or vertical axis.
  469 + *
  470 + * // Flip the image from top to bottom
  471 + * $image->flip(Image::HORIZONTAL);
  472 + *
  473 + * // Flip the image from left to right
  474 + * $image->flip(Image::VERTICAL);
  475 + *
  476 + * @param integer $direction direction: Image::HORIZONTAL, Image::VERTICAL
  477 + * @return $this
  478 + * @uses Image::_do_flip
  479 + */
  480 + public function flip($direction)
  481 + {
  482 + if ($direction !== Image::HORIZONTAL)
  483 + {
  484 + // Flip vertically
  485 + $direction = Image::VERTICAL;
  486 + }
  487 +
  488 + $this->_do_flip($direction);
  489 +
  490 + return $this;
  491 + }
  492 +
  493 + /**
  494 + * Sharpen the image by a given amount.
  495 + *
  496 + * // Sharpen the image by 20%
  497 + * $image->sharpen(20);
  498 + *
  499 + * @param integer $amount amount to sharpen: 1-100
  500 + * @return $this
  501 + * @uses Image::_do_sharpen
  502 + */
  503 + public function sharpen($amount)
  504 + {
  505 + // The amount must be in the range of 1 to 100
  506 + $amount = min(max($amount, 1), 100);
  507 +
  508 + $this->_do_sharpen($amount);
  509 +
  510 + return $this;
  511 + }
  512 +
  513 + /**
  514 + * Add a reflection to an image. The most opaque part of the reflection
  515 + * will be equal to the opacity setting and fade out to full transparent.
  516 + * Alpha transparency is preserved.
  517 + *
  518 + * // Create a 50 pixel reflection that fades from 0-100% opacity
  519 + * $image->reflection(50);
  520 + *
  521 + * // Create a 50 pixel reflection that fades from 100-0% opacity
  522 + * $image->reflection(50, 100, TRUE);
  523 + *
  524 + * // Create a 50 pixel reflection that fades from 0-60% opacity
  525 + * $image->reflection(50, 60, TRUE);
  526 + *
  527 + * [!!] By default, the reflection will be go from transparent at the top
  528 + * to opaque at the bottom.
  529 + *
  530 + * @param integer $height reflection height
  531 + * @param integer $opacity reflection opacity: 0-100
  532 + * @param boolean $fade_in TRUE to fade in, FALSE to fade out
  533 + * @return $this
  534 + * @uses Image::_do_reflection
  535 + */
  536 + public function reflection($height = NULL, $opacity = 100, $fade_in = FALSE)
  537 + {
  538 + if ($height === NULL OR $height > $this->height)
  539 + {
  540 + // Use the current height
  541 + $height = $this->height;
  542 + }
  543 +
  544 + // The opacity must be in the range of 0 to 100
  545 + $opacity = min(max($opacity, 0), 100);
  546 +
  547 + $this->_do_reflection($height, $opacity, $fade_in);
  548 +
  549 + return $this;
  550 + }
  551 +
  552 + /**
  553 + * Add a watermark to an image with a specified opacity. Alpha transparency
  554 + * will be preserved.
  555 + *
  556 + * If no offset is specified, the center of the axis will be used.
  557 + * If an offset of TRUE is specified, the bottom of the axis will be used.
  558 + *
  559 + * // Add a watermark to the bottom right of the image
  560 + * $mark = Image::factory('upload/watermark.png');
  561 + * $image->watermark($mark, TRUE, TRUE);
  562 + *
  563 + * @param Kohana_Image $watermark watermark Image instance
  564 + * @param integer $offset_x offset from the left
  565 + * @param integer $offset_y offset from the top
  566 + * @param integer $opacity opacity of watermark: 1-100
  567 + * @return $this
  568 + * @uses Image::_do_watermark
  569 + */
  570 + public function watermark(Kohana_Image $watermark, $offset_x = NULL, $offset_y = NULL, $opacity = 100)
  571 + {
  572 + if ($offset_x === NULL)
  573 + {
  574 + // Center the X offset
  575 + $offset_x = round(($this->width - $watermark->width) / 2);
  576 + }
  577 + elseif ($offset_x === TRUE)
  578 + {
  579 + // Bottom the X offset
  580 + $offset_x = $this->width - $watermark->width;
  581 + }
  582 + elseif ($offset_x < 0)
  583 + {
  584 + // Set the X offset from the right
  585 + $offset_x = $this->width - $watermark->width + $offset_x;
  586 + }
  587 +
  588 + if ($offset_y === NULL)
  589 + {
  590 + // Center the Y offset
  591 + $offset_y = round(($this->height - $watermark->height) / 2);
  592 + }
  593 + elseif ($offset_y === TRUE)
  594 + {
  595 + // Bottom the Y offset
  596 + $offset_y = $this->height - $watermark->height;
  597 + }
  598 + elseif ($offset_y < 0)
  599 + {
  600 + // Set the Y offset from the bottom
  601 + $offset_y = $this->height - $watermark->height + $offset_y;
  602 + }
  603 +
  604 + // The opacity must be in the range of 1 to 100
  605 + $opacity = min(max($opacity, 1), 100);
  606 +
  607 + $this->_do_watermark($watermark, $offset_x, $offset_y, $opacity);
  608 +
  609 + return $this;
  610 + }
  611 +
  612 + /**
  613 + * Set the background color of an image. This is only useful for images
  614 + * with alpha transparency.
  615 + *
  616 + * // Make the image background black
  617 + * $image->background('#000');
  618 + *
  619 + * // Make the image background black with 50% opacity
  620 + * $image->background('#000', 50);
  621 + *
  622 + * @param string $color hexadecimal color value
  623 + * @param integer $opacity background opacity: 0-100
  624 + * @return $this
  625 + * @uses Image::_do_background
  626 + */
  627 + public function background($color, $opacity = 100)
  628 + {
  629 + if ($color[0] === '#')
  630 + {
  631 + // Remove the pound
  632 + $color = substr($color, 1);
  633 + }
  634 +
  635 + if (strlen($color) === 3)
  636 + {
  637 + // Convert shorthand into longhand hex notation
  638 + $color = preg_replace('/./', '$0$0', $color);
  639 + }
  640 +
  641 + // Convert the hex into RGB values
  642 + list ($r, $g, $b) = array_map('hexdec', str_split($color, 2));
  643 +
  644 + // The opacity must be in the range of 0 to 100
  645 + $opacity = min(max($opacity, 0), 100);
  646 +
  647 + $this->_do_background($r, $g, $b, $opacity);
  648 +
  649 + return $this;
  650 + }
  651 +
  652 + /**
  653 + * Save the image. If the filename is omitted, the original image will
  654 + * be overwritten.
  655 + *
  656 + * // Save the image as a PNG
  657 + * $image->save('saved/cool.png');
  658 + *
  659 + * // Overwrite the original image
  660 + * $image->save();
  661 + *
  662 + * [!!] If the file exists, but is not writable, an exception will be thrown.
  663 + *
  664 + * [!!] If the file does not exist, and the directory is not writable, an
  665 + * exception will be thrown.
  666 + *
  667 + * @param string $file new image path
  668 + * @param integer $quality quality of image: 1-100
  669 + * @return boolean
  670 + * @uses Image::_save
  671 + * @throws ErrorException
  672 + */
  673 + public function save($file = NULL, $quality = 100)
  674 + {
  675 + if ($file === NULL)
  676 + {
  677 + // Overwrite the file
  678 + $file = $this->file;
  679 + }
  680 +
  681 + if (is_file($file))
  682 + {
  683 + if ( ! is_writable($file))
  684 + {
  685 + throw new ErrorException(sprintf('File must be writable: %s',$file));
  686 + }
  687 + }
  688 + else
  689 + {
  690 + // Get the directory of the file
  691 + $directory = realpath(pathinfo($file, PATHINFO_DIRNAME));
  692 +
  693 + if ( ! is_dir($directory) OR ! is_writable($directory))
  694 + {
  695 + throw new ErrorException(sprintf('Directory must be writable: %s',$directory));
  696 + }
  697 + }
  698 +
  699 + // The quality must be in the range of 1 to 100
  700 + $quality = min(max($quality, 1), 100);
  701 +
  702 + return $this->_do_save($file, $quality);
  703 + }
  704 +
  705 + /**
  706 + * Render the image and return the binary string.
  707 + *
  708 + * // Render the image at 50% quality
  709 + * $data = $image->render(NULL, 50);
  710 + *
  711 + * // Render the image as a PNG
  712 + * $data = $image->render('png');
  713 + *
  714 + * @param string $type image type to return: png, jpg, gif, etc
  715 + * @param integer $quality quality of image: 1-100
  716 + * @return string
  717 + * @uses Image::_do_render
  718 + */
  719 + public function render($type = NULL, $quality = 100)
  720 + {
  721 + if ($type === NULL)
  722 + {
  723 + // Use the current image type
  724 + $type = image_type_to_extension($this->type, FALSE);
  725 + }
  726 +
  727 + return $this->_do_render($type, $quality);
  728 + }
  729 +
  730 + /**
  731 + * Execute a resize.
  732 + *
  733 + * @param integer $width new width
  734 + * @param integer $height new height
  735 + * @return void
  736 + */
  737 + abstract protected function _do_resize($width, $height);
  738 +
  739 + /**
  740 + * Adaptation the image.
  741 + *
  742 + * @param integer $width image width
  743 + * @param integer $height image height
  744 + * @param integer $bg_width background width
  745 + * @param integer $bg_height background height
  746 + * @param integer $offset_x offset from the left
  747 + * @param integer $offset_y offset from the top
  748 + */
  749 + abstract protected function _do_adapt($width, $height, $bg_width, $bg_height, $offset_x, $offset_y);
  750 +
  751 + /**
  752 + * Execute a crop.
  753 + *
  754 + * @param integer $width new width
  755 + * @param integer $height new height
  756 + * @param integer $offset_x offset from the left
  757 + * @param integer $offset_y offset from the top
  758 + * @return void
  759 + */
  760 + abstract protected function _do_crop($width, $height, $offset_x, $offset_y);
  761 +
  762 + /**
  763 + * Execute a rotation.
  764 + *
  765 + * @param integer $degrees degrees to rotate
  766 + * @return void
  767 + */
  768 + abstract protected function _do_rotate($degrees);
  769 +
  770 + /**
  771 + * Execute a flip.
  772 + *
  773 + * @param integer $direction direction to flip
  774 + * @return void
  775 + */
  776 + abstract protected function _do_flip($direction);
  777 +
  778 + /**
  779 + * Execute a sharpen.
  780 + *
  781 + * @param integer $amount amount to sharpen
  782 + * @return void
  783 + */
  784 + abstract protected function _do_sharpen($amount);
  785 +
  786 + /**
  787 + * Execute a reflection.
  788 + *
  789 + * @param integer $height reflection height
  790 + * @param integer $opacity reflection opacity
  791 + * @param boolean $fade_in TRUE to fade out, FALSE to fade in
  792 + * @return void
  793 + */
  794 + abstract protected function _do_reflection($height, $opacity, $fade_in);
  795 +
  796 + /**
  797 + * Execute a watermarking.
  798 + *
  799 + * @param Kohana_Image $image watermarking Kohana_Image
  800 + * @param integer $offset_x offset from the left
  801 + * @param integer $offset_y offset from the top
  802 + * @param integer $opacity opacity of watermark
  803 + * @return void
  804 + */
  805 + abstract protected function _do_watermark(Kohana_Image $image, $offset_x, $offset_y, $opacity);
  806 +
  807 + /**
  808 + * Execute a background.
  809 + *
  810 + * @param integer $r red
  811 + * @param integer $g green
  812 + * @param integer $b blue
  813 + * @param integer $opacity opacity
  814 + * @return void
  815 + */
  816 + abstract protected function _do_background($r, $g, $b, $opacity);
  817 +
  818 + /**
  819 + * Execute a save.
  820 + *
  821 + * @param string $file new image filename
  822 + * @param integer $quality quality
  823 + * @return boolean
  824 + */
  825 + abstract protected function _do_save($file, $quality);
  826 +
  827 + /**
  828 + * Execute a render.
  829 + *
  830 + * @param string $type image type: png, jpg, gif, etc
  831 + * @param integer $quality quality
  832 + * @return string
  833 + */
  834 + abstract protected function _do_render($type, $quality);
  835 +
  836 +} // End Image
... ...
common/config/bootstrap.php
... ... @@ -3,4 +3,5 @@ Yii::setAlias(&#39;@common&#39;, dirname(__DIR__));
3 3 Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
4 4 Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
5 5 Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
  6 +Yii::setAlias('@storage', dirname(dirname(__DIR__)) . '/storage');
6 7 Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage');
... ...
common/config/main.php
... ... @@ -69,6 +69,66 @@ return [
69 69 ],
70 70 ],
71 71 ],
  72 + 'artboximage' => [
  73 + 'class' => 'common\components\artboximage\ArtboxImage',
  74 + 'driver' => 'GD', //GD or Imagick
  75 + 'rootPath' => Yii::getAlias('@storage'),
  76 + 'rootUrl' => Yii::getAlias('/storage'),
  77 + 'presets' => [
  78 + 'product' => [
  79 + 'resize' => [
  80 + 'width' => 300,
  81 + 'height' => 300,
  82 + 'master' => null
  83 + ],
  84 + /*'flip' => [
  85 + 'direction' => \common\components\artboximage\drivers\Image::HORIZONTAL
  86 + ]*/
  87 + ],
  88 + 'brandlist' => [
  89 + 'resize' => [
  90 + 'width' => 138,
  91 + 'height' => 78,
  92 + 'master' => null
  93 + ],
  94 + ],
  95 + 'product_trumb' => [
  96 + 'resize' => [
  97 + 'width' => 80,
  98 + 'height' => 80,
  99 + 'master' => null
  100 + ],
  101 + ],
  102 + 'product_list' => [
  103 + 'resize' => [
  104 + 'width' => 130,
  105 + 'height' => 70,
  106 + 'master' => null
  107 + ],
  108 + ],
  109 + 'product_list2' => [
  110 + 'resize' => [
  111 + 'width' => 130,
  112 + 'height' => 70,
  113 + 'master' => null
  114 + ],
  115 + ],
  116 + 'mainmenu' => [
  117 + 'resize' => [
  118 + 'width' => 160,
  119 + 'height' => 170,
  120 + 'master' => null
  121 + ],
  122 + ],
  123 + 'large' => [
  124 + 'resize' => [
  125 + 'width' => 600,
  126 + 'height' => 600,
  127 + 'master' => null
  128 + ],
  129 + ],
  130 + ]
  131 + ],
72 132 ],
73 133  
74 134 'modules' => [
... ...
common/modules/product/models/Brand.php
... ... @@ -123,10 +123,10 @@ class Brand extends \yii\db\ActiveRecord
123 123 }
124 124  
125 125 public function getImageFile() {
126   - return empty($this->image) ? null : '/images/brand/'. $this->image;
  126 + return empty($this->image) ? null : Yii::getAlias('@storage/brand/'. $this->image);
127 127 }
128 128  
129 129 public function getImageUrl() {
130   - return empty($this->image) ? null : '/images/brand/'. $this->image;
  130 + return empty($this->image) ? null : '/storage/brand/'. $this->image;
131 131 }
132 132 }
... ...
common/modules/product/models/Category.php
... ... @@ -177,9 +177,13 @@ class Category extends \yii\db\ActiveRecord
177 177 return empty($this->categoryName) ? null : $this->categoryName->value;
178 178 }
179 179  
  180 + public function getImageFile() {
  181 + return empty($this->image) ? null : Yii::getAlias('@storage/category/'. $this->image);
  182 + }
  183 +
180 184 public function getImageUrl()
181 185 {
182   - return empty($this->image) ? null : '/images/category/' . $this->image;
  186 + return empty($this->image) ? null : '/storage/category/' . $this->image;
183 187 }
184 188  
185 189 public function beforeSave($insert)
... ...
common/modules/product/models/Product.php
... ... @@ -197,7 +197,7 @@ class Product extends \yii\db\ActiveRecord
197 197 // $this->imagesUpload = [$this->imagesUpload];
198 198 // }
199 199 // foreach($this->imagesUpload as $image) {
200   -// $image->saveAs((Yii::getAlias('@frontend/web/images/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension)));
  200 +// $image->saveAs((Yii::getAlias('@storage/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension)));
201 201 // }
202 202 //
203 203 //
... ... @@ -233,12 +233,12 @@ class Product extends \yii\db\ActiveRecord
233 233 foreach ($this->imagesUpload as $image) {
234 234 $imageName = $image->baseName .'.'. $image->extension;
235 235 $i = 0;
236   - while(file_exists(Yii::getAlias('@frontend/web/images/products/' . $imageName))) {
  236 + while(file_exists(Yii::getAlias('@storage/products/'. $imageName))) {
237 237 $i++;
238 238 $imageName = $image->baseName .'_'. $i .'.'. $image->extension;
239 239 }
240 240  
241   - $image->saveAs(Yii::getAlias('@frontend/web/images/products/' .$imageName));
  241 + $image->saveAs(Yii::getAlias('@storage/products/'. $imageName));
242 242 $images[] = $imageName;
243 243 }
244 244 return $images;
... ...
common/modules/product/models/ProductImage.php
... ... @@ -97,7 +97,7 @@ class ProductImage extends \yii\db\ActiveRecord
97 97 */
98 98 public function getImageFile()
99 99 {
100   - return isset($this->image) ? '/images/products/' . $this->image : null;
  100 + return isset($this->image) ? Yii::getAlias('@storage/products/'. $this->image) : null;
101 101 }
102 102  
103 103 /**
... ... @@ -107,7 +107,7 @@ class ProductImage extends \yii\db\ActiveRecord
107 107 public function getImageUrl()
108 108 {
109 109 // return a default image placeholder if your source image is not found
110   - return isset($this->image) ? '/images/products/'. $this->image : 'default.jpg';
  110 + return isset($this->image) ? '/storage/products/'. $this->image : 'default.jpg';
111 111 }
112 112  
113 113 /**
... ...
common/modules/product/widgets/views/brandsCarousel.php
... ... @@ -3,7 +3,7 @@
3 3 <div class="prods_carousel">
4 4 <ul>
5 5 <?php foreach($brands as $brand) :?>
6   - <li><span><a href="<?= \yii\helpers\Url::to('/brands/'. $brand->alias)?>" title="<?= $brand->name?>"><?= $brand->imageFile ? Yii::$app->imageCache->thumb($brand->imageFile, 'brandlist') : ''?></a></span></li>
  6 + <li><span><a href="<?= \yii\helpers\Url::to('/brands/'. $brand->alias)?>" title="<?= $brand->name?>"><?= $brand->imageFile ? \common\components\artboximage\ArtboxImageHelper::getImage($brand->imageFile, 'brandlist') : ''?></a></span></li>
7 7 <?php endforeach?>
8 8 </ul>
9 9 </div>
... ...
common/modules/product/widgets/views/submenu.php
... ... @@ -12,7 +12,7 @@
12 12 <?php if (empty($_item->image)) :?>
13 13 <img valign="top" src="/images/no_photo.png">
14 14 <?php else :?>
15   - <?= $_item->imageUrl ? Yii::$app->imageCache->thumb($_item->imageUrl, 'mainmenu') : ''?>
  15 + <?= $_item->imageUrl ? \common\components\artboximage\ArtboxImageHelper::getImage($_item->imageUrl, 'mainmenu') : ''?>
16 16 <?php endif?>
17 17 </div>
18 18 <div class="title"><?= $_item->categoryName->value?></div>
... ... @@ -34,7 +34,7 @@
34 34 <?php if (empty($_item['item']->image)) :?>
35 35 <img valign="top" src="/images/no_photo.png">
36 36 <?php else :?>
37   - <?= $_item['item']->imageUrl ? Yii::$app->imageCache->thumb($_item['item']->imageUrl, 'mainmenu') : ''?>
  37 + <?= $_item['item']->imageUrl ? \common\components\artboximage\ArtboxImageHelper::getImage($_item['item']->imageUrl, 'mainmenu') : ''?>
38 38 <?php endif?>
39 39 </div>
40 40 <div class="title"><?= $_item['item']->categoryName->value?></div>
... ...
common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php
... ... @@ -116,7 +116,7 @@ class ArtboxSynonymBehavior extends Behavior {
116 116 if ($isave) {
117 117 $valueModel->setAttribute($this->valueOptionId, $this->owner->getAttribute($this->keyNameId));
118 118 $valueModel->save();
119   - if (!empty($this->slug) && empty($this->owner->getAttribute($this->slug['slugKeyName']))) {
  119 + if (!empty($this->slug) && empty($this->owner->{$this->slug['slugKeyName']})) {
120 120 $this->owner->{$this->slug['slugKeyName']} = $this->slugify($valueModel->{$this->slug['valueKeyName']});
121 121 }
122 122 }
... ...
composer.json
... ... @@ -5,9 +5,6 @@
5 5 "homepage": "http://www.yiiframework.com/",
6 6 "type": "project",
7 7 "license": "BSD-3-Clause",
8   - "platform": {
9   - "php": "5.5.0"
10   - },
11 8 "support": {
12 9 "issues": "https://github.com/yiisoft/yii2/issues?state=open",
13 10 "forum": "http://www.yiiframework.com/forum/",
... ... @@ -38,7 +35,13 @@
38 35 "unclead/yii2-multiple-input": "~1.0",
39 36 "codeception/codeception":"*",
40 37 "phpmailer/phpmailer": "^5.2",
41   - "league/oauth2-client": "^1.3"
  38 + "league/oauth2-client": "^1.3",
  39 + "kartik-v/yii2-grid": "@dev",
  40 + "kartik-v/yii2-mpdf": "@dev",
  41 + "kartik-v/yii2-widget-fileinput": "@dev",
  42 + "maxmirazh33/yii2-uploadable-cropable-image": "*",
  43 + "iutbay/yii2-imagecache": "*",
  44 + "yurkinx/yii2-image": "dev-master"
42 45 },
43 46 "require-dev": {
44 47 "yiisoft/yii2-codeception": "*",
... ...
composer.lock deleted
1   -{
2   - "_readme": [
3   - "This file locks the dependencies of your project to a known state",
4   - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5   - "This file is @generated automatically"
6   - ],
7   - "hash": "d817e95d434dbdfff82796cc0b6e9c9e",
8   - "content-hash": "a704572d721b5adc21f823d363fcd4de",
9   - "packages": [
10   - {
11   - "name": "2amigos/yii2-transliterator-helper",
12   - "version": "dev-master",
13   - "source": {
14   - "type": "git",
15   - "url": "https://github.com/2amigos/yii2-transliterator-helper.git",
16   - "reference": "1e4284351f4250a8f2ce553ea4f420fcbb424309"
17   - },
18   - "dist": {
19   - "type": "zip",
20   - "url": "https://api.github.com/repos/2amigos/yii2-transliterator-helper/zipball/1e4284351f4250a8f2ce553ea4f420fcbb424309",
21   - "reference": "1e4284351f4250a8f2ce553ea4f420fcbb424309",
22   - "shasum": ""
23   - },
24   - "require": {
25   - "yiisoft/yii2": "*"
26   - },
27   - "type": "yii2-extension",
28   - "autoload": {
29   - "psr-4": {
30   - "dosamigos\\transliterator\\": ""
31   - }
32   - },
33   - "notification-url": "https://packagist.org/downloads/",
34   - "license": [
35   - "BSD-3-Clause"
36   - ],
37   - "authors": [
38   - {
39   - "name": "Antonio Ramirez",
40   - "email": "ramirez.cobos@gmail.com",
41   - "homepage": "http://www.ramirezcobos.com"
42   - }
43   - ],
44   - "description": "Transliterator Helper for Yii2.",
45   - "keywords": [
46   - "extension",
47   - "helper",
48   - "transliterator",
49   - "yii"
50   - ],
51   - "time": "2014-06-23 14:01:30"
52   - },
53   - {
54   - "name": "almasaeed2010/adminlte",
55   - "version": "v2.3.3",
56   - "source": {
57   - "type": "git",
58   - "url": "https://github.com/almasaeed2010/AdminLTE.git",
59   - "reference": "8db979795044412a2e2b4e9659788c23cb59fcd3"
60   - },
61   - "dist": {
62   - "type": "zip",
63   - "url": "https://api.github.com/repos/almasaeed2010/AdminLTE/zipball/8db979795044412a2e2b4e9659788c23cb59fcd3",
64   - "reference": "8db979795044412a2e2b4e9659788c23cb59fcd3",
65   - "shasum": ""
66   - },
67   - "type": "library",
68   - "notification-url": "https://packagist.org/downloads/",
69   - "license": [
70   - "MIT"
71   - ],
72   - "authors": [
73   - {
74   - "name": "Abdullah Almsaeed",
75   - "email": "support@almsaeedstudio.com"
76   - }
77   - ],
78   - "description": "AdminLTE - admin control panel and dashboard that's based on Bootstrap 3",
79   - "homepage": "http://almsaeedstudio.com/",
80   - "keywords": [
81   - "JS",
82   - "admin",
83   - "back-end",
84   - "css",
85   - "less",
86   - "responsive",
87   - "template",
88   - "theme",
89   - "web"
90   - ],
91   - "time": "2016-03-24 14:31:41"
92   - },
93   - {
94   - "name": "behat/gherkin",
95   - "version": "dev-master",
96   - "source": {
97   - "type": "git",
98   - "url": "https://github.com/Behat/Gherkin.git",
99   - "reference": "6f005467f571c3c53477fb0a646ba8092aa54bd4"
100   - },
101   - "dist": {
102   - "type": "zip",
103   - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/6f005467f571c3c53477fb0a646ba8092aa54bd4",
104   - "reference": "6f005467f571c3c53477fb0a646ba8092aa54bd4",
105   - "shasum": ""
106   - },
107   - "require": {
108   - "php": ">=5.3.1"
109   - },
110   - "require-dev": {
111   - "phpunit/phpunit": "~4.5|~5",
112   - "symfony/phpunit-bridge": "~2.7|~3",
113   - "symfony/yaml": "~2.3|~3"
114   - },
115   - "suggest": {
116   - "symfony/yaml": "If you want to parse features, represented in YAML files"
117   - },
118   - "type": "library",
119   - "extra": {
120   - "branch-alias": {
121   - "dev-master": "4.4-dev"
122   - }
123   - },
124   - "autoload": {
125   - "psr-0": {
126   - "Behat\\Gherkin": "src/"
127   - }
128   - },
129   - "notification-url": "https://packagist.org/downloads/",
130   - "license": [
131   - "MIT"
132   - ],
133   - "authors": [
134   - {
135   - "name": "Konstantin Kudryashov",
136   - "email": "ever.zet@gmail.com",
137   - "homepage": "http://everzet.com"
138   - }
139   - ],
140   - "description": "Gherkin DSL parser for PHP 5.3",
141   - "homepage": "http://behat.org/",
142   - "keywords": [
143   - "BDD",
144   - "Behat",
145   - "Cucumber",
146   - "DSL",
147   - "gherkin",
148   - "parser"
149   - ],
150   - "time": "2015-12-31 10:51:34"
151   - },
152   - {
153   - "name": "bower-asset/admin-lte",
154   - "version": "dev-master",
155   - "source": {
156   - "type": "git",
157   - "url": "https://github.com/almasaeed2010/AdminLTE.git",
158   - "reference": "fe147c9b2188bc3e4c651ca24581a6710d5421ff"
159   - },
160   - "dist": {
161   - "type": "zip",
162   - "url": "https://api.github.com/repos/almasaeed2010/AdminLTE/zipball/fe147c9b2188bc3e4c651ca24581a6710d5421ff",
163   - "reference": "fe147c9b2188bc3e4c651ca24581a6710d5421ff",
164   - "shasum": ""
165   - },
166   - "type": "bower-asset-library",
167   - "extra": {
168   - "bower-asset-main": [
169   - "index2.html",
170   - "dist/css/AdminLTE.css",
171   - "dist/js/app.js",
172   - "build/less/AdminLTE.less"
173   - ],
174   - "bower-asset-ignore": [
175   - "/.*",
176   - "node_modules",
177   - "bower_components",
178   - "composer.json",
179   - "documentation"
180   - ]
181   - },
182   - "license": [
183   - "MIT"
184   - ],
185   - "description": "Admin dashboard and control panel template",
186   - "keywords": [
187   - "admin",
188   - "backend",
189   - "bootstrap",
190   - "css",
191   - "html",
192   - "js",
193   - "responsive",
194   - "template",
195   - "theme"
196   - ],
197   - "time": "2016-03-14 01:14:03"
198   - },
199   - {
200   - "name": "bower-asset/bootstrap",
201   - "version": "v3.3.5",
202   - "source": {
203   - "type": "git",
204   - "url": "https://github.com/twbs/bootstrap.git",
205   - "reference": "16b48259a62f576e52c903c476bd42b90ab22482"
206   - },
207   - "dist": {
208   - "type": "zip",
209   - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/16b48259a62f576e52c903c476bd42b90ab22482",
210   - "reference": "16b48259a62f576e52c903c476bd42b90ab22482",
211   - "shasum": ""
212   - },
213   - "require": {
214   - "bower-asset/jquery": ">=1.9.1"
215   - },
216   - "type": "bower-asset-library",
217   - "extra": {
218   - "bower-asset-main": [
219   - "less/bootstrap.less",
220   - "dist/js/bootstrap.js"
221   - ],
222   - "bower-asset-ignore": [
223   - "/.*",
224   - "_config.yml",
225   - "CNAME",
226   - "composer.json",
227   - "CONTRIBUTING.md",
228   - "docs",
229   - "js/tests",
230   - "test-infra"
231   - ]
232   - },
233   - "license": [
234   - "MIT"
235   - ],
236   - "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
237   - "keywords": [
238   - "css",
239   - "framework",
240   - "front-end",
241   - "js",
242   - "less",
243   - "mobile-first",
244   - "responsive",
245   - "web"
246   - ]
247   - },
248   - {
249   - "name": "bower-asset/fontawesome",
250   - "version": "v4.5.0",
251   - "source": {
252   - "type": "git",
253   - "url": "https://github.com/FortAwesome/Font-Awesome.git",
254   - "reference": "fddd2c240452e6c8990c4ef75e0265b455aa7968"
255   - },
256   - "dist": {
257   - "type": "zip",
258   - "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/fddd2c240452e6c8990c4ef75e0265b455aa7968",
259   - "reference": "fddd2c240452e6c8990c4ef75e0265b455aa7968",
260   - "shasum": ""
261   - },
262   - "type": "bower-asset-library",
263   - "extra": {
264   - "bower-asset-main": [
265   - "less/font-awesome.less",
266   - "scss/font-awesome.scss"
267   - ],
268   - "bower-asset-ignore": [
269   - "*/.*",
270   - "*.json",
271   - "src",
272   - "*.yml",
273   - "Gemfile",
274   - "Gemfile.lock",
275   - "*.md"
276   - ]
277   - },
278   - "license": [
279   - "OFL-1.1",
280   - "MIT",
281   - "CC-BY-3.0"
282   - ],
283   - "description": "Font Awesome"
284   - },
285   - {
286   - "name": "bower-asset/jquery",
287   - "version": "2.2.3",
288   - "source": {
289   - "type": "git",
290   - "url": "https://github.com/jquery/jquery-dist.git",
291   - "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198"
292   - },
293   - "dist": {
294   - "type": "zip",
295   - "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/af22a351b2ea5801ffb1695abb3bb34d5bed9198",
296   - "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198",
297   - "shasum": ""
298   - },
299   - "type": "bower-asset-library",
300   - "extra": {
301   - "bower-asset-main": "dist/jquery.js",
302   - "bower-asset-ignore": [
303   - "package.json"
304   - ]
305   - },
306   - "license": [
307   - "MIT"
308   - ],
309   - "keywords": [
310   - "browser",
311   - "javascript",
312   - "jquery",
313   - "library"
314   - ]
315   - },
316   - {
317   - "name": "bower-asset/jquery-ui",
318   - "version": "1.11.4",
319   - "source": {
320   - "type": "git",
321   - "url": "https://github.com/components/jqueryui.git",
322   - "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1"
323   - },
324   - "dist": {
325   - "type": "zip",
326   - "url": "https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1",
327   - "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1",
328   - "shasum": ""
329   - },
330   - "require": {
331   - "bower-asset/jquery": ">=1.6"
332   - },
333   - "type": "bower-asset-library",
334   - "extra": {
335   - "bower-asset-main": [
336   - "jquery-ui.js"
337   - ],
338   - "bower-asset-ignore": []
339   - }
340   - },
341   - {
342   - "name": "bower-asset/jquery.inputmask",
343   - "version": "3.2.7",
344   - "source": {
345   - "type": "git",
346   - "url": "https://github.com/RobinHerbots/jquery.inputmask.git",
347   - "reference": "5a72c563b502b8e05958a524cdfffafe9987be38"
348   - },
349   - "dist": {
350   - "type": "zip",
351   - "url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/5a72c563b502b8e05958a524cdfffafe9987be38",
352   - "reference": "5a72c563b502b8e05958a524cdfffafe9987be38",
353   - "shasum": ""
354   - },
355   - "require": {
356   - "bower-asset/jquery": ">=1.7"
357   - },
358   - "type": "bower-asset-library",
359   - "extra": {
360   - "bower-asset-main": [
361   - "./dist/inputmask/inputmask.js"
362   - ],
363   - "bower-asset-ignore": [
364   - "**/*",
365   - "!dist/*",
366   - "!dist/inputmask/*",
367   - "!dist/min/*",
368   - "!dist/min/inputmask/*",
369   - "!extra/bindings/*",
370   - "!extra/dependencyLibs/*",
371   - "!extra/phone-codes/*"
372   - ]
373   - },
374   - "license": [
375   - "http://opensource.org/licenses/mit-license.php"
376   - ],
377   - "description": "jquery.inputmask is a jquery plugin which create an input mask.",
378   - "keywords": [
379   - "form",
380   - "input",
381   - "inputmask",
382   - "jquery",
383   - "mask",
384   - "plugins"
385   - ]
386   - },
387   - {
388   - "name": "bower-asset/punycode",
389   - "version": "v1.3.2",
390   - "source": {
391   - "type": "git",
392   - "url": "https://github.com/bestiejs/punycode.js.git",
393   - "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3"
394   - },
395   - "dist": {
396   - "type": "zip",
397   - "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3",
398   - "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3",
399   - "shasum": ""
400   - },
401   - "type": "bower-asset-library",
402   - "extra": {
403   - "bower-asset-main": "punycode.js",
404   - "bower-asset-ignore": [
405   - "coverage",
406   - "tests",
407   - ".*",
408   - "component.json",
409   - "Gruntfile.js",
410   - "node_modules",
411   - "package.json"
412   - ]
413   - }
414   - },
415   - {
416   - "name": "bower-asset/yii2-pjax",
417   - "version": "v2.0.6",
418   - "source": {
419   - "type": "git",
420   - "url": "https://github.com/yiisoft/jquery-pjax.git",
421   - "reference": "60728da6ade5879e807a49ce59ef9a72039b8978"
422   - },
423   - "dist": {
424   - "type": "zip",
425   - "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978",
426   - "reference": "60728da6ade5879e807a49ce59ef9a72039b8978",
427   - "shasum": ""
428   - },
429   - "require": {
430   - "bower-asset/jquery": ">=1.8"
431   - },
432   - "type": "bower-asset-library",
433   - "extra": {
434   - "bower-asset-main": "./jquery.pjax.js",
435   - "bower-asset-ignore": [
436   - ".travis.yml",
437   - "Gemfile",
438   - "Gemfile.lock",
439   - "CONTRIBUTING.md",
440   - "vendor/",
441   - "script/",
442   - "test/"
443   - ]
444   - },
445   - "license": [
446   - "MIT"
447   - ]
448   - },
449   - {
450   - "name": "cebe/markdown",
451   - "version": "dev-master",
452   - "source": {
453   - "type": "git",
454   - "url": "https://github.com/cebe/markdown.git",
455   - "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5"
456   - },
457   - "dist": {
458   - "type": "zip",
459   - "url": "https://api.github.com/repos/cebe/markdown/zipball/e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5",
460   - "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5",
461   - "shasum": ""
462   - },
463   - "require": {
464   - "lib-pcre": "*",
465   - "php": ">=5.4.0"
466   - },
467   - "require-dev": {
468   - "cebe/indent": "*",
469   - "facebook/xhprof": "*@dev",
470   - "phpunit/phpunit": "4.1.*"
471   - },
472   - "bin": [
473   - "bin/markdown"
474   - ],
475   - "type": "library",
476   - "extra": {
477   - "branch-alias": {
478   - "dev-master": "1.1.x-dev"
479   - }
480   - },
481   - "autoload": {
482   - "psr-4": {
483   - "cebe\\markdown\\": ""
484   - }
485   - },
486   - "notification-url": "https://packagist.org/downloads/",
487   - "license": [
488   - "MIT"
489   - ],
490   - "authors": [
491   - {
492   - "name": "Carsten Brandt",
493   - "email": "mail@cebe.cc",
494   - "homepage": "http://cebe.cc/",
495   - "role": "Creator"
496   - }
497   - ],
498   - "description": "A super fast, highly extensible markdown parser for PHP",
499   - "homepage": "https://github.com/cebe/markdown#readme",
500   - "keywords": [
501   - "extensible",
502   - "fast",
503   - "gfm",
504   - "markdown",
505   - "markdown-extra"
506   - ],
507   - "time": "2016-03-18 13:28:11"
508   - },
509   - {
510   - "name": "cebe/yii2-gravatar",
511   - "version": "1.1",
512   - "target-dir": "cebe/gravatar",
513   - "source": {
514   - "type": "git",
515   - "url": "https://github.com/cebe/yii2-gravatar.git",
516   - "reference": "c9c01bd14c9bdee9e5ae1ef1aad23f80c182c057"
517   - },
518   - "dist": {
519   - "type": "zip",
520   - "url": "https://api.github.com/repos/cebe/yii2-gravatar/zipball/c9c01bd14c9bdee9e5ae1ef1aad23f80c182c057",
521   - "reference": "c9c01bd14c9bdee9e5ae1ef1aad23f80c182c057",
522   - "shasum": ""
523   - },
524   - "require": {
525   - "yiisoft/yii2": "*"
526   - },
527   - "type": "yii2-extension",
528   - "autoload": {
529   - "psr-0": {
530   - "cebe\\gravatar\\": ""
531   - }
532   - },
533   - "notification-url": "https://packagist.org/downloads/",
534   - "license": [
535   - "MIT"
536   - ],
537   - "authors": [
538   - {
539   - "name": "Carsten Brandt",
540   - "email": "mail@cebe.cc",
541   - "homepage": "http://cebe.cc/",
542   - "role": "Core framework development"
543   - }
544   - ],
545   - "description": "Gravatar Widget for Yii 2",
546   - "keywords": [
547   - "gravatar",
548   - "yii"
549   - ],
550   - "time": "2013-12-10 17:49:58"
551   - },
552   - {
553   - "name": "codeception/codeception",
554   - "version": "dev-master",
555   - "source": {
556   - "type": "git",
557   - "url": "https://github.com/Codeception/Codeception.git",
558   - "reference": "a04ceaea52d2a050d8df19df1a85fb1b24456477"
559   - },
560   - "dist": {
561   - "type": "zip",
562   - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c3a92199d02598de6fb59fa57913a10909628e4f",
563   - "reference": "a04ceaea52d2a050d8df19df1a85fb1b24456477",
564   - "shasum": ""
565   - },
566   - "require": {
567   - "behat/gherkin": "~4.4.0",
568   - "ext-json": "*",
569   - "ext-mbstring": "*",
570   - "facebook/webdriver": ">=1.0.1 <2.0",
571   - "guzzlehttp/guzzle": ">=4.1.4 <7.0",
572   - "guzzlehttp/psr7": "~1.0",
573   - "php": ">=5.4.0 <8.0",
574   - "phpunit/php-code-coverage": ">=2.1.3",
575   - "phpunit/phpunit": ">4.8.20 <6.0",
576   - "symfony/browser-kit": ">=2.7 <3.1",
577   - "symfony/console": ">=2.7 <3.1",
578   - "symfony/css-selector": ">=2.7 <3.1",
579   - "symfony/dom-crawler": ">=2.7 <3.1",
580   - "symfony/event-dispatcher": ">=2.7 <3.1",
581   - "symfony/finder": ">=2.7 <3.1",
582   - "symfony/yaml": ">=2.7 <3.1"
583   - },
584   - "require-dev": {
585   - "codeception/specify": "~0.3",
586   - "facebook/php-sdk-v4": "~5.0",
587   - "flow/jsonpath": "~0.2",
588   - "league/factory-muffin": "^3.0",
589   - "league/factory-muffin-faker": "^1.0",
590   - "monolog/monolog": "~1.8",
591   - "pda/pheanstalk": "~3.0",
592   - "php-amqplib/php-amqplib": "~2.4"
593   - },
594   - "suggest": {
595   - "codeception/specify": "BDD-style code blocks",
596   - "codeception/verify": "BDD-style assertions",
597   - "flow/jsonpath": "For using JSONPath in REST module",
598   - "league/factory-muffin": "For DataFactory module",
599   - "league/factory-muffin-faker": "For Faker support in DataFactory module",
600   - "phpseclib/phpseclib": "for SFTP option in FTP Module"
601   - },
602   - "bin": [
603   - "codecept"
604   - ],
605   - "type": "library",
606   - "extra": {
607   - "branch-alias": []
608   - },
609   - "autoload": {
610   - "psr-4": {
611   - "Codeception\\": "src\\Codeception",
612   - "Codeception\\Extension\\": "ext"
613   - }
614   - },
615   - "notification-url": "https://packagist.org/downloads/",
616   - "license": [
617   - "MIT"
618   - ],
619   - "authors": [
620   - {
621   - "name": "Michael Bodnarchuk",
622   - "email": "davert@mail.ua",
623   - "homepage": "http://codegyre.com"
624   - }
625   - ],
626   - "description": "BDD-style testing framework",
627   - "homepage": "http://codeception.com/",
628   - "keywords": [
629   - "BDD",
630   - "TDD",
631   - "acceptance testing",
632   - "functional testing",
633   - "unit testing"
634   - ],
635   - "time": "2016-03-26 21:39:36"
636   - },
637   - {
638   - "name": "developeruz/yii2-db-rbac",
639   - "version": "dev-master",
640   - "source": {
641   - "type": "git",
642   - "url": "https://github.com/developeruz/yii2-db-rbac.git",
643   - "reference": "28c1b0ebcc45b6365af6f1e9949b4d9cfeaebf1b"
644   - },
645   - "dist": {
646   - "type": "zip",
647   - "url": "https://api.github.com/repos/developeruz/yii2-db-rbac/zipball/28c1b0ebcc45b6365af6f1e9949b4d9cfeaebf1b",
648   - "reference": "28c1b0ebcc45b6365af6f1e9949b4d9cfeaebf1b",
649   - "shasum": ""
650   - },
651   - "require": {
652   - "yiisoft/yii2": "*"
653   - },
654   - "type": "yii2-extension",
655   - "autoload": {
656   - "psr-4": {
657   - "developeruz\\db_rbac\\": ""
658   - }
659   - },
660   - "notification-url": "https://packagist.org/downloads/",
661   - "license": [
662   - "MIT"
663   - ],
664   - "authors": [
665   - {
666   - "name": "Elvira Sheina",
667   - "email": "elleuz@gmail.com",
668   - "homepage": "http://developer.uz"
669   - }
670   - ],
671   - "description": "Dynamic control of access rights in YII2",
672   - "keywords": [
673   - "rbac",
674   - "yii"
675   - ],
676   - "time": "2015-10-03 05:56:47"
677   - },
678   - {
679   - "name": "dmstr/yii2-adminlte-asset",
680   - "version": "2.3.0",
681   - "source": {
682   - "type": "git",
683   - "url": "https://github.com/dmstr/yii2-adminlte-asset.git",
684   - "reference": "73eca05cf04d70f169a88b430d2c03c3b54d623a"
685   - },
686   - "dist": {
687   - "type": "zip",
688   - "url": "https://api.github.com/repos/dmstr/yii2-adminlte-asset/zipball/73eca05cf04d70f169a88b430d2c03c3b54d623a",
689   - "reference": "73eca05cf04d70f169a88b430d2c03c3b54d623a",
690   - "shasum": ""
691   - },
692   - "require": {
693   - "almasaeed2010/adminlte": "~2.0",
694   - "cebe/yii2-gravatar": "1.*",
695   - "rmrevin/yii2-fontawesome": "~2.9",
696   - "yiisoft/yii2": "2.*",
697   - "yiisoft/yii2-bootstrap": "2.*"
698   - },
699   - "type": "yii2-extension",
700   - "extra": {
701   - "branch-alias": {
702   - "dev-master": "2.0.x-dev"
703   - }
704   - },
705   - "autoload": {
706   - "psr-4": {
707   - "dmstr\\": ""
708   - }
709   - },
710   - "notification-url": "https://packagist.org/downloads/",
711   - "license": [
712   - "BSD-3-Clause"
713   - ],
714   - "authors": [
715   - {
716   - "name": "Tobias Munk",
717   - "email": "tobias@diemeisterei.de"
718   - },
719   - {
720   - "name": "Evgeniy Tkachenko",
721   - "email": "et.coder@gmail.com"
722   - }
723   - ],
724   - "description": "Backend theme for Yii2 Framework",
725   - "keywords": [
726   - "AdminLTE",
727   - "extension",
728   - "yii2"
729   - ],
730   - "time": "2016-03-23 04:18:15"
731   - },
732   - {
733   - "name": "doctrine/instantiator",
734   - "version": "dev-master",
735   - "source": {
736   - "type": "git",
737   - "url": "https://github.com/doctrine/instantiator.git",
738   - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
739   - },
740   - "dist": {
741   - "type": "zip",
742   - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/416fb8ad1d095a87f1d21bc40711843cd122fd4a",
743   - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
744   - "shasum": ""
745   - },
746   - "require": {
747   - "php": ">=5.3,<8.0-DEV"
748   - },
749   - "require-dev": {
750   - "athletic/athletic": "~0.1.8",
751   - "ext-pdo": "*",
752   - "ext-phar": "*",
753   - "phpunit/phpunit": "~4.0",
754   - "squizlabs/php_codesniffer": "~2.0"
755   - },
756   - "type": "library",
757   - "extra": {
758   - "branch-alias": {
759   - "dev-master": "1.0.x-dev"
760   - }
761   - },
762   - "autoload": {
763   - "psr-4": {
764   - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
765   - }
766   - },
767   - "notification-url": "https://packagist.org/downloads/",
768   - "license": [
769   - "MIT"
770   - ],
771   - "authors": [
772   - {
773   - "name": "Marco Pivetta",
774   - "email": "ocramius@gmail.com",
775   - "homepage": "http://ocramius.github.com/"
776   - }
777   - ],
778   - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
779   - "homepage": "https://github.com/doctrine/instantiator",
780   - "keywords": [
781   - "constructor",
782   - "instantiate"
783   - ],
784   - "time": "2015-06-14 21:17:01"
785   - },
786   - {
787   - "name": "ezyang/htmlpurifier",
788   - "version": "v4.7.0",
789   - "source": {
790   - "type": "git",
791   - "url": "https://github.com/ezyang/htmlpurifier.git",
792   - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40"
793   - },
794   - "dist": {
795   - "type": "zip",
796   - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40",
797   - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40",
798   - "shasum": ""
799   - },
800   - "require": {
801   - "php": ">=5.2"
802   - },
803   - "type": "library",
804   - "autoload": {
805   - "psr-0": {
806   - "HTMLPurifier": "library/"
807   - },
808   - "files": [
809   - "library/HTMLPurifier.composer.php"
810   - ]
811   - },
812   - "notification-url": "https://packagist.org/downloads/",
813   - "license": [
814   - "LGPL"
815   - ],
816   - "authors": [
817   - {
818   - "name": "Edward Z. Yang",
819   - "email": "admin@htmlpurifier.org",
820   - "homepage": "http://ezyang.com"
821   - }
822   - ],
823   - "description": "Standards compliant HTML filter written in PHP",
824   - "homepage": "http://htmlpurifier.org/",
825   - "keywords": [
826   - "html"
827   - ],
828   - "time": "2015-08-05 01:03:42"
829   - },
830   - {
831   - "name": "facebook/webdriver",
832   - "version": "1.1.1",
833   - "source": {
834   - "type": "git",
835   - "url": "https://github.com/facebook/php-webdriver.git",
836   - "reference": "1c98108ba3eb435b681655764de11502a0653705"
837   - },
838   - "dist": {
839   - "type": "zip",
840   - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/1c98108ba3eb435b681655764de11502a0653705",
841   - "reference": "1c98108ba3eb435b681655764de11502a0653705",
842   - "shasum": ""
843   - },
844   - "require": {
845   - "php": ">=5.3.19"
846   - },
847   - "require-dev": {
848   - "phpunit/phpunit": "4.6.*"
849   - },
850   - "suggest": {
851   - "phpdocumentor/phpdocumentor": "2.*"
852   - },
853   - "type": "library",
854   - "autoload": {
855   - "psr-4": {
856   - "Facebook\\WebDriver\\": "lib/"
857   - }
858   - },
859   - "notification-url": "https://packagist.org/downloads/",
860   - "license": [
861   - "Apache-2.0"
862   - ],
863   - "description": "A PHP client for WebDriver",
864   - "homepage": "https://github.com/facebook/php-webdriver",
865   - "keywords": [
866   - "facebook",
867   - "php",
868   - "selenium",
869   - "webdriver"
870   - ],
871   - "time": "2015-12-31 15:58:49"
872   - },
873   - {
874   - "name": "fortawesome/font-awesome",
875   - "version": "dev-master",
876   - "source": {
877   - "type": "git",
878   - "url": "https://github.com/FortAwesome/Font-Awesome.git",
879   - "reference": "f97ab41d187553e86abb8c7f6c057c9c0b88de58"
880   - },
881   - "dist": {
882   - "type": "zip",
883   - "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/06b2efcda0d4612eccdaf8b79ae428fd079f2dfb",
884   - "reference": "f97ab41d187553e86abb8c7f6c057c9c0b88de58",
885   - "shasum": ""
886   - },
887   - "require-dev": {
888   - "jekyll": "1.0.2",
889   - "lessc": "1.4.2"
890   - },
891   - "type": "library",
892   - "extra": {
893   - "branch-alias": {
894   - "dev-master": "4.0.x-dev"
895   - }
896   - },
897   - "notification-url": "https://packagist.org/downloads/",
898   - "license": [
899   - "OFL-1.1",
900   - "MIT"
901   - ],
902   - "authors": [
903   - {
904   - "name": "Dave Gandy",
905   - "email": "dave@fontawesome.io",
906   - "homepage": "http://twitter.com/davegandy",
907   - "role": "Developer"
908   - }
909   - ],
910   - "description": "The iconic font and CSS framework",
911   - "homepage": "http://fontawesome.io/",
912   - "keywords": [
913   - "FontAwesome",
914   - "awesome",
915   - "bootstrap",
916   - "font",
917   - "icon"
918   - ],
919   - "time": "2016-03-23 12:04:52"
920   - },
921   - {
922   - "name": "guzzlehttp/guzzle",
923   - "version": "dev-master",
924   - "source": {
925   - "type": "git",
926   - "url": "https://github.com/guzzle/guzzle.git",
927   - "reference": "d094e337976dff9d8e2424e8485872194e768662"
928   - },
929   - "dist": {
930   - "type": "zip",
931   - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/85cb758d7367f3aaaa8ffc9269e777919c5f68bb",
932   - "reference": "d094e337976dff9d8e2424e8485872194e768662",
933   - "shasum": ""
934   - },
935   - "require": {
936   - "guzzlehttp/promises": "~1.0",
937   - "guzzlehttp/psr7": "~1.1",
938   - "php": ">=5.5.0"
939   - },
940   - "require-dev": {
941   - "ext-curl": "*",
942   - "phpunit/phpunit": "~4.0",
943   - "psr/log": "~1.0"
944   - },
945   - "type": "library",
946   - "extra": {
947   - "branch-alias": {
948   - "dev-master": "6.2-dev"
949   - }
950   - },
951   - "autoload": {
952   - "files": [
953   - "src/functions_include.php"
954   - ],
955   - "psr-4": {
956   - "GuzzleHttp\\": "src/"
957   - }
958   - },
959   - "notification-url": "https://packagist.org/downloads/",
960   - "license": [
961   - "MIT"
962   - ],
963   - "authors": [
964   - {
965   - "name": "Michael Dowling",
966   - "email": "mtdowling@gmail.com",
967   - "homepage": "https://github.com/mtdowling"
968   - }
969   - ],
970   - "description": "Guzzle is a PHP HTTP client library",
971   - "homepage": "http://guzzlephp.org/",
972   - "keywords": [
973   - "client",
974   - "curl",
975   - "framework",
976   - "http",
977   - "http client",
978   - "rest",
979   - "web service"
980   - ],
981   - "time": "2016-03-21 20:02:09"
982   - },
983   - {
984   - "name": "guzzlehttp/promises",
985   - "version": "1.1.0",
986   - "source": {
987   - "type": "git",
988   - "url": "https://github.com/guzzle/promises.git",
989   - "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8"
990   - },
991   - "dist": {
992   - "type": "zip",
993   - "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8",
994   - "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8",
995   - "shasum": ""
996   - },
997   - "require": {
998   - "php": ">=5.5.0"
999   - },
1000   - "require-dev": {
1001   - "phpunit/phpunit": "~4.0"
1002   - },
1003   - "type": "library",
1004   - "extra": {
1005   - "branch-alias": {
1006   - "dev-master": "1.0-dev"
1007   - }
1008   - },
1009   - "autoload": {
1010   - "psr-4": {
1011   - "GuzzleHttp\\Promise\\": "src/"
1012   - },
1013   - "files": [
1014   - "src/functions_include.php"
1015   - ]
1016   - },
1017   - "notification-url": "https://packagist.org/downloads/",
1018   - "license": [
1019   - "MIT"
1020   - ],
1021   - "authors": [
1022   - {
1023   - "name": "Michael Dowling",
1024   - "email": "mtdowling@gmail.com",
1025   - "homepage": "https://github.com/mtdowling"
1026   - }
1027   - ],
1028   - "description": "Guzzle promises library",
1029   - "keywords": [
1030   - "promise"
1031   - ],
1032   - "time": "2016-03-08 01:15:46"
1033   - },
1034   - {
1035   - "name": "guzzlehttp/psr7",
1036   - "version": "1.3.0",
1037   - "source": {
1038   - "type": "git",
1039   - "url": "https://github.com/guzzle/psr7.git",
1040   - "reference": "31382fef2889136415751badebbd1cb022a4ed72"
1041   - },
1042   - "dist": {
1043   - "type": "zip",
1044   - "url": "https://api.github.com/repos/guzzle/psr7/zipball/31382fef2889136415751badebbd1cb022a4ed72",
1045   - "reference": "31382fef2889136415751badebbd1cb022a4ed72",
1046   - "shasum": ""
1047   - },
1048   - "require": {
1049   - "php": ">=5.4.0",
1050   - "psr/http-message": "~1.0"
1051   - },
1052   - "provide": {
1053   - "psr/http-message-implementation": "1.0"
1054   - },
1055   - "require-dev": {
1056   - "phpunit/phpunit": "~4.0"
1057   - },
1058   - "type": "library",
1059   - "extra": {
1060   - "branch-alias": {
1061   - "dev-master": "1.0-dev"
1062   - }
1063   - },
1064   - "autoload": {
1065   - "psr-4": {
1066   - "GuzzleHttp\\Psr7\\": "src/"
1067   - },
1068   - "files": [
1069   - "src/functions_include.php"
1070   - ]
1071   - },
1072   - "notification-url": "https://packagist.org/downloads/",
1073   - "license": [
1074   - "MIT"
1075   - ],
1076   - "authors": [
1077   - {
1078   - "name": "Michael Dowling",
1079   - "email": "mtdowling@gmail.com",
1080   - "homepage": "https://github.com/mtdowling"
1081   - }
1082   - ],
1083   - "description": "PSR-7 message implementation",
1084   - "keywords": [
1085   - "http",
1086   - "message",
1087   - "stream",
1088   - "uri"
1089   - ],
1090   - "time": "2016-04-13 19:56:01"
1091   - },
1092   - {
1093   - "name": "imagine/imagine",
1094   - "version": "0.5.x-dev",
1095   - "source": {
1096   - "type": "git",
1097   - "url": "https://github.com/avalanche123/Imagine.git",
1098   - "reference": "343580fceed1f89220481ac98480e92f47d91e6c"
1099   - },
1100   - "dist": {
1101   - "type": "zip",
1102   - "url": "https://api.github.com/repos/avalanche123/Imagine/zipball/343580fceed1f89220481ac98480e92f47d91e6c",
1103   - "reference": "343580fceed1f89220481ac98480e92f47d91e6c",
1104   - "shasum": ""
1105   - },
1106   - "require": {
1107   - "php": ">=5.3.2"
1108   - },
1109   - "require-dev": {
1110   - "sami/sami": "dev-master"
1111   - },
1112   - "suggest": {
1113   - "ext-gd": "to use the GD implementation",
1114   - "ext-gmagick": "to use the Gmagick implementation",
1115   - "ext-imagick": "to use the Imagick implementation"
1116   - },
1117   - "type": "library",
1118   - "extra": {
1119   - "branch-alias": {
1120   - "dev-develop": "0.5-dev"
1121   - }
1122   - },
1123   - "autoload": {
1124   - "psr-0": {
1125   - "Imagine": "lib/"
1126   - }
1127   - },
1128   - "notification-url": "https://packagist.org/downloads/",
1129   - "license": [
1130   - "MIT"
1131   - ],
1132   - "authors": [
1133   - {
1134   - "name": "Bulat Shakirzyanov",
1135   - "email": "mallluhuct@gmail.com",
1136   - "homepage": "http://avalanche123.com"
1137   - }
1138   - ],
1139   - "description": "Image processing for PHP 5.3",
1140   - "homepage": "http://imagine.readthedocs.org/",
1141   - "keywords": [
1142   - "drawing",
1143   - "graphics",
1144   - "image manipulation",
1145   - "image processing"
1146   - ],
1147   - "time": "2014-06-13 10:54:04"
1148   - },
1149   - {
1150   - "name": "ircmaxell/random-lib",
1151   - "version": "dev-master",
1152   - "source": {
1153   - "type": "git",
1154   - "url": "https://github.com/ircmaxell/RandomLib.git",
1155   - "reference": "ad6a37d7bce67b0954be63feb1b4c47da77c527f"
1156   - },
1157   - "dist": {
1158   - "type": "zip",
1159   - "url": "https://api.github.com/repos/ircmaxell/RandomLib/zipball/ad6a37d7bce67b0954be63feb1b4c47da77c527f",
1160   - "reference": "ad6a37d7bce67b0954be63feb1b4c47da77c527f",
1161   - "shasum": ""
1162   - },
1163   - "require": {
1164   - "ircmaxell/security-lib": "1.1.*@dev",
1165   - "php": ">=5.3.2"
1166   - },
1167   - "require-dev": {
1168   - "mikey179/vfsstream": "1.1.*",
1169   - "phpunit/phpunit": "3.7.*"
1170   - },
1171   - "type": "library",
1172   - "extra": {
1173   - "branch-alias": {
1174   - "dev-master": "1.1.x-dev"
1175   - }
1176   - },
1177   - "autoload": {
1178   - "psr-0": {
1179   - "RandomLib": "lib"
1180   - }
1181   - },
1182   - "notification-url": "https://packagist.org/downloads/",
1183   - "license": [
1184   - "MIT"
1185   - ],
1186   - "authors": [
1187   - {
1188   - "name": "Anthony Ferrara",
1189   - "email": "ircmaxell@ircmaxell.com",
1190   - "homepage": "http://blog.ircmaxell.com"
1191   - }
1192   - ],
1193   - "description": "A Library For Generating Secure Random Numbers",
1194   - "homepage": "https://github.com/ircmaxell/RandomLib",
1195   - "keywords": [
1196   - "cryptography",
1197   - "random",
1198   - "random-numbers",
1199   - "random-strings"
1200   - ],
1201   - "time": "2016-02-22 13:55:31"
1202   - },
1203   - {
1204   - "name": "ircmaxell/security-lib",
1205   - "version": "v1.1.0",
1206   - "source": {
1207   - "type": "git",
1208   - "url": "https://github.com/ircmaxell/SecurityLib.git",
1209   - "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5"
1210   - },
1211   - "dist": {
1212   - "type": "zip",
1213   - "url": "https://api.github.com/repos/ircmaxell/SecurityLib/zipball/f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5",
1214   - "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5",
1215   - "shasum": ""
1216   - },
1217   - "require": {
1218   - "php": ">=5.3.2"
1219   - },
1220   - "require-dev": {
1221   - "mikey179/vfsstream": "1.1.*"
1222   - },
1223   - "type": "library",
1224   - "extra": {
1225   - "branch-alias": {
1226   - "dev-master": "1.0.x-dev"
1227   - }
1228   - },
1229   - "autoload": {
1230   - "psr-0": {
1231   - "SecurityLib": "lib"
1232   - }
1233   - },
1234   - "notification-url": "https://packagist.org/downloads/",
1235   - "license": [
1236   - "MIT"
1237   - ],
1238   - "authors": [
1239   - {
1240   - "name": "Anthony Ferrara",
1241   - "email": "ircmaxell@ircmaxell.com",
1242   - "homepage": "http://blog.ircmaxell.com"
1243   - }
1244   - ],
1245   - "description": "A Base Security Library",
1246   - "homepage": "https://github.com/ircmaxell/SecurityLib",
1247   - "time": "2015-03-20 14:31:23"
1248   - },
1249   - {
1250   - "name": "kartik-v/yii2-krajee-base",
1251   - "version": "dev-master",
1252   - "source": {
1253   - "type": "git",
1254   - "url": "https://github.com/kartik-v/yii2-krajee-base.git",
1255   - "reference": "3e491e51ed742663b239cd6e0b7f76d403bed7e1"
1256   - },
1257   - "dist": {
1258   - "type": "zip",
1259   - "url": "https://api.github.com/repos/kartik-v/yii2-krajee-base/zipball/3115b09aeb15a5e06f38dc16860baf153d9bf70e",
1260   - "reference": "3e491e51ed742663b239cd6e0b7f76d403bed7e1",
1261   - "shasum": ""
1262   - },
1263   - "require": {
1264   - "yiisoft/yii2-bootstrap": "@dev"
1265   - },
1266   - "type": "yii2-extension",
1267   - "extra": {
1268   - "branch-alias": {
1269   - "dev-master": "1.8.x-dev"
1270   - }
1271   - },
1272   - "autoload": {
1273   - "psr-4": {
1274   - "kartik\\base\\": ""
1275   - }
1276   - },
1277   - "notification-url": "https://packagist.org/downloads/",
1278   - "license": [
1279   - "BSD-3-Clause"
1280   - ],
1281   - "authors": [
1282   - {
1283   - "name": "Kartik Visweswaran",
1284   - "email": "kartikv2@gmail.com",
1285   - "homepage": "http://www.krajee.com/"
1286   - }
1287   - ],
1288   - "description": "Base library and foundation components for all Yii2 Krajee extensions.",
1289   - "homepage": "https://github.com/kartik-v/yii2-krajee-base",
1290   - "keywords": [
1291   - "base",
1292   - "extension",
1293   - "foundation",
1294   - "krajee",
1295   - "widget",
1296   - "yii2"
1297   - ],
1298   - "time": "2016-03-03 12:24:13"
1299   - },
1300   - {
1301   - "name": "kartik-v/yii2-widget-colorinput",
1302   - "version": "dev-master",
1303   - "source": {
1304   - "type": "git",
1305   - "url": "https://github.com/kartik-v/yii2-widget-colorinput.git",
1306   - "reference": "18537fcdab0f5491d5eebff8e2464ef6a616ee4c"
1307   - },
1308   - "dist": {
1309   - "type": "zip",
1310   - "url": "https://api.github.com/repos/kartik-v/yii2-widget-colorinput/zipball/1a10c5e9a528270e22dc8a5eba404c72f417665a",
1311   - "reference": "18537fcdab0f5491d5eebff8e2464ef6a616ee4c",
1312   - "shasum": ""
1313   - },
1314   - "require": {
1315   - "kartik-v/yii2-krajee-base": "*"
1316   - },
1317   - "type": "yii2-extension",
1318   - "extra": {
1319   - "branch-alias": {
1320   - "dev-master": "1.0.x-dev"
1321   - }
1322   - },
1323   - "autoload": {
1324   - "psr-4": {
1325   - "kartik\\color\\": ""
1326   - }
1327   - },
1328   - "notification-url": "https://packagist.org/downloads/",
1329   - "license": [
1330   - "BSD 3-Clause"
1331   - ],
1332   - "authors": [
1333   - {
1334   - "name": "Kartik Visweswaran",
1335   - "email": "kartikv2@gmail.com",
1336   - "homepage": "http://www.krajee.com/"
1337   - }
1338   - ],
1339   - "description": "An enhanced Yii 2 widget encapsulating the HTML 5 color input (sub repo split from yii2-widgets)",
1340   - "homepage": "https://github.com/kartik-v/yii2-widget-colorinput",
1341   - "keywords": [
1342   - "HTML5",
1343   - "color",
1344   - "extension",
1345   - "form",
1346   - "input",
1347   - "jquery",
1348   - "plugin",
1349   - "widget",
1350   - "yii2"
1351   - ],
1352   - "time": "2016-02-02 14:28:12"
1353   - },
1354   - {
1355   - "name": "kartik-v/yii2-widget-datepicker",
1356   - "version": "dev-master",
1357   - "source": {
1358   - "type": "git",
1359   - "url": "https://github.com/kartik-v/yii2-widget-datepicker.git",
1360   - "reference": "3f7b38886e334a2c8c4262f155d98812461efd36"
1361   - },
1362   - "dist": {
1363   - "type": "zip",
1364   - "url": "https://api.github.com/repos/kartik-v/yii2-widget-datepicker/zipball/52606c8764a174aa0d5e6483ed811f617c74ee4e",
1365   - "reference": "3f7b38886e334a2c8c4262f155d98812461efd36",
1366   - "shasum": ""
1367   - },
1368   - "require": {
1369   - "kartik-v/yii2-krajee-base": "~1.7"
1370   - },
1371   - "type": "yii2-extension",
1372   - "extra": {
1373   - "branch-alias": {
1374   - "dev-master": "1.3.x-dev"
1375   - }
1376   - },
1377   - "autoload": {
1378   - "psr-4": {
1379   - "kartik\\date\\": ""
1380   - }
1381   - },
1382   - "notification-url": "https://packagist.org/downloads/",
1383   - "license": [
1384   - "BSD-3-Clause"
1385   - ],
1386   - "authors": [
1387   - {
1388   - "name": "Kartik Visweswaran",
1389   - "email": "kartikv2@gmail.com",
1390   - "homepage": "http://www.krajee.com/"
1391   - }
1392   - ],
1393   - "description": "Enhanced Yii2 wrapper for the bootstrap datepicker plugin (sub repo split from yii2-widgets).",
1394   - "homepage": "https://github.com/kartik-v/yii2-widget-datepicker",
1395   - "keywords": [
1396   - "date",
1397   - "extension",
1398   - "form",
1399   - "jquery",
1400   - "picker",
1401   - "plugin",
1402   - "select2",
1403   - "widget",
1404   - "yii2"
1405   - ],
1406   - "time": "2016-03-29 09:44:50"
1407   - },
1408   - {
1409   - "name": "kartik-v/yii2-widget-select2",
1410   - "version": "dev-master",
1411   - "source": {
1412   - "type": "git",
1413   - "url": "https://github.com/kartik-v/yii2-widget-select2.git",
1414   - "reference": "cb2a5992cb96bd2939e30ec1c76eba418d6a30af"
1415   - },
1416   - "dist": {
1417   - "type": "zip",
1418   - "url": "https://api.github.com/repos/kartik-v/yii2-widget-select2/zipball/cb2a5992cb96bd2939e30ec1c76eba418d6a30af",
1419   - "reference": "cb2a5992cb96bd2939e30ec1c76eba418d6a30af",
1420   - "shasum": ""
1421   - },
1422   - "require": {
1423   - "kartik-v/yii2-krajee-base": "~1.7"
1424   - },
1425   - "type": "yii2-extension",
1426   - "extra": {
1427   - "branch-alias": {
1428   - "dev-master": "2.0.x-dev"
1429   - }
1430   - },
1431   - "autoload": {
1432   - "psr-4": {
1433   - "kartik\\select2\\": ""
1434   - }
1435   - },
1436   - "notification-url": "https://packagist.org/downloads/",
1437   - "license": [
1438   - "BSD-3-Clause"
1439   - ],
1440   - "authors": [
1441   - {
1442   - "name": "Kartik Visweswaran",
1443   - "email": "kartikv2@gmail.com",
1444   - "homepage": "http://www.krajee.com/"
1445   - }
1446   - ],
1447   - "description": "Enhanced Yii2 wrapper for the Select2 jQuery plugin (sub repo split from yii2-widgets).",
1448   - "homepage": "https://github.com/kartik-v/yii2-widget-select2",
1449   - "keywords": [
1450   - "dropdown",
1451   - "extension",
1452   - "form",
1453   - "jquery",
1454   - "plugin",
1455   - "select2",
1456   - "widget",
1457   - "yii2"
1458   - ],
1459   - "time": "2016-03-10 11:33:59"
1460   - },
1461   - {
1462   - "name": "league/oauth2-client",
1463   - "version": "1.3.0",
1464   - "source": {
1465   - "type": "git",
1466   - "url": "https://github.com/thephpleague/oauth2-client.git",
1467   - "reference": "5e5c0bc5bd219515c8d8db8bcb61f19753101b7c"
1468   - },
1469   - "dist": {
1470   - "type": "zip",
1471   - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/5e5c0bc5bd219515c8d8db8bcb61f19753101b7c",
1472   - "reference": "5e5c0bc5bd219515c8d8db8bcb61f19753101b7c",
1473   - "shasum": ""
1474   - },
1475   - "require": {
1476   - "ext-curl": "*",
1477   - "guzzlehttp/guzzle": "~6.0",
1478   - "ircmaxell/random-lib": "~1.1",
1479   - "php": ">=5.5.0"
1480   - },
1481   - "require-dev": {
1482   - "jakub-onderka/php-parallel-lint": "0.8.*",
1483   - "mockery/mockery": "~0.9",
1484   - "phpunit/phpunit": "~4.0",
1485   - "satooshi/php-coveralls": "0.6.*",
1486   - "squizlabs/php_codesniffer": "~2.0"
1487   - },
1488   - "type": "library",
1489   - "extra": {
1490   - "branch-alias": {
1491   - "dev-master": "1.0.x-dev"
1492   - }
1493   - },
1494   - "autoload": {
1495   - "psr-4": {
1496   - "League\\OAuth2\\Client\\": "src/"
1497   - }
1498   - },
1499   - "notification-url": "https://packagist.org/downloads/",
1500   - "license": [
1501   - "MIT"
1502   - ],
1503   - "authors": [
1504   - {
1505   - "name": "Alex Bilbie",
1506   - "email": "hello@alexbilbie.com",
1507   - "homepage": "http://www.alexbilbie.com",
1508   - "role": "Developer"
1509   - }
1510   - ],
1511   - "description": "OAuth 2.0 Client Library",
1512   - "keywords": [
1513   - "Authentication",
1514   - "SSO",
1515   - "authorization",
1516   - "identity",
1517   - "idp",
1518   - "oauth",
1519   - "oauth2",
1520   - "single sign on"
1521   - ],
1522   - "time": "2016-02-13 20:18:03"
1523   - },
1524   - {
1525   - "name": "lusitanian/oauth",
1526   - "version": "v0.3.6",
1527   - "source": {
1528   - "type": "git",
1529   - "url": "https://github.com/Lusitanian/PHPoAuthLib.git",
1530   - "reference": "4ce8c488971410233eb3b1e6d9ac4e81debb41d5"
1531   - },
1532   - "dist": {
1533   - "type": "zip",
1534   - "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/4ce8c488971410233eb3b1e6d9ac4e81debb41d5",
1535   - "reference": "4ce8c488971410233eb3b1e6d9ac4e81debb41d5",
1536   - "shasum": ""
1537   - },
1538   - "require": {
1539   - "php": ">=5.3.0"
1540   - },
1541   - "require-dev": {
1542   - "phpunit/phpunit": "3.7.*",
1543   - "predis/predis": "0.8.*@dev",
1544   - "symfony/http-foundation": "~2.1"
1545   - },
1546   - "suggest": {
1547   - "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.",
1548   - "predis/predis": "Allows using the Redis storage backend.",
1549   - "symfony/http-foundation": "Allows using the Symfony Session storage backend."
1550   - },
1551   - "type": "library",
1552   - "extra": {
1553   - "branch-alias": {
1554   - "dev-master": "0.1-dev"
1555   - }
1556   - },
1557   - "autoload": {
1558   - "psr-0": {
1559   - "OAuth": "src",
1560   - "OAuth\\Unit": "tests"
1561   - }
1562   - },
1563   - "notification-url": "https://packagist.org/downloads/",
1564   - "license": [
1565   - "MIT"
1566   - ],
1567   - "authors": [
1568   - {
1569   - "name": "David Desberg",
1570   - "email": "david@daviddesberg.com"
1571   - },
1572   - {
1573   - "name": "Pieter Hordijk",
1574   - "email": "info@pieterhordijk.com"
1575   - }
1576   - ],
1577   - "description": "PHP 5.3+ oAuth 1/2 Library",
1578   - "keywords": [
1579   - "Authentication",
1580   - "authorization",
1581   - "oauth",
1582   - "security"
1583   - ],
1584   - "time": "2015-09-09 06:43:02"
1585   - },
1586   - {
1587   - "name": "mihaildev/yii2-ckeditor",
1588   - "version": "dev-master",
1589   - "source": {
1590   - "type": "git",
1591   - "url": "https://github.com/MihailDev/yii2-ckeditor.git",
1592   - "reference": "d20aa7f6bcf610fee226d6eb15212a279875bf87"
1593   - },
1594   - "dist": {
1595   - "type": "zip",
1596   - "url": "https://api.github.com/repos/MihailDev/yii2-ckeditor/zipball/d20aa7f6bcf610fee226d6eb15212a279875bf87",
1597   - "reference": "d20aa7f6bcf610fee226d6eb15212a279875bf87",
1598   - "shasum": ""
1599   - },
1600   - "require": {
1601   - "yiisoft/yii2": "*"
1602   - },
1603   - "type": "yii2-extension",
1604   - "extra": {
1605   - "asset-installer-paths": {
1606   - "npm-asset-library": "vendor/npm",
1607   - "bower-asset-library": "vendor/bower"
1608   - }
1609   - },
1610   - "autoload": {
1611   - "psr-4": {
1612   - "mihaildev\\ckeditor\\": ""
1613   - }
1614   - },
1615   - "notification-url": "https://packagist.org/downloads/",
1616   - "license": [
1617   - "BSD-3-Clause"
1618   - ],
1619   - "authors": [
1620   - {
1621   - "name": "Mihail",
1622   - "email": "mihail.kucher@gmail.com",
1623   - "homepage": "https://github.com/MihailDev",
1624   - "role": "Developer"
1625   - }
1626   - ],
1627   - "description": "Yii2 CKEditor",
1628   - "homepage": "https://github.com/MihailDev/yii2-ckeditor",
1629   - "keywords": [
1630   - "CKEditor",
1631   - "editor",
1632   - "wysiwyg",
1633   - "yii"
1634   - ],
1635   - "time": "2014-11-19 22:04:08"
1636   - },
1637   - {
1638   - "name": "mihaildev/yii2-elfinder",
1639   - "version": "1.1.3",
1640   - "source": {
1641   - "type": "git",
1642   - "url": "https://github.com/MihailDev/yii2-elfinder.git",
1643   - "reference": "64b42572dec94e5c2d0d1630bce8292848a98f4b"
1644   - },
1645   - "dist": {
1646   - "type": "zip",
1647   - "url": "https://api.github.com/repos/MihailDev/yii2-elfinder/zipball/64b42572dec94e5c2d0d1630bce8292848a98f4b",
1648   - "reference": "64b42572dec94e5c2d0d1630bce8292848a98f4b",
1649   - "shasum": ""
1650   - },
1651   - "require": {
1652   - "yiisoft/yii2-jui": "*"
1653   - },
1654   - "type": "yii2-extension",
1655   - "extra": {
1656   - "asset-installer-paths": {
1657   - "npm-asset-library": "vendor/npm",
1658   - "bower-asset-library": "vendor/bower"
1659   - }
1660   - },
1661   - "autoload": {
1662   - "psr-4": {
1663   - "mihaildev\\elfinder\\": ""
1664   - }
1665   - },
1666   - "notification-url": "https://packagist.org/downloads/",
1667   - "license": [
1668   - "BSD-3-Clause"
1669   - ],
1670   - "authors": [
1671   - {
1672   - "name": "Mihail",
1673   - "email": "mihail.kucher@gmail.com",
1674   - "homepage": "https://github.com/MihailDev",
1675   - "role": "Developer"
1676   - }
1677   - ],
1678   - "description": "Yii2 ElFinder",
1679   - "homepage": "https://github.com/MihailDev/yii2-elfinder",
1680   - "keywords": [
1681   - "elfinder",
1682   - "filemanager",
1683   - "yii"
1684   - ],
1685   - "time": "2015-07-03 07:08:52"
1686   - },
1687   - {
1688   - "name": "nodge/lightopenid",
1689   - "version": "1.1.2",
1690   - "source": {
1691   - "type": "git",
1692   - "url": "https://github.com/Nodge/LightOpenID.git",
1693   - "reference": "a5492cc0c932c557b7e9b54a6e5bbd85cc5fa041"
1694   - },
1695   - "dist": {
1696   - "type": "zip",
1697   - "url": "https://api.github.com/repos/Nodge/LightOpenID/zipball/a5492cc0c932c557b7e9b54a6e5bbd85cc5fa041",
1698   - "reference": "a5492cc0c932c557b7e9b54a6e5bbd85cc5fa041",
1699   - "shasum": ""
1700   - },
1701   - "require": {
1702   - "php": ">=5.2"
1703   - },
1704   - "type": "library",
1705   - "autoload": {
1706   - "classmap": [
1707   - "openid.php",
1708   - "provider/provider.php"
1709   - ]
1710   - },
1711   - "notification-url": "https://packagist.org/downloads/",
1712   - "license": [
1713   - "MIT License"
1714   - ],
1715   - "authors": [
1716   - {
1717   - "name": "Mewp",
1718   - "homepage": "http://code.google.com/p/lightopenid/"
1719   - },
1720   - {
1721   - "name": "Ignat Ignatov",
1722   - "homepage": "https://github.com/iignatov/LightOpenID"
1723   - }
1724   - ],
1725   - "description": "Lightweight PHP5 library for easy OpenID authentication.",
1726   - "homepage": "https://github.com/Nodge/LightOpenID",
1727   - "keywords": [
1728   - "Authentication",
1729   - "OpenId"
1730   - ],
1731   - "time": "2013-08-31 16:48:56"
1732   - },
1733   - {
1734   - "name": "nodge/yii2-eauth",
1735   - "version": "dev-master",
1736   - "source": {
1737   - "type": "git",
1738   - "url": "https://github.com/Nodge/yii2-eauth.git",
1739   - "reference": "f45efd95e3853db33153cc1b856d1f648d221938"
1740   - },
1741   - "dist": {
1742   - "type": "zip",
1743   - "url": "https://api.github.com/repos/Nodge/yii2-eauth/zipball/f45efd95e3853db33153cc1b856d1f648d221938",
1744   - "reference": "f45efd95e3853db33153cc1b856d1f648d221938",
1745   - "shasum": ""
1746   - },
1747   - "require": {
1748   - "lib-curl": "*",
1749   - "lusitanian/oauth": "~0.3.0",
1750   - "nodge/lightopenid": "~1.1.0",
1751   - "php": ">=5.4.0",
1752   - "yiisoft/yii2": "*"
1753   - },
1754   - "type": "yii2-extension",
1755   - "extra": {
1756   - "bootstrap": "nodge\\eauth\\Bootstrap"
1757   - },
1758   - "autoload": {
1759   - "psr-4": {
1760   - "nodge\\eauth\\": "src/"
1761   - }
1762   - },
1763   - "notification-url": "https://packagist.org/downloads/",
1764   - "license": [
1765   - "New BSD License"
1766   - ],
1767   - "authors": [
1768   - {
1769   - "name": "Maxim Zemskov",
1770   - "email": "nodge@yandex.ru",
1771   - "homepage": "http://nodge.ru/"
1772   - }
1773   - ],
1774   - "description": "Yii2 EAuth Extension. EAuth allows to authenticate users with accounts on other websites (Google, Facebook, Twitter, etc).",
1775   - "homepage": "https://github.com/Nodge/yii2-eauth",
1776   - "keywords": [
1777   - "Authentication",
1778   - "OpenId",
1779   - "eauth",
1780   - "extension",
1781   - "oauth",
1782   - "yii2"
1783   - ],
1784   - "time": "2016-01-13 18:15:48"
1785   - },
1786   - {
1787   - "name": "phpdocumentor/reflection-docblock",
1788   - "version": "2.0.4",
1789   - "source": {
1790   - "type": "git",
1791   - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
1792   - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
1793   - },
1794   - "dist": {
1795   - "type": "zip",
1796   - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
1797   - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
1798   - "shasum": ""
1799   - },
1800   - "require": {
1801   - "php": ">=5.3.3"
1802   - },
1803   - "require-dev": {
1804   - "phpunit/phpunit": "~4.0"
1805   - },
1806   - "suggest": {
1807   - "dflydev/markdown": "~1.0",
1808   - "erusev/parsedown": "~1.0"
1809   - },
1810   - "type": "library",
1811   - "extra": {
1812   - "branch-alias": {
1813   - "dev-master": "2.0.x-dev"
1814   - }
1815   - },
1816   - "autoload": {
1817   - "psr-0": {
1818   - "phpDocumentor": [
1819   - "src/"
1820   - ]
1821   - }
1822   - },
1823   - "notification-url": "https://packagist.org/downloads/",
1824   - "license": [
1825   - "MIT"
1826   - ],
1827   - "authors": [
1828   - {
1829   - "name": "Mike van Riel",
1830   - "email": "mike.vanriel@naenius.com"
1831   - }
1832   - ],
1833   - "time": "2015-02-03 12:10:50"
1834   - },
1835   - {
1836   - "name": "phpmailer/phpmailer",
1837   - "version": "5.4.x-dev",
1838   - "source": {
1839   - "type": "git",
1840   - "url": "https://github.com/PHPMailer/PHPMailer.git",
1841   - "reference": "3d4e3b1a0da0a33889f8b0b2afda6ad4f6d011b5"
1842   - },
1843   - "dist": {
1844   - "type": "zip",
1845   - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/3d4e3b1a0da0a33889f8b0b2afda6ad4f6d011b5",
1846   - "reference": "3d4e3b1a0da0a33889f8b0b2afda6ad4f6d011b5",
1847   - "shasum": ""
1848   - },
1849   - "require": {
1850   - "php": ">=5.5.0"
1851   - },
1852   - "require-dev": {
1853   - "phpdocumentor/phpdocumentor": "2.*",
1854   - "phpunit/phpunit": "4.*"
1855   - },
1856   - "suggest": {
1857   - "league/oauth2-client": "Needed for XOAUTH2 authentication"
1858   - },
1859   - "type": "library",
1860   - "autoload": {
1861   - "psr-4": {
1862   - "PHPMailer\\PHPMailer\\": "src/"
1863   - }
1864   - },
1865   - "notification-url": "https://packagist.org/downloads/",
1866   - "license": [
1867   - "LGPL-2.1"
1868   - ],
1869   - "authors": [
1870   - {
1871   - "name": "Jim Jagielski",
1872   - "email": "jimjag@gmail.com"
1873   - },
1874   - {
1875   - "name": "Marcus Bointon",
1876   - "email": "phpmailer@synchromedia.co.uk"
1877   - },
1878   - {
1879   - "name": "Andy Prevost",
1880   - "email": "codeworxtech@users.sourceforge.net"
1881   - },
1882   - {
1883   - "name": "Brent R. Matzelle"
1884   - }
1885   - ],
1886   - "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
1887   - "time": "2016-04-07 09:04:03"
1888   - },
1889   - {
1890   - "name": "phpspec/prophecy",
1891   - "version": "dev-master",
1892   - "source": {
1893   - "type": "git",
1894   - "url": "https://github.com/phpspec/prophecy.git",
1895   - "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d"
1896   - },
1897   - "dist": {
1898   - "type": "zip",
1899   - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b02221e42163be673f9b44a0bc92a8b4907a7c6d",
1900   - "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d",
1901   - "shasum": ""
1902   - },
1903   - "require": {
1904   - "doctrine/instantiator": "^1.0.2",
1905   - "php": "^5.3|^7.0",
1906   - "phpdocumentor/reflection-docblock": "~2.0",
1907   - "sebastian/comparator": "~1.1",
1908   - "sebastian/recursion-context": "~1.0"
1909   - },
1910   - "require-dev": {
1911   - "phpspec/phpspec": "~2.0"
1912   - },
1913   - "type": "library",
1914   - "extra": {
1915   - "branch-alias": {
1916   - "dev-master": "1.6.x-dev"
1917   - }
1918   - },
1919   - "autoload": {
1920   - "psr-0": {
1921   - "Prophecy\\": "src/"
1922   - }
1923   - },
1924   - "notification-url": "https://packagist.org/downloads/",
1925   - "license": [
1926   - "MIT"
1927   - ],
1928   - "authors": [
1929   - {
1930   - "name": "Konstantin Kudryashov",
1931   - "email": "ever.zet@gmail.com",
1932   - "homepage": "http://everzet.com"
1933   - },
1934   - {
1935   - "name": "Marcello Duarte",
1936   - "email": "marcello.duarte@gmail.com"
1937   - }
1938   - ],
1939   - "description": "Highly opinionated mocking framework for PHP 5.3+",
1940   - "homepage": "https://github.com/phpspec/prophecy",
1941   - "keywords": [
1942   - "Double",
1943   - "Dummy",
1944   - "fake",
1945   - "mock",
1946   - "spy",
1947   - "stub"
1948   - ],
1949   - "time": "2016-02-21 17:41:21"
1950   - },
1951   - {
1952   - "name": "phpunit/php-code-coverage",
1953   - "version": "2.2.x-dev",
1954   - "source": {
1955   - "type": "git",
1956   - "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1957   - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
1958   - },
1959   - "dist": {
1960   - "type": "zip",
1961   - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
1962   - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
1963   - "shasum": ""
1964   - },
1965   - "require": {
1966   - "php": ">=5.3.3",
1967   - "phpunit/php-file-iterator": "~1.3",
1968   - "phpunit/php-text-template": "~1.2",
1969   - "phpunit/php-token-stream": "~1.3",
1970   - "sebastian/environment": "^1.3.2",
1971   - "sebastian/version": "~1.0"
1972   - },
1973   - "require-dev": {
1974   - "ext-xdebug": ">=2.1.4",
1975   - "phpunit/phpunit": "~4"
1976   - },
1977   - "suggest": {
1978   - "ext-dom": "*",
1979   - "ext-xdebug": ">=2.2.1",
1980   - "ext-xmlwriter": "*"
1981   - },
1982   - "type": "library",
1983   - "extra": {
1984   - "branch-alias": {
1985   - "dev-master": "2.2.x-dev"
1986   - }
1987   - },
1988   - "autoload": {
1989   - "classmap": [
1990   - "src/"
1991   - ]
1992   - },
1993   - "notification-url": "https://packagist.org/downloads/",
1994   - "license": [
1995   - "BSD-3-Clause"
1996   - ],
1997   - "authors": [
1998   - {
1999   - "name": "Sebastian Bergmann",
2000   - "email": "sb@sebastian-bergmann.de",
2001   - "role": "lead"
2002   - }
2003   - ],
2004   - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
2005   - "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
2006   - "keywords": [
2007   - "coverage",
2008   - "testing",
2009   - "xunit"
2010   - ],
2011   - "time": "2015-10-06 15:47:00"
2012   - },
2013   - {
2014   - "name": "phpunit/php-file-iterator",
2015   - "version": "dev-master",
2016   - "source": {
2017   - "type": "git",
2018   - "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
2019   - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
2020   - },
2021   - "dist": {
2022   - "type": "zip",
2023   - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
2024   - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
2025   - "shasum": ""
2026   - },
2027   - "require": {
2028   - "php": ">=5.3.3"
2029   - },
2030   - "type": "library",
2031   - "extra": {
2032   - "branch-alias": {
2033   - "dev-master": "1.4.x-dev"
2034   - }
2035   - },
2036   - "autoload": {
2037   - "classmap": [
2038   - "src/"
2039   - ]
2040   - },
2041   - "notification-url": "https://packagist.org/downloads/",
2042   - "license": [
2043   - "BSD-3-Clause"
2044   - ],
2045   - "authors": [
2046   - {
2047   - "name": "Sebastian Bergmann",
2048   - "email": "sb@sebastian-bergmann.de",
2049   - "role": "lead"
2050   - }
2051   - ],
2052   - "description": "FilterIterator implementation that filters files based on a list of suffixes.",
2053   - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
2054   - "keywords": [
2055   - "filesystem",
2056   - "iterator"
2057   - ],
2058   - "time": "2015-06-21 13:08:43"
2059   - },
2060   - {
2061   - "name": "phpunit/php-text-template",
2062   - "version": "1.2.1",
2063   - "source": {
2064   - "type": "git",
2065   - "url": "https://github.com/sebastianbergmann/php-text-template.git",
2066   - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
2067   - },
2068   - "dist": {
2069   - "type": "zip",
2070   - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
2071   - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
2072   - "shasum": ""
2073   - },
2074   - "require": {
2075   - "php": ">=5.3.3"
2076   - },
2077   - "type": "library",
2078   - "autoload": {
2079   - "classmap": [
2080   - "src/"
2081   - ]
2082   - },
2083   - "notification-url": "https://packagist.org/downloads/",
2084   - "license": [
2085   - "BSD-3-Clause"
2086   - ],
2087   - "authors": [
2088   - {
2089   - "name": "Sebastian Bergmann",
2090   - "email": "sebastian@phpunit.de",
2091   - "role": "lead"
2092   - }
2093   - ],
2094   - "description": "Simple template engine.",
2095   - "homepage": "https://github.com/sebastianbergmann/php-text-template/",
2096   - "keywords": [
2097   - "template"
2098   - ],
2099   - "time": "2015-06-21 13:50:34"
2100   - },
2101   - {
2102   - "name": "phpunit/php-timer",
2103   - "version": "dev-master",
2104   - "source": {
2105   - "type": "git",
2106   - "url": "https://github.com/sebastianbergmann/php-timer.git",
2107   - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
2108   - },
2109   - "dist": {
2110   - "type": "zip",
2111   - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
2112   - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
2113   - "shasum": ""
2114   - },
2115   - "require": {
2116   - "php": ">=5.3.3"
2117   - },
2118   - "type": "library",
2119   - "autoload": {
2120   - "classmap": [
2121   - "src/"
2122   - ]
2123   - },
2124   - "notification-url": "https://packagist.org/downloads/",
2125   - "license": [
2126   - "BSD-3-Clause"
2127   - ],
2128   - "authors": [
2129   - {
2130   - "name": "Sebastian Bergmann",
2131   - "email": "sb@sebastian-bergmann.de",
2132   - "role": "lead"
2133   - }
2134   - ],
2135   - "description": "Utility class for timing",
2136   - "homepage": "https://github.com/sebastianbergmann/php-timer/",
2137   - "keywords": [
2138   - "timer"
2139   - ],
2140   - "time": "2015-06-21 08:01:12"
2141   - },
2142   - {
2143   - "name": "phpunit/php-token-stream",
2144   - "version": "dev-master",
2145   - "source": {
2146   - "type": "git",
2147   - "url": "https://github.com/sebastianbergmann/php-token-stream.git",
2148   - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644"
2149   - },
2150   - "dist": {
2151   - "type": "zip",
2152   - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644",
2153   - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644",
2154   - "shasum": ""
2155   - },
2156   - "require": {
2157   - "ext-tokenizer": "*",
2158   - "php": ">=5.3.3"
2159   - },
2160   - "require-dev": {
2161   - "phpunit/phpunit": "~4.2"
2162   - },
2163   - "type": "library",
2164   - "extra": {
2165   - "branch-alias": {
2166   - "dev-master": "1.4-dev"
2167   - }
2168   - },
2169   - "autoload": {
2170   - "classmap": [
2171   - "src/"
2172   - ]
2173   - },
2174   - "notification-url": "https://packagist.org/downloads/",
2175   - "license": [
2176   - "BSD-3-Clause"
2177   - ],
2178   - "authors": [
2179   - {
2180   - "name": "Sebastian Bergmann",
2181   - "email": "sebastian@phpunit.de"
2182   - }
2183   - ],
2184   - "description": "Wrapper around PHP's tokenizer extension.",
2185   - "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
2186   - "keywords": [
2187   - "tokenizer"
2188   - ],
2189   - "time": "2015-09-23 14:46:55"
2190   - },
2191   - {
2192   - "name": "phpunit/phpunit",
2193   - "version": "4.8.x-dev",
2194   - "source": {
2195   - "type": "git",
2196   - "url": "https://github.com/sebastianbergmann/phpunit.git",
2197   - "reference": "1a1b63266c046e1856fd03812a4e0ac2b51aa2d5"
2198   - },
2199   - "dist": {
2200   - "type": "zip",
2201   - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/496745aeba741e63b7149da3e1f712d441751182",
2202   - "reference": "1a1b63266c046e1856fd03812a4e0ac2b51aa2d5",
2203   - "shasum": ""
2204   - },
2205   - "require": {
2206   - "ext-dom": "*",
2207   - "ext-json": "*",
2208   - "ext-pcre": "*",
2209   - "ext-reflection": "*",
2210   - "ext-spl": "*",
2211   - "php": ">=5.3.3",
2212   - "phpspec/prophecy": "^1.3.1",
2213   - "phpunit/php-code-coverage": "~2.1",
2214   - "phpunit/php-file-iterator": "~1.4",
2215   - "phpunit/php-text-template": "~1.2",
2216   - "phpunit/php-timer": ">=1.0.6",
2217   - "phpunit/phpunit-mock-objects": "~2.3",
2218   - "sebastian/comparator": "~1.1",
2219   - "sebastian/diff": "~1.2",
2220   - "sebastian/environment": "~1.3",
2221   - "sebastian/exporter": "~1.2",
2222   - "sebastian/global-state": "~1.0",
2223   - "sebastian/version": "~1.0",
2224   - "symfony/yaml": "~2.1|~3.0"
2225   - },
2226   - "suggest": {
2227   - "phpunit/php-invoker": "~1.1"
2228   - },
2229   - "bin": [
2230   - "phpunit"
2231   - ],
2232   - "type": "library",
2233   - "extra": {
2234   - "branch-alias": {
2235   - "dev-master": "4.8.x-dev"
2236   - }
2237   - },
2238   - "autoload": {
2239   - "classmap": [
2240   - "src/"
2241   - ]
2242   - },
2243   - "notification-url": "https://packagist.org/downloads/",
2244   - "license": [
2245   - "BSD-3-Clause"
2246   - ],
2247   - "authors": [
2248   - {
2249   - "name": "Sebastian Bergmann",
2250   - "email": "sebastian@phpunit.de",
2251   - "role": "lead"
2252   - }
2253   - ],
2254   - "description": "The PHP Unit Testing framework.",
2255   - "homepage": "https://phpunit.de/",
2256   - "keywords": [
2257   - "phpunit",
2258   - "testing",
2259   - "xunit"
2260   - ],
2261   - "time": "2016-03-14 15:10:21"
2262   - },
2263   - {
2264   - "name": "phpunit/phpunit-mock-objects",
2265   - "version": "2.3.x-dev",
2266   - "source": {
2267   - "type": "git",
2268   - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
2269   - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
2270   - },
2271   - "dist": {
2272   - "type": "zip",
2273   - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
2274   - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
2275   - "shasum": ""
2276   - },
2277   - "require": {
2278   - "doctrine/instantiator": "^1.0.2",
2279   - "php": ">=5.3.3",
2280   - "phpunit/php-text-template": "~1.2",
2281   - "sebastian/exporter": "~1.2"
2282   - },
2283   - "require-dev": {
2284   - "phpunit/phpunit": "~4.4"
2285   - },
2286   - "suggest": {
2287   - "ext-soap": "*"
2288   - },
2289   - "type": "library",
2290   - "extra": {
2291   - "branch-alias": {
2292   - "dev-master": "2.3.x-dev"
2293   - }
2294   - },
2295   - "autoload": {
2296   - "classmap": [
2297   - "src/"
2298   - ]
2299   - },
2300   - "notification-url": "https://packagist.org/downloads/",
2301   - "license": [
2302   - "BSD-3-Clause"
2303   - ],
2304   - "authors": [
2305   - {
2306   - "name": "Sebastian Bergmann",
2307   - "email": "sb@sebastian-bergmann.de",
2308   - "role": "lead"
2309   - }
2310   - ],
2311   - "description": "Mock Object library for PHPUnit",
2312   - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
2313   - "keywords": [
2314   - "mock",
2315   - "xunit"
2316   - ],
2317   - "time": "2015-10-02 06:51:40"
2318   - },
2319   - {
2320   - "name": "psr/http-message",
2321   - "version": "dev-master",
2322   - "source": {
2323   - "type": "git",
2324   - "url": "https://github.com/php-fig/http-message.git",
2325   - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298"
2326   - },
2327   - "dist": {
2328   - "type": "zip",
2329   - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
2330   - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
2331   - "shasum": ""
2332   - },
2333   - "require": {
2334   - "php": ">=5.3.0"
2335   - },
2336   - "type": "library",
2337   - "extra": {
2338   - "branch-alias": {
2339   - "dev-master": "1.0.x-dev"
2340   - }
2341   - },
2342   - "autoload": {
2343   - "psr-4": {
2344   - "Psr\\Http\\Message\\": "src/"
2345   - }
2346   - },
2347   - "notification-url": "https://packagist.org/downloads/",
2348   - "license": [
2349   - "MIT"
2350   - ],
2351   - "authors": [
2352   - {
2353   - "name": "PHP-FIG",
2354   - "homepage": "http://www.php-fig.org/"
2355   - }
2356   - ],
2357   - "description": "Common interface for HTTP messages",
2358   - "keywords": [
2359   - "http",
2360   - "http-message",
2361   - "psr",
2362   - "psr-7",
2363   - "request",
2364   - "response"
2365   - ],
2366   - "time": "2015-05-04 20:22:00"
2367   - },
2368   - {
2369   - "name": "rmrevin/yii2-comments",
2370   - "version": "1.4.2",
2371   - "source": {
2372   - "type": "git",
2373   - "url": "https://github.com/rmrevin/yii2-comments.git",
2374   - "reference": "c68ddf276fe24ece0173781a8f7391a2cf7e6a12"
2375   - },
2376   - "dist": {
2377   - "type": "zip",
2378   - "url": "https://api.github.com/repos/rmrevin/yii2-comments/zipball/c68ddf276fe24ece0173781a8f7391a2cf7e6a12",
2379   - "reference": "c68ddf276fe24ece0173781a8f7391a2cf7e6a12",
2380   - "shasum": ""
2381   - },
2382   - "require": {
2383   - "php": ">=5.4.0",
2384   - "rmrevin/yii2-fontawesome": "~2.10",
2385   - "yiisoft/yii2": "2.0.*"
2386   - },
2387   - "type": "yii2-extension",
2388   - "extra": {
2389   - "asset-installer-paths": {
2390   - "npm-asset-library": "vendor/npm",
2391   - "bower-asset-library": "vendor/bower"
2392   - }
2393   - },
2394   - "autoload": {
2395   - "psr-4": {
2396   - "rmrevin\\yii\\module\\Comments\\": ""
2397   - }
2398   - },
2399   - "notification-url": "https://packagist.org/downloads/",
2400   - "license": [
2401   - "MIT"
2402   - ],
2403   - "authors": [
2404   - {
2405   - "name": "Roman Revin",
2406   - "email": "xgismox@gmail.com",
2407   - "homepage": "http://rmrevin.ru/"
2408   - }
2409   - ],
2410   - "description": "Comments module for Yii2",
2411   - "keywords": [
2412   - "comment",
2413   - "module",
2414   - "widget",
2415   - "yii"
2416   - ],
2417   - "time": "2016-03-01 13:18:41"
2418   - },
2419   - {
2420   - "name": "rmrevin/yii2-fontawesome",
2421   - "version": "2.13.0",
2422   - "source": {
2423   - "type": "git",
2424   - "url": "https://github.com/rmrevin/yii2-fontawesome.git",
2425   - "reference": "2efbfacb22be59f373d11a7e3dfa9213e2ba18a9"
2426   - },
2427   - "dist": {
2428   - "type": "zip",
2429   - "url": "https://api.github.com/repos/rmrevin/yii2-fontawesome/zipball/2efbfacb22be59f373d11a7e3dfa9213e2ba18a9",
2430   - "reference": "2efbfacb22be59f373d11a7e3dfa9213e2ba18a9",
2431   - "shasum": ""
2432   - },
2433   - "require": {
2434   - "bower-asset/fontawesome": "4.5.*",
2435   - "php": ">=5.4.0",
2436   - "yiisoft/yii2": "2.0.*"
2437   - },
2438   - "type": "yii2-extension",
2439   - "extra": {
2440   - "asset-installer-paths": {
2441   - "npm-asset-library": "vendor/npm",
2442   - "bower-asset-library": "vendor/bower"
2443   - }
2444   - },
2445   - "autoload": {
2446   - "psr-4": {
2447   - "rmrevin\\yii\\fontawesome\\": ""
2448   - }
2449   - },
2450   - "notification-url": "https://packagist.org/downloads/",
2451   - "license": [
2452   - "MIT"
2453   - ],
2454   - "authors": [
2455   - {
2456   - "name": "Revin Roman",
2457   - "email": "roman@rmrevin.com",
2458   - "homepage": "https://rmrevin.com/"
2459   - }
2460   - ],
2461   - "description": "Asset Bundle for Yii2 with Font Awesome",
2462   - "keywords": [
2463   - "asset",
2464   - "awesome",
2465   - "bundle",
2466   - "font",
2467   - "yii"
2468   - ],
2469   - "time": "2015-11-26 15:24:53"
2470   - },
2471   - {
2472   - "name": "sebastian/comparator",
2473   - "version": "dev-master",
2474   - "source": {
2475   - "type": "git",
2476   - "url": "https://github.com/sebastianbergmann/comparator.git",
2477   - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
2478   - },
2479   - "dist": {
2480   - "type": "zip",
2481   - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
2482   - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
2483   - "shasum": ""
2484   - },
2485   - "require": {
2486   - "php": ">=5.3.3",
2487   - "sebastian/diff": "~1.2",
2488   - "sebastian/exporter": "~1.2"
2489   - },
2490   - "require-dev": {
2491   - "phpunit/phpunit": "~4.4"
2492   - },
2493   - "type": "library",
2494   - "extra": {
2495   - "branch-alias": {
2496   - "dev-master": "1.2.x-dev"
2497   - }
2498   - },
2499   - "autoload": {
2500   - "classmap": [
2501   - "src/"
2502   - ]
2503   - },
2504   - "notification-url": "https://packagist.org/downloads/",
2505   - "license": [
2506   - "BSD-3-Clause"
2507   - ],
2508   - "authors": [
2509   - {
2510   - "name": "Jeff Welch",
2511   - "email": "whatthejeff@gmail.com"
2512   - },
2513   - {
2514   - "name": "Volker Dusch",
2515   - "email": "github@wallbash.com"
2516   - },
2517   - {
2518   - "name": "Bernhard Schussek",
2519   - "email": "bschussek@2bepublished.at"
2520   - },
2521   - {
2522   - "name": "Sebastian Bergmann",
2523   - "email": "sebastian@phpunit.de"
2524   - }
2525   - ],
2526   - "description": "Provides the functionality to compare PHP values for equality",
2527   - "homepage": "http://www.github.com/sebastianbergmann/comparator",
2528   - "keywords": [
2529   - "comparator",
2530   - "compare",
2531   - "equality"
2532   - ],
2533   - "time": "2015-07-26 15:48:44"
2534   - },
2535   - {
2536   - "name": "sebastian/diff",
2537   - "version": "dev-master",
2538   - "source": {
2539   - "type": "git",
2540   - "url": "https://github.com/sebastianbergmann/diff.git",
2541   - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
2542   - },
2543   - "dist": {
2544   - "type": "zip",
2545   - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
2546   - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
2547   - "shasum": ""
2548   - },
2549   - "require": {
2550   - "php": ">=5.3.3"
2551   - },
2552   - "require-dev": {
2553   - "phpunit/phpunit": "~4.8"
2554   - },
2555   - "type": "library",
2556   - "extra": {
2557   - "branch-alias": {
2558   - "dev-master": "1.4-dev"
2559   - }
2560   - },
2561   - "autoload": {
2562   - "classmap": [
2563   - "src/"
2564   - ]
2565   - },
2566   - "notification-url": "https://packagist.org/downloads/",
2567   - "license": [
2568   - "BSD-3-Clause"
2569   - ],
2570   - "authors": [
2571   - {
2572   - "name": "Kore Nordmann",
2573   - "email": "mail@kore-nordmann.de"
2574   - },
2575   - {
2576   - "name": "Sebastian Bergmann",
2577   - "email": "sebastian@phpunit.de"
2578   - }
2579   - ],
2580   - "description": "Diff implementation",
2581   - "homepage": "https://github.com/sebastianbergmann/diff",
2582   - "keywords": [
2583   - "diff"
2584   - ],
2585   - "time": "2015-12-08 07:14:41"
2586   - },
2587   - {
2588   - "name": "sebastian/environment",
2589   - "version": "dev-master",
2590   - "source": {
2591   - "type": "git",
2592   - "url": "https://github.com/sebastianbergmann/environment.git",
2593   - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf"
2594   - },
2595   - "dist": {
2596   - "type": "zip",
2597   - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf",
2598   - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf",
2599   - "shasum": ""
2600   - },
2601   - "require": {
2602   - "php": ">=5.3.3"
2603   - },
2604   - "require-dev": {
2605   - "phpunit/phpunit": "~4.4"
2606   - },
2607   - "type": "library",
2608   - "extra": {
2609   - "branch-alias": {
2610   - "dev-master": "1.3.x-dev"
2611   - }
2612   - },
2613   - "autoload": {
2614   - "classmap": [
2615   - "src/"
2616   - ]
2617   - },
2618   - "notification-url": "https://packagist.org/downloads/",
2619   - "license": [
2620   - "BSD-3-Clause"
2621   - ],
2622   - "authors": [
2623   - {
2624   - "name": "Sebastian Bergmann",
2625   - "email": "sebastian@phpunit.de"
2626   - }
2627   - ],
2628   - "description": "Provides functionality to handle HHVM/PHP environments",
2629   - "homepage": "http://www.github.com/sebastianbergmann/environment",
2630   - "keywords": [
2631   - "Xdebug",
2632   - "environment",
2633   - "hhvm"
2634   - ],
2635   - "time": "2016-02-26 18:40:46"
2636   - },
2637   - {
2638   - "name": "sebastian/exporter",
2639   - "version": "dev-master",
2640   - "source": {
2641   - "type": "git",
2642   - "url": "https://github.com/sebastianbergmann/exporter.git",
2643   - "reference": "f88f8936517d54ae6d589166810877fb2015d0a2"
2644   - },
2645   - "dist": {
2646   - "type": "zip",
2647   - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f88f8936517d54ae6d589166810877fb2015d0a2",
2648   - "reference": "f88f8936517d54ae6d589166810877fb2015d0a2",
2649   - "shasum": ""
2650   - },
2651   - "require": {
2652   - "php": ">=5.3.3",
2653   - "sebastian/recursion-context": "~1.0"
2654   - },
2655   - "require-dev": {
2656   - "ext-mbstring": "*",
2657   - "phpunit/phpunit": "~4.4"
2658   - },
2659   - "type": "library",
2660   - "extra": {
2661   - "branch-alias": {
2662   - "dev-master": "1.3.x-dev"
2663   - }
2664   - },
2665   - "autoload": {
2666   - "classmap": [
2667   - "src/"
2668   - ]
2669   - },
2670   - "notification-url": "https://packagist.org/downloads/",
2671   - "license": [
2672   - "BSD-3-Clause"
2673   - ],
2674   - "authors": [
2675   - {
2676   - "name": "Jeff Welch",
2677   - "email": "whatthejeff@gmail.com"
2678   - },
2679   - {
2680   - "name": "Volker Dusch",
2681   - "email": "github@wallbash.com"
2682   - },
2683   - {
2684   - "name": "Bernhard Schussek",
2685   - "email": "bschussek@2bepublished.at"
2686   - },
2687   - {
2688   - "name": "Sebastian Bergmann",
2689   - "email": "sebastian@phpunit.de"
2690   - },
2691   - {
2692   - "name": "Adam Harvey",
2693   - "email": "aharvey@php.net"
2694   - }
2695   - ],
2696   - "description": "Provides the functionality to export PHP variables for visualization",
2697   - "homepage": "http://www.github.com/sebastianbergmann/exporter",
2698   - "keywords": [
2699   - "export",
2700   - "exporter"
2701   - ],
2702   - "time": "2015-08-09 04:23:41"
2703   - },
2704   - {
2705   - "name": "sebastian/global-state",
2706   - "version": "1.1.1",
2707   - "source": {
2708   - "type": "git",
2709   - "url": "https://github.com/sebastianbergmann/global-state.git",
2710   - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
2711   - },
2712   - "dist": {
2713   - "type": "zip",
2714   - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
2715   - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
2716   - "shasum": ""
2717   - },
2718   - "require": {
2719   - "php": ">=5.3.3"
2720   - },
2721   - "require-dev": {
2722   - "phpunit/phpunit": "~4.2"
2723   - },
2724   - "suggest": {
2725   - "ext-uopz": "*"
2726   - },
2727   - "type": "library",
2728   - "extra": {
2729   - "branch-alias": {
2730   - "dev-master": "1.0-dev"
2731   - }
2732   - },
2733   - "autoload": {
2734   - "classmap": [
2735   - "src/"
2736   - ]
2737   - },
2738   - "notification-url": "https://packagist.org/downloads/",
2739   - "license": [
2740   - "BSD-3-Clause"
2741   - ],
2742   - "authors": [
2743   - {
2744   - "name": "Sebastian Bergmann",
2745   - "email": "sebastian@phpunit.de"
2746   - }
2747   - ],
2748   - "description": "Snapshotting of global state",
2749   - "homepage": "http://www.github.com/sebastianbergmann/global-state",
2750   - "keywords": [
2751   - "global state"
2752   - ],
2753   - "time": "2015-10-12 03:26:01"
2754   - },
2755   - {
2756   - "name": "sebastian/recursion-context",
2757   - "version": "dev-master",
2758   - "source": {
2759   - "type": "git",
2760   - "url": "https://github.com/sebastianbergmann/recursion-context.git",
2761   - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7"
2762   - },
2763   - "dist": {
2764   - "type": "zip",
2765   - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7",
2766   - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7",
2767   - "shasum": ""
2768   - },
2769   - "require": {
2770   - "php": ">=5.3.3"
2771   - },
2772   - "require-dev": {
2773   - "phpunit/phpunit": "~4.4"
2774   - },
2775   - "type": "library",
2776   - "extra": {
2777   - "branch-alias": {
2778   - "dev-master": "1.0.x-dev"
2779   - }
2780   - },
2781   - "autoload": {
2782   - "classmap": [
2783   - "src/"
2784   - ]
2785   - },
2786   - "notification-url": "https://packagist.org/downloads/",
2787   - "license": [
2788   - "BSD-3-Clause"
2789   - ],
2790   - "authors": [
2791   - {
2792   - "name": "Jeff Welch",
2793   - "email": "whatthejeff@gmail.com"
2794   - },
2795   - {
2796   - "name": "Sebastian Bergmann",
2797   - "email": "sebastian@phpunit.de"
2798   - },
2799   - {
2800   - "name": "Adam Harvey",
2801   - "email": "aharvey@php.net"
2802   - }
2803   - ],
2804   - "description": "Provides functionality to recursively process PHP variables",
2805   - "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2806   - "time": "2016-01-28 05:39:29"
2807   - },
2808   - {
2809   - "name": "sebastian/version",
2810   - "version": "1.0.6",
2811   - "source": {
2812   - "type": "git",
2813   - "url": "https://github.com/sebastianbergmann/version.git",
2814   - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
2815   - },
2816   - "dist": {
2817   - "type": "zip",
2818   - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
2819   - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
2820   - "shasum": ""
2821   - },
2822   - "type": "library",
2823   - "autoload": {
2824   - "classmap": [
2825   - "src/"
2826   - ]
2827   - },
2828   - "notification-url": "https://packagist.org/downloads/",
2829   - "license": [
2830   - "BSD-3-Clause"
2831   - ],
2832   - "authors": [
2833   - {
2834   - "name": "Sebastian Bergmann",
2835   - "email": "sebastian@phpunit.de",
2836   - "role": "lead"
2837   - }
2838   - ],
2839   - "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2840   - "homepage": "https://github.com/sebastianbergmann/version",
2841   - "time": "2015-06-21 13:59:46"
2842   - },
2843   - {
2844   - "name": "swiftmailer/swiftmailer",
2845   - "version": "5.x-dev",
2846   - "source": {
2847   - "type": "git",
2848   - "url": "https://github.com/swiftmailer/swiftmailer.git",
2849   - "reference": "fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9"
2850   - },
2851   - "dist": {
2852   - "type": "zip",
2853   - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9",
2854   - "reference": "fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9",
2855   - "shasum": ""
2856   - },
2857   - "require": {
2858   - "php": ">=5.3.3"
2859   - },
2860   - "require-dev": {
2861   - "mockery/mockery": "~0.9.1,<0.9.4"
2862   - },
2863   - "type": "library",
2864   - "extra": {
2865   - "branch-alias": {
2866   - "dev-master": "5.4-dev"
2867   - }
2868   - },
2869   - "autoload": {
2870   - "files": [
2871   - "lib/swift_required.php"
2872   - ]
2873   - },
2874   - "notification-url": "https://packagist.org/downloads/",
2875   - "license": [
2876   - "MIT"
2877   - ],
2878   - "authors": [
2879   - {
2880   - "name": "Chris Corbyn"
2881   - },
2882   - {
2883   - "name": "Fabien Potencier",
2884   - "email": "fabien@symfony.com"
2885   - }
2886   - ],
2887   - "description": "Swiftmailer, free feature-rich PHP mailer",
2888   - "homepage": "http://swiftmailer.org",
2889   - "keywords": [
2890   - "email",
2891   - "mail",
2892   - "mailer"
2893   - ],
2894   - "time": "2016-01-03 15:42:47"
2895   - },
2896   - {
2897   - "name": "symfony/browser-kit",
2898   - "version": "3.0.x-dev",
2899   - "source": {
2900   - "type": "git",
2901   - "url": "https://github.com/symfony/browser-kit.git",
2902   - "reference": "e07127ac31230b30887c2dddf3708d883d239b14"
2903   - },
2904   - "dist": {
2905   - "type": "zip",
2906   - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e07127ac31230b30887c2dddf3708d883d239b14",
2907   - "reference": "e07127ac31230b30887c2dddf3708d883d239b14",
2908   - "shasum": ""
2909   - },
2910   - "require": {
2911   - "php": ">=5.5.9",
2912   - "symfony/dom-crawler": "~2.8|~3.0"
2913   - },
2914   - "require-dev": {
2915   - "symfony/css-selector": "~2.8|~3.0",
2916   - "symfony/process": "~2.8|~3.0"
2917   - },
2918   - "suggest": {
2919   - "symfony/process": ""
2920   - },
2921   - "type": "library",
2922   - "extra": {
2923   - "branch-alias": {
2924   - "dev-master": "3.0-dev"
2925   - }
2926   - },
2927   - "autoload": {
2928   - "psr-4": {
2929   - "Symfony\\Component\\BrowserKit\\": ""
2930   - },
2931   - "exclude-from-classmap": [
2932   - "/Tests/"
2933   - ]
2934   - },
2935   - "notification-url": "https://packagist.org/downloads/",
2936   - "license": [
2937   - "MIT"
2938   - ],
2939   - "authors": [
2940   - {
2941   - "name": "Fabien Potencier",
2942   - "email": "fabien@symfony.com"
2943   - },
2944   - {
2945   - "name": "Symfony Community",
2946   - "homepage": "https://symfony.com/contributors"
2947   - }
2948   - ],
2949   - "description": "Symfony BrowserKit Component",
2950   - "homepage": "https://symfony.com",
2951   - "time": "2016-03-04 07:55:57"
2952   - },
2953   - {
2954   - "name": "symfony/console",
2955   - "version": "3.0.x-dev",
2956   - "source": {
2957   - "type": "git",
2958   - "url": "https://github.com/symfony/console.git",
2959   - "reference": "6b1175135bc2a74c08a28d89761272de8beed8cd"
2960   - },
2961   - "dist": {
2962   - "type": "zip",
2963   - "url": "https://api.github.com/repos/symfony/console/zipball/7541c505d2b804cc65a4edf90a6f1cb496523fef",
2964   - "reference": "6b1175135bc2a74c08a28d89761272de8beed8cd",
2965   - "shasum": ""
2966   - },
2967   - "require": {
2968   - "php": ">=5.5.9",
2969   - "symfony/polyfill-mbstring": "~1.0"
2970   - },
2971   - "require-dev": {
2972   - "psr/log": "~1.0",
2973   - "symfony/event-dispatcher": "~2.8|~3.0",
2974   - "symfony/process": "~2.8|~3.0"
2975   - },
2976   - "suggest": {
2977   - "psr/log": "For using the console logger",
2978   - "symfony/event-dispatcher": "",
2979   - "symfony/process": ""
2980   - },
2981   - "type": "library",
2982   - "extra": {
2983   - "branch-alias": {
2984   - "dev-master": "3.0-dev"
2985   - }
2986   - },
2987   - "autoload": {
2988   - "psr-4": {
2989   - "Symfony\\Component\\Console\\": ""
2990   - },
2991   - "exclude-from-classmap": [
2992   - "/Tests/"
2993   - ]
2994   - },
2995   - "notification-url": "https://packagist.org/downloads/",
2996   - "license": [
2997   - "MIT"
2998   - ],
2999   - "authors": [
3000   - {
3001   - "name": "Fabien Potencier",
3002   - "email": "fabien@symfony.com"
3003   - },
3004   - {
3005   - "name": "Symfony Community",
3006   - "homepage": "https://symfony.com/contributors"
3007   - }
3008   - ],
3009   - "description": "Symfony Console Component",
3010   - "homepage": "https://symfony.com",
3011   - "time": "2016-03-16 17:00:50"
3012   - },
3013   - {
3014   - "name": "symfony/css-selector",
3015   - "version": "3.0.x-dev",
3016   - "source": {
3017   - "type": "git",
3018   - "url": "https://github.com/symfony/css-selector.git",
3019   - "reference": "65e764f404685f2dc20c057e889b3ad04b2e2db0"
3020   - },
3021   - "dist": {
3022   - "type": "zip",
3023   - "url": "https://api.github.com/repos/symfony/css-selector/zipball/65e764f404685f2dc20c057e889b3ad04b2e2db0",
3024   - "reference": "65e764f404685f2dc20c057e889b3ad04b2e2db0",
3025   - "shasum": ""
3026   - },
3027   - "require": {
3028   - "php": ">=5.5.9"
3029   - },
3030   - "type": "library",
3031   - "extra": {
3032   - "branch-alias": {
3033   - "dev-master": "3.0-dev"
3034   - }
3035   - },
3036   - "autoload": {
3037   - "psr-4": {
3038   - "Symfony\\Component\\CssSelector\\": ""
3039   - },
3040   - "exclude-from-classmap": [
3041   - "/Tests/"
3042   - ]
3043   - },
3044   - "notification-url": "https://packagist.org/downloads/",
3045   - "license": [
3046   - "MIT"
3047   - ],
3048   - "authors": [
3049   - {
3050   - "name": "Jean-François Simon",
3051   - "email": "jeanfrancois.simon@sensiolabs.com"
3052   - },
3053   - {
3054   - "name": "Fabien Potencier",
3055   - "email": "fabien@symfony.com"
3056   - },
3057   - {
3058   - "name": "Symfony Community",
3059   - "homepage": "https://symfony.com/contributors"
3060   - }
3061   - ],
3062   - "description": "Symfony CssSelector Component",
3063   - "homepage": "https://symfony.com",
3064   - "time": "2016-03-04 07:55:57"
3065   - },
3066   - {
3067   - "name": "symfony/dom-crawler",
3068   - "version": "3.0.x-dev",
3069   - "source": {
3070   - "type": "git",
3071   - "url": "https://github.com/symfony/dom-crawler.git",
3072   - "reference": "18a06d7a9af41718c20764a674a0ebba3bc40d1f"
3073   - },
3074   - "dist": {
3075   - "type": "zip",
3076   - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/49b588841225b205700e5122fa01911cabada857",
3077   - "reference": "18a06d7a9af41718c20764a674a0ebba3bc40d1f",
3078   - "shasum": ""
3079   - },
3080   - "require": {
3081   - "php": ">=5.5.9",
3082   - "symfony/polyfill-mbstring": "~1.0"
3083   - },
3084   - "require-dev": {
3085   - "symfony/css-selector": "~2.8|~3.0"
3086   - },
3087   - "suggest": {
3088   - "symfony/css-selector": ""
3089   - },
3090   - "type": "library",
3091   - "extra": {
3092   - "branch-alias": {
3093   - "dev-master": "3.0-dev"
3094   - }
3095   - },
3096   - "autoload": {
3097   - "psr-4": {
3098   - "Symfony\\Component\\DomCrawler\\": ""
3099   - },
3100   - "exclude-from-classmap": [
3101   - "/Tests/"
3102   - ]
3103   - },
3104   - "notification-url": "https://packagist.org/downloads/",
3105   - "license": [
3106   - "MIT"
3107   - ],
3108   - "authors": [
3109   - {
3110   - "name": "Fabien Potencier",
3111   - "email": "fabien@symfony.com"
3112   - },
3113   - {
3114   - "name": "Symfony Community",
3115   - "homepage": "https://symfony.com/contributors"
3116   - }
3117   - ],
3118   - "description": "Symfony DomCrawler Component",
3119   - "homepage": "https://symfony.com",
3120   - "time": "2016-03-23 13:23:25"
3121   - },
3122   - {
3123   - "name": "symfony/event-dispatcher",
3124   - "version": "3.0.x-dev",
3125   - "source": {
3126   - "type": "git",
3127   - "url": "https://github.com/symfony/event-dispatcher.git",
3128   - "reference": "9002dcf018d884d294b1ef20a6f968efc1128f39"
3129   - },
3130   - "dist": {
3131   - "type": "zip",
3132   - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/17b04e6b1ede45b57d3ad5146abe50df6c3968b4",
3133   - "reference": "9002dcf018d884d294b1ef20a6f968efc1128f39",
3134   - "shasum": ""
3135   - },
3136   - "require": {
3137   - "php": ">=5.5.9"
3138   - },
3139   - "require-dev": {
3140   - "psr/log": "~1.0",
3141   - "symfony/config": "~2.8|~3.0",
3142   - "symfony/dependency-injection": "~2.8|~3.0",
3143   - "symfony/expression-language": "~2.8|~3.0",
3144   - "symfony/stopwatch": "~2.8|~3.0"
3145   - },
3146   - "suggest": {
3147   - "symfony/dependency-injection": "",
3148   - "symfony/http-kernel": ""
3149   - },
3150   - "type": "library",
3151   - "extra": {
3152   - "branch-alias": {
3153   - "dev-master": "3.0-dev"
3154   - }
3155   - },
3156   - "autoload": {
3157   - "psr-4": {
3158   - "Symfony\\Component\\EventDispatcher\\": ""
3159   - },
3160   - "exclude-from-classmap": [
3161   - "/Tests/"
3162   - ]
3163   - },
3164   - "notification-url": "https://packagist.org/downloads/",
3165   - "license": [
3166   - "MIT"
3167   - ],
3168   - "authors": [
3169   - {
3170   - "name": "Fabien Potencier",
3171   - "email": "fabien@symfony.com"
3172   - },
3173   - {
3174   - "name": "Symfony Community",
3175   - "homepage": "https://symfony.com/contributors"
3176   - }
3177   - ],
3178   - "description": "Symfony EventDispatcher Component",
3179   - "homepage": "https://symfony.com",
3180   - "time": "2016-03-10 10:34:12"
3181   - },
3182   - {
3183   - "name": "symfony/finder",
3184   - "version": "3.0.x-dev",
3185   - "source": {
3186   - "type": "git",
3187   - "url": "https://github.com/symfony/finder.git",
3188   - "reference": "c54e407b35bc098916704e9fd090da21da4c4f52"
3189   - },
3190   - "dist": {
3191   - "type": "zip",
3192   - "url": "https://api.github.com/repos/symfony/finder/zipball/c54e407b35bc098916704e9fd090da21da4c4f52",
3193   - "reference": "c54e407b35bc098916704e9fd090da21da4c4f52",
3194   - "shasum": ""
3195   - },
3196   - "require": {
3197   - "php": ">=5.5.9"
3198   - },
3199   - "type": "library",
3200   - "extra": {
3201   - "branch-alias": {
3202   - "dev-master": "3.0-dev"
3203   - }
3204   - },
3205   - "autoload": {
3206   - "psr-4": {
3207   - "Symfony\\Component\\Finder\\": ""
3208   - },
3209   - "exclude-from-classmap": [
3210   - "/Tests/"
3211   - ]
3212   - },
3213   - "notification-url": "https://packagist.org/downloads/",
3214   - "license": [
3215   - "MIT"
3216   - ],
3217   - "authors": [
3218   - {
3219   - "name": "Fabien Potencier",
3220   - "email": "fabien@symfony.com"
3221   - },
3222   - {
3223   - "name": "Symfony Community",
3224   - "homepage": "https://symfony.com/contributors"
3225   - }
3226   - ],
3227   - "description": "Symfony Finder Component",
3228   - "homepage": "https://symfony.com",
3229   - "time": "2016-03-10 11:13:05"
3230   - },
3231   - {
3232   - "name": "symfony/polyfill-mbstring",
3233   - "version": "dev-master",
3234   - "source": {
3235   - "type": "git",
3236   - "url": "https://github.com/symfony/polyfill-mbstring.git",
3237   - "reference": "1289d16209491b584839022f29257ad859b8532d"
3238   - },
3239   - "dist": {
3240   - "type": "zip",
3241   - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d",
3242   - "reference": "1289d16209491b584839022f29257ad859b8532d",
3243   - "shasum": ""
3244   - },
3245   - "require": {
3246   - "php": ">=5.3.3"
3247   - },
3248   - "suggest": {
3249   - "ext-mbstring": "For best performance"
3250   - },
3251   - "type": "library",
3252   - "extra": {
3253   - "branch-alias": {
3254   - "dev-master": "1.1-dev"
3255   - }
3256   - },
3257   - "autoload": {
3258   - "psr-4": {
3259   - "Symfony\\Polyfill\\Mbstring\\": ""
3260   - },
3261   - "files": [
3262   - "bootstrap.php"
3263   - ]
3264   - },
3265   - "notification-url": "https://packagist.org/downloads/",
3266   - "license": [
3267   - "MIT"
3268   - ],
3269   - "authors": [
3270   - {
3271   - "name": "Nicolas Grekas",
3272   - "email": "p@tchwork.com"
3273   - },
3274   - {
3275   - "name": "Symfony Community",
3276   - "homepage": "https://symfony.com/contributors"
3277   - }
3278   - ],
3279   - "description": "Symfony polyfill for the Mbstring extension",
3280   - "homepage": "https://symfony.com",
3281   - "keywords": [
3282   - "compatibility",
3283   - "mbstring",
3284   - "polyfill",
3285   - "portable",
3286   - "shim"
3287   - ],
3288   - "time": "2016-01-20 09:13:37"
3289   - },
3290   - {
3291   - "name": "symfony/yaml",
3292   - "version": "3.0.x-dev",
3293   - "source": {
3294   - "type": "git",
3295   - "url": "https://github.com/symfony/yaml.git",
3296   - "reference": "0047c8366744a16de7516622c5b7355336afae96"
3297   - },
3298   - "dist": {
3299   - "type": "zip",
3300   - "url": "https://api.github.com/repos/symfony/yaml/zipball/0047c8366744a16de7516622c5b7355336afae96",
3301   - "reference": "0047c8366744a16de7516622c5b7355336afae96",
3302   - "shasum": ""
3303   - },
3304   - "require": {
3305   - "php": ">=5.5.9"
3306   - },
3307   - "type": "library",
3308   - "extra": {
3309   - "branch-alias": {
3310   - "dev-master": "3.0-dev"
3311   - }
3312   - },
3313   - "autoload": {
3314   - "psr-4": {
3315   - "Symfony\\Component\\Yaml\\": ""
3316   - },
3317   - "exclude-from-classmap": [
3318   - "/Tests/"
3319   - ]
3320   - },
3321   - "notification-url": "https://packagist.org/downloads/",
3322   - "license": [
3323   - "MIT"
3324   - ],
3325   - "authors": [
3326   - {
3327   - "name": "Fabien Potencier",
3328   - "email": "fabien@symfony.com"
3329   - },
3330   - {
3331   - "name": "Symfony Community",
3332   - "homepage": "https://symfony.com/contributors"
3333   - }
3334   - ],
3335   - "description": "Symfony Yaml Component",
3336   - "homepage": "https://symfony.com",
3337   - "time": "2016-03-04 07:55:57"
3338   - },
3339   - {
3340   - "name": "unclead/yii2-multiple-input",
3341   - "version": "1.2.12",
3342   - "source": {
3343   - "type": "git",
3344   - "url": "https://github.com/unclead/yii2-multiple-input.git",
3345   - "reference": "3fd9a3ab9b7d11951f6aa708ba13406868e537fd"
3346   - },
3347   - "dist": {
3348   - "type": "zip",
3349   - "url": "https://api.github.com/repos/unclead/yii2-multiple-input/zipball/3fd9a3ab9b7d11951f6aa708ba13406868e537fd",
3350   - "reference": "3fd9a3ab9b7d11951f6aa708ba13406868e537fd",
3351   - "shasum": ""
3352   - },
3353   - "require": {
3354   - "php": ">=5.4.0",
3355   - "yiisoft/yii2": "*"
3356   - },
3357   - "type": "yii2-extension",
3358   - "autoload": {
3359   - "psr-4": {
3360   - "unclead\\widgets\\examples\\": "examples/",
3361   - "unclead\\widgets\\": "src/"
3362   - }
3363   - },
3364   - "notification-url": "https://packagist.org/downloads/",
3365   - "license": [
3366   - "BSD-3-Clause"
3367   - ],
3368   - "authors": [
3369   - {
3370   - "name": "Eugene Tupikov",
3371   - "email": "unclead.nsk@gmail.com"
3372   - }
3373   - ],
3374   - "description": "Widget for handle multiple inputs for an attribute of Yii2 framework model",
3375   - "keywords": [
3376   - "yii2",
3377   - "yii2 array input",
3378   - "yii2 multiple field",
3379   - "yii2 multiple input",
3380   - "yii2 tabular input"
3381   - ],
3382   - "time": "2016-03-09 09:01:35"
3383   - },
3384   - {
3385   - "name": "yiisoft/yii2",
3386   - "version": "dev-master",
3387   - "source": {
3388   - "type": "git",
3389   - "url": "https://github.com/yiisoft/yii2-framework.git",
3390   - "reference": "bcc317666439a8ec1dc28874e0577b860b6dd6b3"
3391   - },
3392   - "dist": {
3393   - "type": "zip",
3394   - "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/b7e62df2cfa1dfab4e70223770a99c3798d4a412",
3395   - "reference": "bcc317666439a8ec1dc28874e0577b860b6dd6b3",
3396   - "shasum": ""
3397   - },
3398   - "require": {
3399   - "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable",
3400   - "bower-asset/jquery.inputmask": "~3.2.2",
3401   - "bower-asset/punycode": "1.3.*",
3402   - "bower-asset/yii2-pjax": "~2.0.1",
3403   - "cebe/markdown": "~1.0.0 | ~1.1.0",
3404   - "ext-ctype": "*",
3405   - "ext-mbstring": "*",
3406   - "ezyang/htmlpurifier": "~4.6",
3407   - "lib-pcre": "*",
3408   - "php": ">=5.4.0",
3409   - "yiisoft/yii2-composer": "~2.0.4"
3410   - },
3411   - "bin": [
3412   - "yii"
3413   - ],
3414   - "type": "library",
3415   - "extra": {
3416   - "branch-alias": {
3417   - "dev-master": "2.0.x-dev"
3418   - }
3419   - },
3420   - "autoload": {
3421   - "psr-4": {
3422   - "yii\\": ""
3423   - }
3424   - },
3425   - "notification-url": "https://packagist.org/downloads/",
3426   - "license": [
3427   - "BSD-3-Clause"
3428   - ],
3429   - "authors": [
3430   - {
3431   - "name": "Qiang Xue",
3432   - "email": "qiang.xue@gmail.com",
3433   - "homepage": "http://www.yiiframework.com/",
3434   - "role": "Founder and project lead"
3435   - },
3436   - {
3437   - "name": "Alexander Makarov",
3438   - "email": "sam@rmcreative.ru",
3439   - "homepage": "http://rmcreative.ru/",
3440   - "role": "Core framework development"
3441   - },
3442   - {
3443   - "name": "Maurizio Domba",
3444   - "homepage": "http://mdomba.info/",
3445   - "role": "Core framework development"
3446   - },
3447   - {
3448   - "name": "Carsten Brandt",
3449   - "email": "mail@cebe.cc",
3450   - "homepage": "http://cebe.cc/",
3451   - "role": "Core framework development"
3452   - },
3453   - {
3454   - "name": "Timur Ruziev",
3455   - "email": "resurtm@gmail.com",
3456   - "homepage": "http://resurtm.com/",
3457   - "role": "Core framework development"
3458   - },
3459   - {
3460   - "name": "Paul Klimov",
3461   - "email": "klimov.paul@gmail.com",
3462   - "role": "Core framework development"
3463   - },
3464   - {
3465   - "name": "Dmitry Naumenko",
3466   - "email": "d.naumenko.a@gmail.com",
3467   - "role": "Core framework development"
3468   - }
3469   - ],
3470   - "description": "Yii PHP Framework Version 2",
3471   - "homepage": "http://www.yiiframework.com/",
3472   - "keywords": [
3473   - "framework",
3474   - "yii2"
3475   - ],
3476   - "time": "2016-03-30 14:53:41"
3477   - },
3478   - {
3479   - "name": "yiisoft/yii2-bootstrap",
3480   - "version": "dev-master",
3481   - "source": {
3482   - "type": "git",
3483   - "url": "https://github.com/yiisoft/yii2-bootstrap.git",
3484   - "reference": "4dd9f52e2a376a875d998de6ab4c381291b0c69e"
3485   - },
3486   - "dist": {
3487   - "type": "zip",
3488   - "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/772b610ea7940059584f9220f7b87e4b2b1a0e78",
3489   - "reference": "4dd9f52e2a376a875d998de6ab4c381291b0c69e",
3490   - "shasum": ""
3491   - },
3492   - "require": {
3493   - "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*",
3494   - "yiisoft/yii2": ">=2.0.6"
3495   - },
3496   - "type": "yii2-extension",
3497   - "extra": {
3498   - "branch-alias": {
3499   - "dev-master": "2.0.x-dev"
3500   - },
3501   - "asset-installer-paths": {
3502   - "npm-asset-library": "vendor/npm",
3503   - "bower-asset-library": "vendor/bower"
3504   - }
3505   - },
3506   - "autoload": {
3507   - "psr-4": {
3508   - "yii\\bootstrap\\": ""
3509   - }
3510   - },
3511   - "notification-url": "https://packagist.org/downloads/",
3512   - "license": [
3513   - "BSD-3-Clause"
3514   - ],
3515   - "authors": [
3516   - {
3517   - "name": "Qiang Xue",
3518   - "email": "qiang.xue@gmail.com"
3519   - }
3520   - ],
3521   - "description": "The Twitter Bootstrap extension for the Yii framework",
3522   - "keywords": [
3523   - "bootstrap",
3524   - "yii2"
3525   - ],
3526   - "time": "2016-03-30 22:44:25"
3527   - },
3528   - {
3529   - "name": "yiisoft/yii2-composer",
3530   - "version": "dev-master",
3531   - "source": {
3532   - "type": "git",
3533   - "url": "https://github.com/yiisoft/yii2-composer.git",
3534   - "reference": "348122de0b2c2e343b579f93fcda1da78cab4912"
3535   - },
3536   - "dist": {
3537   - "type": "zip",
3538   - "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/f5fe6ba58dbc92b37daed5d9bd94cda777852ee4",
3539   - "reference": "348122de0b2c2e343b579f93fcda1da78cab4912",
3540   - "shasum": ""
3541   - },
3542   - "require": {
3543   - "composer-plugin-api": "^1.0"
3544   - },
3545   - "type": "composer-plugin",
3546   - "extra": {
3547   - "class": "yii\\composer\\Plugin",
3548   - "branch-alias": {
3549   - "dev-master": "2.0.x-dev"
3550   - }
3551   - },
3552   - "autoload": {
3553   - "psr-4": {
3554   - "yii\\composer\\": ""
3555   - }
3556   - },
3557   - "notification-url": "https://packagist.org/downloads/",
3558   - "license": [
3559   - "BSD-3-Clause"
3560   - ],
3561   - "authors": [
3562   - {
3563   - "name": "Qiang Xue",
3564   - "email": "qiang.xue@gmail.com"
3565   - }
3566   - ],
3567   - "description": "The composer plugin for Yii extension installer",
3568   - "keywords": [
3569   - "composer",
3570   - "extension installer",
3571   - "yii2"
3572   - ],
3573   - "time": "2016-03-21 19:11:44"
3574   - },
3575   - {
3576   - "name": "yiisoft/yii2-imagine",
3577   - "version": "dev-master",
3578   - "source": {
3579   - "type": "git",
3580   - "url": "https://github.com/yiisoft/yii2-imagine.git",
3581   - "reference": "a6c34ef6b69fb4670ba987ce4b9cfdb2131a8b99"
3582   - },
3583   - "dist": {
3584   - "type": "zip",
3585   - "url": "https://api.github.com/repos/yiisoft/yii2-imagine/zipball/3be1ecc324aa156a97f03e3fc59045c8d61be1f8",
3586   - "reference": "a6c34ef6b69fb4670ba987ce4b9cfdb2131a8b99",
3587   - "shasum": ""
3588   - },
3589   - "require": {
3590   - "imagine/imagine": "0.5.*",
3591   - "yiisoft/yii2": "*"
3592   - },
3593   - "type": "yii2-extension",
3594   - "extra": {
3595   - "branch-alias": {
3596   - "dev-master": "2.0.x-dev"
3597   - }
3598   - },
3599   - "autoload": {
3600   - "psr-4": {
3601   - "yii\\imagine\\": ""
3602   - }
3603   - },
3604   - "notification-url": "https://packagist.org/downloads/",
3605   - "license": [
3606   - "BSD-3-Clause"
3607   - ],
3608   - "authors": [
3609   - {
3610   - "name": "Antonio Ramirez",
3611   - "email": "amigo.cobos@gmail.com"
3612   - }
3613   - ],
3614   - "description": "The Imagine integration for the Yii framework",
3615   - "keywords": [
3616   - "helper",
3617   - "image",
3618   - "imagine",
3619   - "yii2"
3620   - ],
3621   - "time": "2016-03-21 19:13:31"
3622   - },
3623   - {
3624   - "name": "yiisoft/yii2-jui",
3625   - "version": "dev-master",
3626   - "source": {
3627   - "type": "git",
3628   - "url": "https://github.com/yiisoft/yii2-jui.git",
3629   - "reference": "69cd9763b4807dbbce367d599dc615c5b8a8ef4f"
3630   - },
3631   - "dist": {
3632   - "type": "zip",
3633   - "url": "https://api.github.com/repos/yiisoft/yii2-jui/zipball/9ab9a2cb17cd7f13921339e11e5146295cf39083",
3634   - "reference": "69cd9763b4807dbbce367d599dc615c5b8a8ef4f",
3635   - "shasum": ""
3636   - },
3637   - "require": {
3638   - "bower-asset/jquery-ui": "1.11.*@stable",
3639   - "yiisoft/yii2": ">=2.0.4"
3640   - },
3641   - "type": "yii2-extension",
3642   - "extra": {
3643   - "branch-alias": {
3644   - "dev-master": "2.0.x-dev"
3645   - },
3646   - "asset-installer-paths": {
3647   - "npm-asset-library": "vendor/npm",
3648   - "bower-asset-library": "vendor/bower"
3649   - }
3650   - },
3651   - "autoload": {
3652   - "psr-4": {
3653   - "yii\\jui\\": ""
3654   - }
3655   - },
3656   - "notification-url": "https://packagist.org/downloads/",
3657   - "license": [
3658   - "BSD-3-Clause"
3659   - ],
3660   - "authors": [
3661   - {
3662   - "name": "Qiang Xue",
3663   - "email": "qiang.xue@gmail.com"
3664   - }
3665   - ],
3666   - "description": "The Jquery UI extension for the Yii framework",
3667   - "keywords": [
3668   - "jQuery UI",
3669   - "yii2"
3670   - ],
3671   - "time": "2016-03-29 21:32:13"
3672   - },
3673   - {
3674   - "name": "yiisoft/yii2-swiftmailer",
3675   - "version": "dev-master",
3676   - "source": {
3677   - "type": "git",
3678   - "url": "https://github.com/yiisoft/yii2-swiftmailer.git",
3679   - "reference": "20775fef1047cd927908270a8d7983580304eb57"
3680   - },
3681   - "dist": {
3682   - "type": "zip",
3683   - "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/163b9c6273e133c43a596aef46a9f5b1537731f9",
3684   - "reference": "20775fef1047cd927908270a8d7983580304eb57",
3685   - "shasum": ""
3686   - },
3687   - "require": {
3688   - "swiftmailer/swiftmailer": "~5.0",
3689   - "yiisoft/yii2": ">=2.0.4"
3690   - },
3691   - "type": "yii2-extension",
3692   - "extra": {
3693   - "branch-alias": {
3694   - "dev-master": "2.0.x-dev"
3695   - }
3696   - },
3697   - "autoload": {
3698   - "psr-4": {
3699   - "yii\\swiftmailer\\": ""
3700   - }
3701   - },
3702   - "notification-url": "https://packagist.org/downloads/",
3703   - "license": [
3704   - "BSD-3-Clause"
3705   - ],
3706   - "authors": [
3707   - {
3708   - "name": "Paul Klimov",
3709   - "email": "klimov.paul@gmail.com"
3710   - }
3711   - ],
3712   - "description": "The SwiftMailer integration for the Yii framework",
3713   - "keywords": [
3714   - "email",
3715   - "mail",
3716   - "mailer",
3717   - "swift",
3718   - "swiftmailer",
3719   - "yii2"
3720   - ],
3721   - "time": "2016-03-21 19:16:09"
3722   - }
3723   - ],
3724   - "packages-dev": [
3725   - {
3726   - "name": "bower-asset/typeahead.js",
3727   - "version": "v0.11.1",
3728   - "source": {
3729   - "type": "git",
3730   - "url": "https://github.com/twitter/typeahead.js.git",
3731   - "reference": "588440f66559714280628a4f9799f0c4eb880a4a"
3732   - },
3733   - "dist": {
3734   - "type": "zip",
3735   - "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/588440f66559714280628a4f9799f0c4eb880a4a",
3736   - "reference": "588440f66559714280628a4f9799f0c4eb880a4a",
3737   - "shasum": ""
3738   - },
3739   - "require": {
3740   - "bower-asset/jquery": ">=1.7"
3741   - },
3742   - "require-dev": {
3743   - "bower-asset/jasmine-ajax": "~1.3.1",
3744   - "bower-asset/jasmine-jquery": "~1.5.2",
3745   - "bower-asset/jquery": "~1.7"
3746   - },
3747   - "type": "bower-asset-library",
3748   - "extra": {
3749   - "bower-asset-main": "dist/typeahead.bundle.js"
3750   - }
3751   - },
3752   - {
3753   - "name": "fzaninotto/faker",
3754   - "version": "dev-master",
3755   - "source": {
3756   - "type": "git",
3757   - "url": "https://github.com/fzaninotto/Faker.git",
3758   - "reference": "8deb6343c80c4edf546a6fff01a2b05c7dc59ac4"
3759   - },
3760   - "dist": {
3761   - "type": "zip",
3762   - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/1c33e894fbbad6cf65bd42871719cd33227ed6a7",
3763   - "reference": "8deb6343c80c4edf546a6fff01a2b05c7dc59ac4",
3764   - "shasum": ""
3765   - },
3766   - "require": {
3767   - "php": ">=5.3.3"
3768   - },
3769   - "require-dev": {
3770   - "ext-intl": "*",
3771   - "phpunit/phpunit": "~4.0",
3772   - "squizlabs/php_codesniffer": "~1.5"
3773   - },
3774   - "type": "library",
3775   - "extra": {
3776   - "branch-alias": {
3777   - "dev-master": "1.6.x-dev"
3778   - }
3779   - },
3780   - "autoload": {
3781   - "psr-4": {
3782   - "Faker\\": "src/Faker/"
3783   - }
3784   - },
3785   - "notification-url": "https://packagist.org/downloads/",
3786   - "license": [
3787   - "MIT"
3788   - ],
3789   - "authors": [
3790   - {
3791   - "name": "François Zaninotto"
3792   - }
3793   - ],
3794   - "description": "Faker is a PHP library that generates fake data for you.",
3795   - "keywords": [
3796   - "data",
3797   - "faker",
3798   - "fixtures"
3799   - ],
3800   - "time": "2016-03-29 16:49:43"
3801   - },
3802   - {
3803   - "name": "phpspec/php-diff",
3804   - "version": "dev-master",
3805   - "source": {
3806   - "type": "git",
3807   - "url": "https://github.com/phpspec/php-diff.git",
3808   - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a"
3809   - },
3810   - "dist": {
3811   - "type": "zip",
3812   - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a",
3813   - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a",
3814   - "shasum": ""
3815   - },
3816   - "type": "library",
3817   - "autoload": {
3818   - "psr-0": {
3819   - "Diff": "lib/"
3820   - }
3821   - },
3822   - "notification-url": "https://packagist.org/downloads/",
3823   - "license": [
3824   - "BSD-3-Clause"
3825   - ],
3826   - "authors": [
3827   - {
3828   - "name": "Chris Boulton",
3829   - "homepage": "http://github.com/chrisboulton",
3830   - "role": "Original developer"
3831   - }
3832   - ],
3833   - "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).",
3834   - "time": "2013-11-01 13:02:21"
3835   - },
3836   - {
3837   - "name": "yiisoft/yii2-codeception",
3838   - "version": "dev-master",
3839   - "source": {
3840   - "type": "git",
3841   - "url": "https://github.com/yiisoft/yii2-codeception.git",
3842   - "reference": "e01b3c46917b3f00c42f6a4aabf612cc36d792e6"
3843   - },
3844   - "dist": {
3845   - "type": "zip",
3846   - "url": "https://api.github.com/repos/yiisoft/yii2-codeception/zipball/572a6d46d942cc5733c45931fdbd1d60228f3c89",
3847   - "reference": "e01b3c46917b3f00c42f6a4aabf612cc36d792e6",
3848   - "shasum": ""
3849   - },
3850   - "require": {
3851   - "yiisoft/yii2": ">=2.0.4"
3852   - },
3853   - "type": "yii2-extension",
3854   - "extra": {
3855   - "branch-alias": {
3856   - "dev-master": "2.0.x-dev"
3857   - }
3858   - },
3859   - "autoload": {
3860   - "psr-4": {
3861   - "yii\\codeception\\": ""
3862   - }
3863   - },
3864   - "notification-url": "https://packagist.org/downloads/",
3865   - "license": [
3866   - "BSD-3-Clause"
3867   - ],
3868   - "authors": [
3869   - {
3870   - "name": "Mark Jebri",
3871   - "email": "mark.github@yandex.ru"
3872   - }
3873   - ],
3874   - "description": "The Codeception integration for the Yii framework",
3875   - "keywords": [
3876   - "codeception",
3877   - "yii2"
3878   - ],
3879   - "time": "2016-03-21 19:11:26"
3880   - },
3881   - {
3882   - "name": "yiisoft/yii2-debug",
3883   - "version": "dev-master",
3884   - "source": {
3885   - "type": "git",
3886   - "url": "https://github.com/yiisoft/yii2-debug.git",
3887   - "reference": "081795536b31d29106b0d1de0cb3aefa3e05e995"
3888   - },
3889   - "dist": {
3890   - "type": "zip",
3891   - "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/e26905af4bc1ca5ecbababac112c7f7f722cabd2",
3892   - "reference": "081795536b31d29106b0d1de0cb3aefa3e05e995",
3893   - "shasum": ""
3894   - },
3895   - "require": {
3896   - "yiisoft/yii2": ">=2.0.4",
3897   - "yiisoft/yii2-bootstrap": "*"
3898   - },
3899   - "type": "yii2-extension",
3900   - "extra": {
3901   - "branch-alias": {
3902   - "dev-master": "2.0.x-dev"
3903   - }
3904   - },
3905   - "autoload": {
3906   - "psr-4": {
3907   - "yii\\debug\\": ""
3908   - }
3909   - },
3910   - "notification-url": "https://packagist.org/downloads/",
3911   - "license": [
3912   - "BSD-3-Clause"
3913   - ],
3914   - "authors": [
3915   - {
3916   - "name": "Qiang Xue",
3917   - "email": "qiang.xue@gmail.com"
3918   - }
3919   - ],
3920   - "description": "The debugger extension for the Yii framework",
3921   - "keywords": [
3922   - "debug",
3923   - "debugger",
3924   - "yii2"
3925   - ],
3926   - "time": "2016-03-21 19:12:39"
3927   - },
3928   - {
3929   - "name": "yiisoft/yii2-faker",
3930   - "version": "dev-master",
3931   - "source": {
3932   - "type": "git",
3933   - "url": "https://github.com/yiisoft/yii2-faker.git",
3934   - "reference": "a8daa97749e7154d91676405a1c59ed81e1ca999"
3935   - },
3936   - "dist": {
3937   - "type": "zip",
3938   - "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/6e6eb430809e3f9c05e367303909a05a4912d4c0",
3939   - "reference": "a8daa97749e7154d91676405a1c59ed81e1ca999",
3940   - "shasum": ""
3941   - },
3942   - "require": {
3943   - "fzaninotto/faker": "~1.4",
3944   - "yiisoft/yii2": "*"
3945   - },
3946   - "type": "yii2-extension",
3947   - "extra": {
3948   - "branch-alias": {
3949   - "dev-master": "2.0.x-dev"
3950   - }
3951   - },
3952   - "autoload": {
3953   - "psr-4": {
3954   - "yii\\faker\\": ""
3955   - }
3956   - },
3957   - "notification-url": "https://packagist.org/downloads/",
3958   - "license": [
3959   - "BSD-3-Clause"
3960   - ],
3961   - "authors": [
3962   - {
3963   - "name": "Mark Jebri",
3964   - "email": "mark.github@yandex.ru"
3965   - }
3966   - ],
3967   - "description": "Fixture generator. The Faker integration for the Yii framework.",
3968   - "keywords": [
3969   - "Fixture",
3970   - "faker",
3971   - "yii2"
3972   - ],
3973   - "time": "2016-03-21 19:13:03"
3974   - },
3975   - {
3976   - "name": "yiisoft/yii2-gii",
3977   - "version": "dev-master",
3978   - "source": {
3979   - "type": "git",
3980   - "url": "https://github.com/yiisoft/yii2-gii.git",
3981   - "reference": "989d6c52c92e51f0d562729c329ee1012191cba2"
3982   - },
3983   - "dist": {
3984   - "type": "zip",
3985   - "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/70edab5a7938b5bf4b5dc3ad1e1c3ce673552f48",
3986   - "reference": "989d6c52c92e51f0d562729c329ee1012191cba2",
3987   - "shasum": ""
3988   - },
3989   - "require": {
3990   - "bower-asset/typeahead.js": "0.10.* | ~0.11.0",
3991   - "phpspec/php-diff": ">=1.0.2",
3992   - "yiisoft/yii2": ">=2.0.4",
3993   - "yiisoft/yii2-bootstrap": "~2.0"
3994   - },
3995   - "type": "yii2-extension",
3996   - "extra": {
3997   - "branch-alias": {
3998   - "dev-master": "2.0.x-dev"
3999   - },
4000   - "asset-installer-paths": {
4001   - "npm-asset-library": "vendor/npm",
4002   - "bower-asset-library": "vendor/bower"
4003   - }
4004   - },
4005   - "autoload": {
4006   - "psr-4": {
4007   - "yii\\gii\\": ""
4008   - }
4009   - },
4010   - "notification-url": "https://packagist.org/downloads/",
4011   - "license": [
4012   - "BSD-3-Clause"
4013   - ],
4014   - "authors": [
4015   - {
4016   - "name": "Qiang Xue",
4017   - "email": "qiang.xue@gmail.com"
4018   - }
4019   - ],
4020   - "description": "The Gii extension for the Yii framework",
4021   - "keywords": [
4022   - "code generator",
4023   - "gii",
4024   - "yii2"
4025   - ],
4026   - "time": "2016-03-21 19:13:26"
4027   - }
4028   - ],
4029   - "aliases": [],
4030   - "minimum-stability": "dev",
4031   - "stability-flags": {
4032   - "kartik-v/yii2-widget-select2": 20
4033   - },
4034   - "prefer-stable": false,
4035   - "prefer-lowest": false,
4036   - "platform": {
4037   - "php": ">=5.4.0"
4038   - },
4039   - "platform-dev": []
4040   -}
frontend/views/catalog/product.php
1 1 <?php
  2 +
  3 +use common\components\artboximage\ArtboxImageHelper;
  4 +
2 5 /** @var $this \yii\web\View */
3 6 /** @var $dataProvider \yii\data\ActiveDataProvider */
4 7 $this->title = $product->name;
... ... @@ -16,7 +19,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $product-&gt;name .&#39; #&#39;. $product-&gt;variant-&gt;sku;
16 19 <?php if (empty($product->image)) :?>
17 20 <img src="/images/no_photo_big.png" alt="<?= $product->name?>">
18 21 <?php else :?>
19   - <?= $product->image->imageUrl ? Yii::$app->imageCache->thumb($product->image->imageUrl, 'product') : ''?>
  22 + <?= $product->image->imageUrl ? ArtboxImageHelper::getImage($product->image->imageUrl, 'product') : ''?>
20 23 <?php endif?>
21 24  
22 25 <!--<span class="new">НОВИНКА</span>
... ... @@ -34,7 +37,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $product-&gt;name .&#39; #&#39;. $product-&gt;variant-&gt;sku;
34 37 <div class="main_img_slide">
35 38 <?php foreach($product->images as $image) :?>
36 39 <div class="small_img_block active">
37   - <?= Yii::$app->imageCache->thumb($image->imageUrl, 'product_trumb')?>
  40 + <?= ArtboxImageHelper::getImage($image->imageUrl, 'product_trumb')?>
38 41 </div>
39 42 <?php endforeach?>
40 43  
... ...
frontend/views/catalog/product_item.php
... ... @@ -10,7 +10,7 @@
10 10 <?php if (empty($product->image)) :?>
11 11 <img src="/images/no_photo.png">
12 12 <?php else :?>
13   - <?= Yii::$app->imageCache->thumb($product->image->imageUrl, 'product_list')?>
  13 + <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->image->imageUrl, 'product_list')?>
14 14 <?php endif?>
15 15 </div>
16 16 <div class="title_item"><?= $product->name?></div></a>
... ...