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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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,4 +3,5 @@ Yii::setAlias(&#39;@common&#39;, dirname(__DIR__));
3 Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend'); 3 Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
4 Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend'); 4 Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
5 Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console'); 5 Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
  6 +Yii::setAlias('@storage', dirname(dirname(__DIR__)) . '/storage');
6 Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage'); 7 Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage');
common/config/main.php
@@ -69,6 +69,66 @@ return [ @@ -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 'modules' => [ 134 'modules' => [
common/modules/product/models/Brand.php
@@ -123,10 +123,10 @@ class Brand extends \yii\db\ActiveRecord @@ -123,10 +123,10 @@ class Brand extends \yii\db\ActiveRecord
123 } 123 }
124 124
125 public function getImageFile() { 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 public function getImageUrl() { 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,9 +177,13 @@ class Category extends \yii\db\ActiveRecord
177 return empty($this->categoryName) ? null : $this->categoryName->value; 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 public function getImageUrl() 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 public function beforeSave($insert) 189 public function beforeSave($insert)
common/modules/product/models/Product.php
@@ -197,7 +197,7 @@ class Product extends \yii\db\ActiveRecord @@ -197,7 +197,7 @@ class Product extends \yii\db\ActiveRecord
197 // $this->imagesUpload = [$this->imagesUpload]; 197 // $this->imagesUpload = [$this->imagesUpload];
198 // } 198 // }
199 // foreach($this->imagesUpload as $image) { 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,12 +233,12 @@ class Product extends \yii\db\ActiveRecord
233 foreach ($this->imagesUpload as $image) { 233 foreach ($this->imagesUpload as $image) {
234 $imageName = $image->baseName .'.'. $image->extension; 234 $imageName = $image->baseName .'.'. $image->extension;
235 $i = 0; 235 $i = 0;
236 - while(file_exists(Yii::getAlias('@frontend/web/images/products/' . $imageName))) { 236 + while(file_exists(Yii::getAlias('@storage/products/'. $imageName))) {
237 $i++; 237 $i++;
238 $imageName = $image->baseName .'_'. $i .'.'. $image->extension; 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 $images[] = $imageName; 242 $images[] = $imageName;
243 } 243 }
244 return $images; 244 return $images;
common/modules/product/models/ProductImage.php
@@ -97,7 +97,7 @@ class ProductImage extends \yii\db\ActiveRecord @@ -97,7 +97,7 @@ class ProductImage extends \yii\db\ActiveRecord
97 */ 97 */
98 public function getImageFile() 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,7 +107,7 @@ class ProductImage extends \yii\db\ActiveRecord
107 public function getImageUrl() 107 public function getImageUrl()
108 { 108 {
109 // return a default image placeholder if your source image is not found 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,7 +3,7 @@
3 <div class="prods_carousel"> 3 <div class="prods_carousel">
4 <ul> 4 <ul>
5 <?php foreach($brands as $brand) :?> 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 <?php endforeach?> 7 <?php endforeach?>
8 </ul> 8 </ul>
9 </div> 9 </div>
common/modules/product/widgets/views/submenu.php
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 <?php if (empty($_item->image)) :?> 12 <?php if (empty($_item->image)) :?>
13 <img valign="top" src="/images/no_photo.png"> 13 <img valign="top" src="/images/no_photo.png">
14 <?php else :?> 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 <?php endif?> 16 <?php endif?>
17 </div> 17 </div>
18 <div class="title"><?= $_item->categoryName->value?></div> 18 <div class="title"><?= $_item->categoryName->value?></div>
@@ -34,7 +34,7 @@ @@ -34,7 +34,7 @@
34 <?php if (empty($_item['item']->image)) :?> 34 <?php if (empty($_item['item']->image)) :?>
35 <img valign="top" src="/images/no_photo.png"> 35 <img valign="top" src="/images/no_photo.png">
36 <?php else :?> 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 <?php endif?> 38 <?php endif?>
39 </div> 39 </div>
40 <div class="title"><?= $_item['item']->categoryName->value?></div> 40 <div class="title"><?= $_item['item']->categoryName->value?></div>
common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php
@@ -116,7 +116,7 @@ class ArtboxSynonymBehavior extends Behavior { @@ -116,7 +116,7 @@ class ArtboxSynonymBehavior extends Behavior {
116 if ($isave) { 116 if ($isave) {
117 $valueModel->setAttribute($this->valueOptionId, $this->owner->getAttribute($this->keyNameId)); 117 $valueModel->setAttribute($this->valueOptionId, $this->owner->getAttribute($this->keyNameId));
118 $valueModel->save(); 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 $this->owner->{$this->slug['slugKeyName']} = $this->slugify($valueModel->{$this->slug['valueKeyName']}); 120 $this->owner->{$this->slug['slugKeyName']} = $this->slugify($valueModel->{$this->slug['valueKeyName']});
121 } 121 }
122 } 122 }
@@ -5,9 +5,6 @@ @@ -5,9 +5,6 @@
5 "homepage": "http://www.yiiframework.com/", 5 "homepage": "http://www.yiiframework.com/",
6 "type": "project", 6 "type": "project",
7 "license": "BSD-3-Clause", 7 "license": "BSD-3-Clause",
8 - "platform": {  
9 - "php": "5.5.0"  
10 - },  
11 "support": { 8 "support": {
12 "issues": "https://github.com/yiisoft/yii2/issues?state=open", 9 "issues": "https://github.com/yiisoft/yii2/issues?state=open",
13 "forum": "http://www.yiiframework.com/forum/", 10 "forum": "http://www.yiiframework.com/forum/",
@@ -38,7 +35,13 @@ @@ -38,7 +35,13 @@
38 "unclead/yii2-multiple-input": "~1.0", 35 "unclead/yii2-multiple-input": "~1.0",
39 "codeception/codeception":"*", 36 "codeception/codeception":"*",
40 "phpmailer/phpmailer": "^5.2", 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 "require-dev": { 46 "require-dev": {
44 "yiisoft/yii2-codeception": "*", 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 <?php 1 <?php
  2 +
  3 +use common\components\artboximage\ArtboxImageHelper;
  4 +
2 /** @var $this \yii\web\View */ 5 /** @var $this \yii\web\View */
3 /** @var $dataProvider \yii\data\ActiveDataProvider */ 6 /** @var $dataProvider \yii\data\ActiveDataProvider */
4 $this->title = $product->name; 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,7 +19,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $product-&gt;name .&#39; #&#39;. $product-&gt;variant-&gt;sku;
16 <?php if (empty($product->image)) :?> 19 <?php if (empty($product->image)) :?>
17 <img src="/images/no_photo_big.png" alt="<?= $product->name?>"> 20 <img src="/images/no_photo_big.png" alt="<?= $product->name?>">
18 <?php else :?> 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 <?php endif?> 23 <?php endif?>
21 24
22 <!--<span class="new">НОВИНКА</span> 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,7 +37,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $product-&gt;name .&#39; #&#39;. $product-&gt;variant-&gt;sku;
34 <div class="main_img_slide"> 37 <div class="main_img_slide">
35 <?php foreach($product->images as $image) :?> 38 <?php foreach($product->images as $image) :?>
36 <div class="small_img_block active"> 39 <div class="small_img_block active">
37 - <?= Yii::$app->imageCache->thumb($image->imageUrl, 'product_trumb')?> 40 + <?= ArtboxImageHelper::getImage($image->imageUrl, 'product_trumb')?>
38 </div> 41 </div>
39 <?php endforeach?> 42 <?php endforeach?>
40 43
frontend/views/catalog/product_item.php
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <?php if (empty($product->image)) :?> 10 <?php if (empty($product->image)) :?>
11 <img src="/images/no_photo.png"> 11 <img src="/images/no_photo.png">
12 <?php else :?> 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 <?php endif?> 14 <?php endif?>
15 </div> 15 </div>
16 <div class="title_item"><?= $product->name?></div></a> 16 <div class="title_item"><?= $product->name?></div></a>