From 1f90c5f48da7bc5796ed1296bac863cbd5efe170 Mon Sep 17 00:00:00 2001 From: Karnovsky A Date: Thu, 12 May 2016 22:39:43 +0300 Subject: [PATCH] ArtboxImage resizer --- common/components/artboximage/ArtboxImage.php | 35 +++++++++++++++++++++++++++++++++++ common/components/artboximage/ArtboxImageHelper.php | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/components/artboximage/drivers/Image.php | 7 +++++++ common/components/artboximage/drivers/Image/GD.php | 18 ++++++++++++++++++ common/components/artboximage/drivers/Image/Imagick.php | 15 +++++++++++++++ common/components/artboximage/drivers/Kohana/Image/GD.php | 689 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/components/artboximage/drivers/Kohana/Image/Imagick.php | 362 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/components/artboximage/drivers/Kohana/Kohana_Image.php | 836 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/config/bootstrap.php | 1 + common/config/main.php | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/modules/product/models/Brand.php | 4 ++-- common/modules/product/models/Category.php | 6 +++++- common/modules/product/models/Product.php | 6 +++--- common/modules/product/models/ProductImage.php | 4 ++-- common/modules/product/widgets/views/brandsCarousel.php | 2 +- common/modules/product/widgets/views/submenu.php | 4 ++-- common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php | 2 +- composer.json | 11 +++++++---- composer.lock | 4040 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- frontend/views/catalog/product.php | 7 +++++-- frontend/views/catalog/product_item.php | 2 +- 21 files changed, 2186 insertions(+), 4059 deletions(-) create mode 100644 common/components/artboximage/ArtboxImage.php create mode 100644 common/components/artboximage/ArtboxImageHelper.php create mode 100644 common/components/artboximage/drivers/Image.php create mode 100644 common/components/artboximage/drivers/Image/GD.php create mode 100644 common/components/artboximage/drivers/Image/Imagick.php create mode 100644 common/components/artboximage/drivers/Kohana/Image/GD.php create mode 100644 common/components/artboximage/drivers/Kohana/Image/Imagick.php create mode 100644 common/components/artboximage/drivers/Kohana/Kohana_Image.php delete mode 100644 composer.lock diff --git a/common/components/artboximage/ArtboxImage.php b/common/components/artboximage/ArtboxImage.php new file mode 100644 index 0000000..1bd7921 --- /dev/null +++ b/common/components/artboximage/ArtboxImage.php @@ -0,0 +1,35 @@ + 'jpeg', + 'jpeg' => 'jpeg', + 'png' => 'png', + 'gif' => 'gif', + 'bmp' => 'bmp', + ]; + + public function load($file = null, $driver = null) { + if(empty($file) || !realpath($file)) { + throw new ErrorException('File name can not be empty and exists'); + } + return Image::factory($file, $driver ? $driver : $this->driver); + } +} \ No newline at end of file diff --git a/common/components/artboximage/ArtboxImageHelper.php b/common/components/artboximage/ArtboxImageHelper.php new file mode 100644 index 0000000..b03815d --- /dev/null +++ b/common/components/artboximage/ArtboxImageHelper.php @@ -0,0 +1,134 @@ +artboximage; + } + return self::$imageDriver; + } + + public function getPreset($preset) { + if (empty(self::$presets)) { + self::$presets = self::getDriver()->presets; + } + return empty(self::$presets[$preset]) ? null : self::$presets[$preset]; + } + + public static function getImage($file, $preset, $imgOptions = []) { + return Html::img(self::getImageSrc($file, $preset), $imgOptions); + } + + public static function getImageSrc($file, $preset, $preset_alias = null) { + if (is_string($preset)) { + $preset_alias = $preset; + $preset = self::getPreset($preset); + } + if (empty($preset) || empty($preset_alias)) { + return $file; + } + $filePath = self::getPathFromUrl($file); + if (!file_exists($filePath) || !preg_match('#^(.*)\.(' . self::getExtensionsRegexp() . ')$#', $file, $matches)) { + return $file; + } + return self::getPresetUrl($filePath, $preset, $preset_alias); + } + + private static function getPathFromUrl($url) { + return substr_replace($url, self::getDriver()->rootPath, 0, strlen(self::getDriver()->rootUrl)); + } + + private static function getUrlFromPath($path) { + return substr_replace($path, self::getDriver()->rootUrl, 0, strlen(self::getDriver()->rootPath)); + } + + private static function getPresetUrl($filePath, $preset, $preset_alias) { + $pathinfo = pathinfo($filePath); + $presetPath = $pathinfo['dirname'] .'/styles/'. strtolower($preset_alias); + $presetFilePath = $presetPath .'/'. $pathinfo['basename']; + $presetUrl = self::getUrlFromPath($presetFilePath); + if (file_exists($presetFilePath)) { + return $presetUrl; + } + if (!file_exists($presetPath)) { + @mkdir($presetPath, 0777, true); + } + $output = self::createPresetImage($filePath, $preset, $preset_alias); + if ( !empty($output) ) { + $f = fopen($presetFilePath, 'w'); + fwrite($f, $output); + fclose($f); + return $presetUrl; + } + return false; + } + + private static function createPresetImage($filePath, $preset, $preset_alias) + { + $image = self::getDriver()->load($filePath); + foreach ($preset as $action => $data) { + switch($action) { + case 'resize': + $image->resize($data['width'], $data['height'], @$data['master']); + break; + case 'flip': + $image->flip(@$data['direction']); + break; + default: + break; + } + } + return $image->render(); + } + + /** + * Get extensions regexp + * @return string regexp + */ + private function getExtensionsRegexp() + { + $keys = array_keys(self::getDriver()->extensions); + return '(?i)' . join('|', $keys); + } + + /** + * Get size from suffix + * @param string $suffix + * @return string size + */ + private function getSizeFromSuffix($suffix) + { + return array_search($suffix, $this->getSizeSuffixes()); + } + + /** + * Get suffix from size + * @param string $size + * @return string suffix + */ + private function getSufixFromSize($size) + { + return ArrayHelper::getValue($this->getSizeSuffixes(), $size); + } + + private function getSizeSuffixes() + { + $suffixes = []; + foreach ($this->sizes as $size => $sizeConf) { + $suffixes[$size] = ArrayHelper::getValue($this->sizeSuffixes, $size, $this->defaultSizeSuffix . $size); + } + return $suffixes; + } +} \ No newline at end of file diff --git a/common/components/artboximage/drivers/Image.php b/common/components/artboximage/drivers/Image.php new file mode 100644 index 0000000..be0ef6f --- /dev/null +++ b/common/components/artboximage/drivers/Image.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/common/components/artboximage/drivers/Image/GD.php b/common/components/artboximage/drivers/Image/GD.php new file mode 100644 index 0000000..6324818 --- /dev/null +++ b/common/components/artboximage/drivers/Image/GD.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/common/components/artboximage/drivers/Image/Imagick.php b/common/components/artboximage/drivers/Image/Imagick.php new file mode 100644 index 0000000..4d7c2bb --- /dev/null +++ b/common/components/artboximage/drivers/Image/Imagick.php @@ -0,0 +1,15 @@ +=')) + { + throw new ErrorException(sprintf('Image_GD requires GD version 2.0.1 or greater, you have %s',$version)); + } + + return Image_GD::$_checked = TRUE; + } + + /* @var resource Temporary image resource */ + protected $_image; + + /* @var string Function name to open Image */ + protected $_create_function; + + /** + * Runs [Image_GD::check] and loads the image. + * + * @param string $file image file path + * @return void + * @throws ErrorException + */ + public function __construct($file) + { + if ( ! Image_GD::$_checked) + { + // Run the install check + Image_GD::check(); + } + + parent::__construct($file); + + // Set the image creation function name + switch ($this->type) + { + case IMAGETYPE_JPEG: + $create = 'imagecreatefromjpeg'; + break; + case IMAGETYPE_GIF: + $create = 'imagecreatefromgif'; + break; + case IMAGETYPE_PNG: + $create = 'imagecreatefrompng'; + break; + } + + if ( ! isset($create) OR ! function_exists($create)) + { + throw new ErrorException(sprintf('Installed GD does not support %s images',image_type_to_extension($this->type, FALSE))); + } + + // Save function for future use + $this->_create_function = $create; + + // Save filename for lazy loading + $this->_image = $this->file; + } + + /** + * Destroys the loaded image to free up resources. + * + * @return void + */ + public function __destruct() + { + if (is_resource($this->_image)) + { + // Free all resources + imagedestroy($this->_image); + } + } + + /** + * Loads an image into GD. + * + * @return void + */ + protected function _load_image() + { + if ( ! is_resource($this->_image)) + { + // Gets create function + $create = $this->_create_function; + + // Open the temporary image + $this->_image = $create($this->file); + + // Preserve transparency when saving + imagesavealpha($this->_image, TRUE); + } + } + + /** + * Execute a resize. + * + * @param integer $width new width + * @param integer $height new height + * @return void + */ + protected function _do_resize($width, $height) + { + // Presize width and height + $pre_width = $this->width; + $pre_height = $this->height; + + // Loads image if not yet loaded + $this->_load_image(); + + // Test if we can do a resize without resampling to speed up the final resize + if ($width > ($this->width / 2) AND $height > ($this->height / 2)) + { + // The maximum reduction is 10% greater than the final size + $reduction_width = round($width * 1.1); + $reduction_height = round($height * 1.1); + + while ($pre_width / 2 > $reduction_width AND $pre_height / 2 > $reduction_height) + { + // Reduce the size using an O(2n) algorithm, until it reaches the maximum reduction + $pre_width /= 2; + $pre_height /= 2; + } + + // Create the temporary image to copy to + $image = $this->_create($pre_width, $pre_height); + + if (imagecopyresized($image, $this->_image, 0, 0, 0, 0, $pre_width, $pre_height, $this->width, $this->height)) + { + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $image; + } + } + + // Create the temporary image to copy to + $image = $this->_create($width, $height); + + // Execute the resize + if (imagecopyresampled($image, $this->_image, 0, 0, 0, 0, $width, $height, $pre_width, $pre_height)) + { + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $image; + + // Reset the width and height + $this->width = imagesx($image); + $this->height = imagesy($image); + } + } + + /** + * Adaptation the image. + * + * @param integer $width image width + * @param integer $height image height + * @param integer $bg_width background width + * @param integer $bg_height background height + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + */ + protected function _do_adapt($width, $height, $bg_width, $bg_height, $offset_x, $offset_y) + { + $this->_load_image(); + $image = $this->_image; + $this->_image = $this->_create($bg_width, $bg_height); + $this->width = $bg_width; + $this->height = $bg_height; + imagealphablending($this->_image, false); + $col = imagecolorallocatealpha($this->_image, 0, 255, 0, 127); + imagefilledrectangle($this->_image, 0, 0, $bg_width, $bg_height, $col); + imagealphablending($this->_image, true); + imagecopy($this->_image, $image, $offset_x, $offset_y, 0, 0, $width, $height); + imagealphablending($this->_image, false); + imagesavealpha($this->_image, true); + imagedestroy($image); + } + + /** + * Execute a crop. + * + * @param integer $width new width + * @param integer $height new height + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + * @return void + */ + protected function _do_crop($width, $height, $offset_x, $offset_y) + { + // Create the temporary image to copy to + $image = $this->_create($width, $height); + + // Loads image if not yet loaded + $this->_load_image(); + + // Execute the crop + if (imagecopyresampled($image, $this->_image, 0, 0, $offset_x, $offset_y, $width, $height, $width, $height)) + { + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $image; + + // Reset the width and height + $this->width = imagesx($image); + $this->height = imagesy($image); + } + } + + /** + * Execute a rotation. + * + * @param integer $degrees degrees to rotate + * @return void + */ + protected function _do_rotate($degrees) + { + if (empty(Image_GD::$_available_functions[Image_GD::IMAGEROTATE])) + { + throw new ErrorException('This method requires imagerotate, which is only available in the bundled version of GD'); + } + + // Loads image if not yet loaded + $this->_load_image(); + + // Transparent black will be used as the background for the uncovered region + $transparent = imagecolorallocatealpha($this->_image, 0, 0, 0, 127); + + // Rotate, setting the transparent color + $image = imagerotate($this->_image, 360 - $degrees, $transparent, 1); + + // Save the alpha of the rotated image + imagesavealpha($image, TRUE); + + // Get the width and height of the rotated image + $width = imagesx($image); + $height = imagesy($image); + + if (imagecopymerge($this->_image, $image, 0, 0, 0, 0, $width, $height, 100)) + { + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $image; + + // Reset the width and height + $this->width = $width; + $this->height = $height; + } + } + + /** + * Execute a flip. + * + * @param integer $direction direction to flip + * @return void + */ + protected function _do_flip($direction) + { + // Create the flipped image + $flipped = $this->_create($this->width, $this->height); + + // Loads image if not yet loaded + $this->_load_image(); + + if ($direction === Image::HORIZONTAL) + { + for ($x = 0; $x < $this->width; $x++) + { + // Flip each row from top to bottom + imagecopy($flipped, $this->_image, $x, 0, $this->width - $x - 1, 0, 1, $this->height); + } + } + else + { + for ($y = 0; $y < $this->height; $y++) + { + // Flip each column from left to right + imagecopy($flipped, $this->_image, 0, $y, 0, $this->height - $y - 1, $this->width, 1); + } + } + + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $flipped; + + // Reset the width and height + $this->width = imagesx($flipped); + $this->height = imagesy($flipped); + } + + /** + * Execute a sharpen. + * + * @param integer $amount amount to sharpen + * @return void + */ + protected function _do_sharpen($amount) + { + if (empty(Image_GD::$_available_functions[Image_GD::IMAGECONVOLUTION])) + { + throw new ErrorException('This method requires imageconvolution, which is only available in the bundled version of GD'); + } + + // Loads image if not yet loaded + $this->_load_image(); + + // Amount should be in the range of 18-10 + $amount = round(abs(-18 + ($amount * 0.08)), 2); + + // Gaussian blur matrix + $matrix = array + ( + array(-1, -1, -1), + array(-1, $amount, -1), + array(-1, -1, -1), + ); + + // Perform the sharpen + if (imageconvolution($this->_image, $matrix, $amount - 8, 0)) + { + // Reset the width and height + $this->width = imagesx($this->_image); + $this->height = imagesy($this->_image); + } + } + + /** + * Execute a reflection. + * + * @param integer $height reflection height + * @param integer $opacity reflection opacity + * @param boolean $fade_in TRUE to fade out, FALSE to fade in + * @return void + */ + protected function _do_reflection($height, $opacity, $fade_in) + { + if (empty(Image_GD::$_available_functions[Image_GD::IMAGEFILTER])) + { + throw new ErrorException('This method requires imagefilter, which is only available in the bundled version of GD'); + } + + // Loads image if not yet loaded + $this->_load_image(); + + // Convert an opacity range of 0-100 to 127-0 + $opacity = round(abs(($opacity * 127 / 100) - 127)); + + if ($opacity < 127) + { + // Calculate the opacity stepping + $stepping = (127 - $opacity) / $height; + } + else + { + // Avoid a "divide by zero" error + $stepping = 127 / $height; + } + + // Create the reflection image + $reflection = $this->_create($this->width, $this->height + $height); + + // Copy the image to the reflection + imagecopy($reflection, $this->_image, 0, 0, 0, 0, $this->width, $this->height); + + for ($offset = 0; $height >= $offset; $offset++) + { + // Read the next line down + $src_y = $this->height - $offset - 1; + + // Place the line at the bottom of the reflection + $dst_y = $this->height + $offset; + + if ($fade_in === TRUE) + { + // Start with the most transparent line first + $dst_opacity = round($opacity + ($stepping * ($height - $offset))); + } + else + { + // Start with the most opaque line first + $dst_opacity = round($opacity + ($stepping * $offset)); + } + + // Create a single line of the image + $line = $this->_create($this->width, 1); + + // Copy a single line from the current image into the line + imagecopy($line, $this->_image, 0, 0, 0, $src_y, $this->width, 1); + + // Colorize the line to add the correct alpha level + imagefilter($line, IMG_FILTER_COLORIZE, 0, 0, 0, $dst_opacity); + + // Copy a the line into the reflection + imagecopy($reflection, $line, 0, $dst_y, 0, 0, $this->width, 1); + } + + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $reflection; + + // Reset the width and height + $this->width = imagesx($reflection); + $this->height = imagesy($reflection); + } + + /** + * Execute a watermarking. + * + * @param Kohana_Image $image watermarking Kohana_Image + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + * @param integer $opacity opacity of watermark + * @return void + */ + protected function _do_watermark(Kohana_Image $watermark, $offset_x, $offset_y, $opacity) + { + if (empty(Image_GD::$_available_functions[Image_GD::IMAGELAYEREFFECT])) + { + throw new ErrorException('This method requires imagelayereffect, which is only available in the bundled version of GD'); + } + + // Loads image if not yet loaded + $this->_load_image(); + + // Create the watermark image resource + $overlay = imagecreatefromstring($watermark->render()); + + imagesavealpha($overlay, TRUE); + + // Get the width and height of the watermark + $width = imagesx($overlay); + $height = imagesy($overlay); + + if ($opacity < 100) + { + // Convert an opacity range of 0-100 to 127-0 + $opacity = round(abs(($opacity * 127 / 100) - 127)); + + // Allocate transparent gray + $color = imagecolorallocatealpha($overlay, 127, 127, 127, $opacity); + + // The transparent image will overlay the watermark + imagelayereffect($overlay, IMG_EFFECT_OVERLAY); + + // Fill the background with the transparent color + imagefilledrectangle($overlay, 0, 0, $width, $height, $color); + } + + // Alpha blending must be enabled on the background! + imagealphablending($this->_image, TRUE); + + if (imagecopy($this->_image, $overlay, $offset_x, $offset_y, 0, 0, $width, $height)) + { + // Destroy the overlay image + imagedestroy($overlay); + } + } + + /** + * Execute a background. + * + * @param integer $r red + * @param integer $g green + * @param integer $b blue + * @param integer $opacity opacity + * @return void + */ + protected function _do_background($r, $g, $b, $opacity) + { + // Loads image if not yet loaded + $this->_load_image(); + + // Convert an opacity range of 0-100 to 127-0 + $opacity = round(abs(($opacity * 127 / 100) - 127)); + + // Create a new background + $background = $this->_create($this->width, $this->height); + + // Allocate the color + $color = imagecolorallocatealpha($background, $r, $g, $b, $opacity); + + // Fill the image with white + imagefilledrectangle($background, 0, 0, $this->width, $this->height, $color); + + // Alpha blending must be enabled on the background! + imagealphablending($background, TRUE); + + // Copy the image onto a white background to remove all transparency + if (imagecopy($background, $this->_image, 0, 0, 0, 0, $this->width, $this->height)) + { + // Swap the new image for the old one + imagedestroy($this->_image); + $this->_image = $background; + } + } + + /** + * Execute a save. + * + * @param string $file new image filename + * @param integer $quality quality + * @return boolean + */ + protected function _do_save($file, $quality) + { + // Loads image if not yet loaded + $this->_load_image(); + + // Get the extension of the file + $extension = pathinfo($file, PATHINFO_EXTENSION); + + // Get the save function and IMAGETYPE + list($save, $type) = $this->_save_function($extension, $quality); + + // Save the image to a file + $status = isset($quality) ? $save($this->_image, $file, $quality) : $save($this->_image, $file); + + if ($status === TRUE AND $type !== $this->type) + { + // Reset the image type and mime type + $this->type = $type; + $this->mime = image_type_to_mime_type($type); + } + + return TRUE; + } + + /** + * Execute a render. + * + * @param string $type image type: png, jpg, gif, etc + * @param integer $quality quality + * @return string + */ + protected function _do_render($type, $quality) + { + // Loads image if not yet loaded + $this->_load_image(); + + // Get the save function and IMAGETYPE + list($save, $type) = $this->_save_function($type, $quality); + + // Capture the output + ob_start(); + + // Render the image + $status = isset($quality) ? $save($this->_image, NULL, $quality) : $save($this->_image, NULL); + + if ($status === TRUE AND $type !== $this->type) + { + // Reset the image type and mime type + $this->type = $type; + $this->mime = image_type_to_mime_type($type); + } + + return ob_get_clean(); + } + + /** + * Get the GD saving function and image type for this extension. + * Also normalizes the quality setting + * + * @param string $extension image type: png, jpg, etc + * @param integer $quality image quality + * @return array save function, IMAGETYPE_* constant + * @throws ErrorException + */ + protected function _save_function($extension, & $quality) + { + if ( ! $extension) + { + // Use the current image type + $extension = image_type_to_extension($this->type, FALSE); + } + + switch (strtolower($extension)) + { + case 'jpg': + case 'jpeg': + // Save a JPG file + $save = 'imagejpeg'; + $type = IMAGETYPE_JPEG; + break; + case 'gif': + // Save a GIF file + $save = 'imagegif'; + $type = IMAGETYPE_GIF; + + // GIFs do not a quality setting + $quality = NULL; + break; + case 'png': + // Save a PNG file + $save = 'imagepng'; + $type = IMAGETYPE_PNG; + + // Use a compression level of 9 (does not affect quality!) + $quality = 9; + break; + default: + throw new ErrorException(sprintf('Installed GD does not support %s images',$extension)); + break; + } + + return array($save, $type); + } + + /** + * Create an empty image with the given width and height. + * + * @param integer $width image width + * @param integer $height image height + * @return resource + */ + protected function _create($width, $height) + { + // Create an empty image + $image = imagecreatetruecolor($width, $height); + + // Do not apply alpha blending + imagealphablending($image, FALSE); + + // Save alpha levels + imagesavealpha($image, TRUE); + + return $image; + } + +} // End Image_GD diff --git a/common/components/artboximage/drivers/Kohana/Image/Imagick.php b/common/components/artboximage/drivers/Kohana/Image/Imagick.php new file mode 100644 index 0000000..36bee0e --- /dev/null +++ b/common/components/artboximage/drivers/Kohana/Image/Imagick.php @@ -0,0 +1,362 @@ +im = new Imagick; + $this->im->readImage($file); + + if ( ! $this->im->getImageAlphaChannel()) + { + // Force the image to have an alpha channel + $this->im->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); + } + } + + /** + * Destroys the loaded image to free up resources. + * + * @return void + */ + public function __destruct() + { + $this->im->clear(); + $this->im->destroy(); + } + + protected function _do_resize($width, $height) + { + if ($this->im->scaleImage($width, $height)) + { + // Reset the width and height + $this->width = $this->im->getImageWidth(); + $this->height = $this->im->getImageHeight(); + + return TRUE; + } + + return FALSE; + } + + /** + * Adaptation the image. + * + * @param integer $width image width + * @param integer $height image height + * @param integer $bg_width background width + * @param integer $bg_height background height + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + */ + protected function _do_adapt($width, $height, $bg_width, $bg_height, $offset_x, $offset_y) + { + $image = new Imagick(); + $image->newImage($bg_width, $bg_height, "none"); + $image->compositeImage($this->im, Imagick::COMPOSITE_ADD, $offset_x, $offset_y); + $this->im->clear(); + $this->im->destroy(); + $this->im = $image; + $this->width = $bg_width; + $this->height = $bg_height; + } + + protected function _do_crop($width, $height, $offset_x, $offset_y) + { + if ($this->im->cropImage($width, $height, $offset_x, $offset_y)) + { + // Reset the width and height + $this->width = $this->im->getImageWidth(); + $this->height = $this->im->getImageHeight(); + + // Trim off hidden areas + $this->im->setImagePage($this->width, $this->height, 0, 0); + + return TRUE; + } + + return FALSE; + } + + protected function _do_rotate($degrees) + { + if ($this->im->rotateImage(new ImagickPixel('transparent'), $degrees)) + { + // Reset the width and height + $this->width = $this->im->getImageWidth(); + $this->height = $this->im->getImageHeight(); + + // Trim off hidden areas + $this->im->setImagePage($this->width, $this->height, 0, 0); + + return TRUE; + } + + return FALSE; + } + + protected function _do_flip($direction) + { + if ($direction === Image::HORIZONTAL) + { + return $this->im->flopImage(); + } + else + { + return $this->im->flipImage(); + } + } + + protected function _do_sharpen($amount) + { + // IM not support $amount under 5 (0.15) + $amount = ($amount < 5) ? 5 : $amount; + + // Amount should be in the range of 0.0 to 3.0 + $amount = ($amount * 3.0) / 100; + + return $this->im->sharpenImage(0, $amount); + } + + protected function _do_reflection($height, $opacity, $fade_in) + { + // Clone the current image and flip it for reflection + $reflection = $this->im->clone(); + $reflection->flipImage(); + + // Crop the reflection to the selected height + $reflection->cropImage($this->width, $height, 0, 0); + $reflection->setImagePage($this->width, $height, 0, 0); + + // Select the fade direction + $direction = array('transparent', 'black'); + + if ($fade_in) + { + // Change the direction of the fade + $direction = array_reverse($direction); + } + + // Create a gradient for fading + $fade = new Imagick; + $fade->newPseudoImage($reflection->getImageWidth(), $reflection->getImageHeight(), vsprintf('gradient:%s-%s', $direction)); + + // Apply the fade alpha channel to the reflection + $reflection->compositeImage($fade, Imagick::COMPOSITE_DSTOUT, 0, 0); + + // NOTE: Using setImageOpacity will destroy alpha channels! + $reflection->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA); + + // Create a new container to hold the image and reflection + $image = new Imagick; + $image->newImage($this->width, $this->height + $height, new ImagickPixel); + + // Force the image to have an alpha channel + $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); + + // Force the background color to be transparent + // $image->setImageBackgroundColor(new ImagickPixel('transparent')); + + // Match the colorspace between the two images before compositing + $image->setColorspace($this->im->getColorspace()); + + // Place the image and reflection into the container + if ($image->compositeImage($this->im, Imagick::COMPOSITE_SRC, 0, 0) + AND $image->compositeImage($reflection, Imagick::COMPOSITE_OVER, 0, $this->height)) + { + // Replace the current image with the reflected image + $this->im = $image; + + // Reset the width and height + $this->width = $this->im->getImageWidth(); + $this->height = $this->im->getImageHeight(); + + return TRUE; + } + + return FALSE; + } + + protected function _do_watermark(Kohana_Image $image, $offset_x, $offset_y, $opacity) + { + // Convert the Image intance into an Imagick instance + $watermark = new Imagick; + $watermark->readImageBlob($image->render(), $image->file); + + if ($watermark->getImageAlphaChannel() !== Imagick::ALPHACHANNEL_ACTIVATE) + { + // Force the image to have an alpha channel + $watermark->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE); + } + + if ($opacity < 100) + { + // NOTE: Using setImageOpacity will destroy current alpha channels! + $watermark->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA); + } + + // Match the colorspace between the two images before compositing + // $watermark->setColorspace($this->im->getColorspace()); + + // Apply the watermark to the image + return $this->im->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, $offset_x, $offset_y); + } + + protected function _do_background($r, $g, $b, $opacity) + { + // Create a RGB color for the background + $color = sprintf('rgb(%d, %d, %d)', $r, $g, $b); + + // Create a new image for the background + $background = new Imagick; + $background->newImage($this->width, $this->height, new ImagickPixel($color)); + + if ( ! $background->getImageAlphaChannel()) + { + // Force the image to have an alpha channel + $background->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); + } + + // Clear the background image + $background->setImageBackgroundColor(new ImagickPixel('transparent')); + + // NOTE: Using setImageOpacity will destroy current alpha channels! + $background->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA); + + // Match the colorspace between the two images before compositing + $background->setColorspace($this->im->getColorspace()); + + if ($background->compositeImage($this->im, Imagick::COMPOSITE_DISSOLVE, 0, 0)) + { + // Replace the current image with the new image + $this->im = $background; + + return TRUE; + } + + return FALSE; + } + + protected function _do_save($file, $quality) + { + // Get the image format and type + list($format, $type) = $this->_get_imagetype(pathinfo($file, PATHINFO_EXTENSION)); + + // Set the output image type + $this->im->setFormat($format); + + // Set the output quality + $this->im->setImageCompressionQuality($quality); + + if ($this->im->writeImage($file)) + { + // Reset the image type and mime type + $this->type = $type; + $this->mime = image_type_to_mime_type($type); + + return TRUE; + } + + return FALSE; + } + + protected function _do_render($type, $quality) + { + // Get the image format and type + list($format, $type) = $this->_get_imagetype($type); + + // Set the output image type + $this->im->setFormat($format); + + // Set the output quality + $this->im->setImageCompressionQuality($quality); + + // Reset the image type and mime type + $this->type = $type; + $this->mime = image_type_to_mime_type($type); + + return (string) $this->im; + } + + /** + * Get the image type and format for an extension. + * + * @param string $extension image extension: png, jpg, etc + * @return string IMAGETYPE_* constant + * @throws ErrorException + */ + protected function _get_imagetype($extension) + { + // Normalize the extension to a format + $format = strtolower($extension); + + switch ($format) + { + case 'jpg': + case 'jpeg': + $type = IMAGETYPE_JPEG; + break; + case 'gif': + $type = IMAGETYPE_GIF; + break; + case 'png': + $type = IMAGETYPE_PNG; + break; + default: + throw new ErrorException(sprintf('Installed ImageMagick does not support %s images',$extension)); + break; + } + + return array($format, $type); + } +} // End Kohana_Image_Imagick diff --git a/common/components/artboximage/drivers/Kohana/Kohana_Image.php b/common/components/artboximage/drivers/Kohana/Kohana_Image.php new file mode 100644 index 0000000..a18ad17 --- /dev/null +++ b/common/components/artboximage/drivers/Kohana/Kohana_Image.php @@ -0,0 +1,836 @@ +file = $file; + $this->width = $info[0]; + $this->height = $info[1]; + $this->type = $info[2]; + $this->mime = image_type_to_mime_type($this->type); + } + + /** + * Render the current image. + * + * echo $image; + * + * [!!] The output of this function is binary and must be rendered with the + * appropriate Content-Type header or it will not be displayed correctly! + * + * @return string + */ + public function __toString() + { + try + { + // Render the current image + return $this->render(); + } + catch (ErrorException $e) + { + /* + if (is_object(Kohana::$log)) + { + // Get the text of the exception + $error = ErrorException::text($e); + + // Add this exception to the log + Yii::error($error); + } + */ + + // Showing any kind of error will be "inside" image data + return ''; + } + } + + /** + * Resize the image to the given size. Either the width or the height can + * be omitted and the image will be resized proportionally. + * + * // Resize to 200 pixels on the shortest side + * $image->resize(200, 200); + * + * // Resize to 200x200 pixels, keeping aspect ratio + * $image->resize(200, 200, Image::INVERSE); + * + * // Resize to 500 pixel width, keeping aspect ratio + * $image->resize(500, NULL); + * + * // Resize to 500 pixel height, keeping aspect ratio + * $image->resize(NULL, 500); + * + * // Resize to 200x500 pixels, ignoring aspect ratio + * $image->resize(200, 500, Image::NONE); + * + * // Resize to 400 pixels on the shortest side, puts it in the center + * // of the image with the transparent edges, keeping aspect ratio, + * // output size will be 400x400 pixels + * $image->resize(400, 400, Image::ADAPT); + * + * @param integer $width new width + * @param integer $height new height + * @param integer $master master dimension + * @return $this + * @uses Image::_do_resize + */ + public function resize($width = NULL, $height = NULL, $master = NULL) + { + if ($master === NULL) + { + // Choose the master dimension automatically + $master = Image::AUTO; + } + elseif ($master === Image::CROP) + { + if (empty($width) || empty($height)) + { + return $this->resize($width, $height, Image::AUTO); + } + + $master = $this->width / $this->height > $width / $height ? Image::HEIGHT : Image::WIDTH; + $this->resize($width, $height, $master); + + if ($this->width !== $width || $this->height !== $height) + { + $offset_x = round(($this->width - $width) / 2); + $offset_y = round(($this->height - $height) / 2); + $this->crop($width, $height, $offset_x, $offset_y); + } + + return $this; + } + // Image::WIDTH and Image::HEIGHT deprecated. You can use it in old projects, + // but in new you must pass empty value for non-master dimension + elseif ($master == Image::WIDTH AND ! empty($width)) + { + $master = Image::AUTO; + + // Set empty height for backward compatibility + $height = NULL; + } + elseif ($master == Image::HEIGHT AND ! empty($height)) + { + $master = Image::AUTO; + + // Set empty width for backward compatibility + $width = NULL; + } + elseif ($master === Image::ADAPT) + { + if (empty($width)) + { + $width = $this->width * $height / $this->height; + } + elseif (empty($height)) + { + $height = $this->height * $width / $this->width; + } + } + + if (empty($width)) + { + if ($master === Image::NONE) + { + // Use the current width + $width = $this->width; + } + else + { + // If width not set, master will be height + $master = Image::HEIGHT; + } + } + + if (empty($height)) + { + if ($master === Image::NONE) + { + // Use the current height + $height = $this->height; + } + else + { + // If height not set, master will be width + $master = Image::WIDTH; + } + } + + switch ($master) + { + case Image::AUTO: + // Choose direction with the greatest reduction ratio + $master = ($this->width / $width) > ($this->height / $height) ? Image::WIDTH : Image::HEIGHT; + break; + case Image::INVERSE: + // Choose direction with the minimum reduction ratio + $master = ($this->width / $width) > ($this->height / $height) ? Image::HEIGHT : Image::WIDTH; + break; + } + + switch ($master) + { + case Image::WIDTH: + // Recalculate the height based on the width proportions + $height = $this->height * $width / $this->width; + break; + case Image::HEIGHT: + // Recalculate the width based on the height proportions + $width = $this->width * $height / $this->height; + break; + case Image::PRECISE: + // Resize to precise size + $ratio = $this->width / $this->height; + + if ($width / $height > $ratio) + { + $height = $this->height * $width / $this->width; + } + else + { + $width = $this->width * $height / $this->height; + } + break; + } + + // Convert the width and height to integers, minimum value is 1px + $width = max(round($width), 1); + $height = max(round($height), 1); + + // Adapt the image if the ratios are not equivalent + if ($master === Image::ADAPT && $width / $height !== $this->width / $this->height) + { + $image_width = $bg_width = $this->width; + $image_height = $bg_height = $this->height; + + $offset_x = $offset_y = 0; + + if ($width / $height > $image_width / $image_height) + { + $bg_width = floor($image_height * $width / $height); + $offset_x = abs(floor(($bg_width - $image_width) / 2)); + } + else + { + $bg_height = floor($image_width * $height / $width); + $offset_y = abs(floor(($bg_height - $image_height) / 2)); + } + + $this->_do_adapt($image_width, $image_height, $bg_width, $bg_height, $offset_x, $offset_y); + } + + $this->_do_resize($width, $height); + + return $this; + } + + /** + * Crop an image to the given size. Either the width or the height can be + * omitted and the current width or height will be used. + * + * If no offset is specified, the center of the axis will be used. + * If an offset of TRUE is specified, the bottom of the axis will be used. + * + * // Crop the image to 200x200 pixels, from the center + * $image->crop(200, 200); + * + * @param integer $width new width + * @param integer $height new height + * @param mixed $offset_x offset from the left + * @param mixed $offset_y offset from the top + * @return $this + * @uses Image::_do_crop + */ + public function crop($width, $height, $offset_x = NULL, $offset_y = NULL) + { + if ($width > $this->width) + { + // Use the current width + $width = $this->width; + } + + if ($height > $this->height) + { + // Use the current height + $height = $this->height; + } + + if ($offset_x === NULL) + { + // Center the X offset + $offset_x = round(($this->width - $width) / 2); + } + elseif ($offset_x === TRUE) + { + // Bottom the X offset + $offset_x = $this->width - $width; + } + elseif ($offset_x < 0) + { + // Set the X offset from the right + $offset_x = $this->width - $width + $offset_x; + } + + if ($offset_y === NULL) + { + // Center the Y offset + $offset_y = round(($this->height - $height) / 2); + } + elseif ($offset_y === TRUE) + { + // Bottom the Y offset + $offset_y = $this->height - $height; + } + elseif ($offset_y < 0) + { + // Set the Y offset from the bottom + $offset_y = $this->height - $height + $offset_y; + } + + // Determine the maximum possible width and height + $max_width = $this->width - $offset_x; + $max_height = $this->height - $offset_y; + + if ($width > $max_width) + { + // Use the maximum available width + $width = $max_width; + } + + if ($height > $max_height) + { + // Use the maximum available height + $height = $max_height; + } + + $this->_do_crop($width, $height, $offset_x, $offset_y); + + return $this; + } + + /** + * Rotate the image by a given amount. + * + * // Rotate 45 degrees clockwise + * $image->rotate(45); + * + * // Rotate 90% counter-clockwise + * $image->rotate(-90); + * + * @param integer $degrees degrees to rotate: -360-360 + * @return $this + * @uses Image::_do_rotate + */ + public function rotate($degrees) + { + // Make the degrees an integer + $degrees = (int) $degrees; + + if ($degrees > 180) + { + do + { + // Keep subtracting full circles until the degrees have normalized + $degrees -= 360; + } + while ($degrees > 180); + } + + if ($degrees < -180) + { + do + { + // Keep adding full circles until the degrees have normalized + $degrees += 360; + } + while ($degrees < -180); + } + + $this->_do_rotate($degrees); + + return $this; + } + + /** + * Flip the image along the horizontal or vertical axis. + * + * // Flip the image from top to bottom + * $image->flip(Image::HORIZONTAL); + * + * // Flip the image from left to right + * $image->flip(Image::VERTICAL); + * + * @param integer $direction direction: Image::HORIZONTAL, Image::VERTICAL + * @return $this + * @uses Image::_do_flip + */ + public function flip($direction) + { + if ($direction !== Image::HORIZONTAL) + { + // Flip vertically + $direction = Image::VERTICAL; + } + + $this->_do_flip($direction); + + return $this; + } + + /** + * Sharpen the image by a given amount. + * + * // Sharpen the image by 20% + * $image->sharpen(20); + * + * @param integer $amount amount to sharpen: 1-100 + * @return $this + * @uses Image::_do_sharpen + */ + public function sharpen($amount) + { + // The amount must be in the range of 1 to 100 + $amount = min(max($amount, 1), 100); + + $this->_do_sharpen($amount); + + return $this; + } + + /** + * Add a reflection to an image. The most opaque part of the reflection + * will be equal to the opacity setting and fade out to full transparent. + * Alpha transparency is preserved. + * + * // Create a 50 pixel reflection that fades from 0-100% opacity + * $image->reflection(50); + * + * // Create a 50 pixel reflection that fades from 100-0% opacity + * $image->reflection(50, 100, TRUE); + * + * // Create a 50 pixel reflection that fades from 0-60% opacity + * $image->reflection(50, 60, TRUE); + * + * [!!] By default, the reflection will be go from transparent at the top + * to opaque at the bottom. + * + * @param integer $height reflection height + * @param integer $opacity reflection opacity: 0-100 + * @param boolean $fade_in TRUE to fade in, FALSE to fade out + * @return $this + * @uses Image::_do_reflection + */ + public function reflection($height = NULL, $opacity = 100, $fade_in = FALSE) + { + if ($height === NULL OR $height > $this->height) + { + // Use the current height + $height = $this->height; + } + + // The opacity must be in the range of 0 to 100 + $opacity = min(max($opacity, 0), 100); + + $this->_do_reflection($height, $opacity, $fade_in); + + return $this; + } + + /** + * Add a watermark to an image with a specified opacity. Alpha transparency + * will be preserved. + * + * If no offset is specified, the center of the axis will be used. + * If an offset of TRUE is specified, the bottom of the axis will be used. + * + * // Add a watermark to the bottom right of the image + * $mark = Image::factory('upload/watermark.png'); + * $image->watermark($mark, TRUE, TRUE); + * + * @param Kohana_Image $watermark watermark Image instance + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + * @param integer $opacity opacity of watermark: 1-100 + * @return $this + * @uses Image::_do_watermark + */ + public function watermark(Kohana_Image $watermark, $offset_x = NULL, $offset_y = NULL, $opacity = 100) + { + if ($offset_x === NULL) + { + // Center the X offset + $offset_x = round(($this->width - $watermark->width) / 2); + } + elseif ($offset_x === TRUE) + { + // Bottom the X offset + $offset_x = $this->width - $watermark->width; + } + elseif ($offset_x < 0) + { + // Set the X offset from the right + $offset_x = $this->width - $watermark->width + $offset_x; + } + + if ($offset_y === NULL) + { + // Center the Y offset + $offset_y = round(($this->height - $watermark->height) / 2); + } + elseif ($offset_y === TRUE) + { + // Bottom the Y offset + $offset_y = $this->height - $watermark->height; + } + elseif ($offset_y < 0) + { + // Set the Y offset from the bottom + $offset_y = $this->height - $watermark->height + $offset_y; + } + + // The opacity must be in the range of 1 to 100 + $opacity = min(max($opacity, 1), 100); + + $this->_do_watermark($watermark, $offset_x, $offset_y, $opacity); + + return $this; + } + + /** + * Set the background color of an image. This is only useful for images + * with alpha transparency. + * + * // Make the image background black + * $image->background('#000'); + * + * // Make the image background black with 50% opacity + * $image->background('#000', 50); + * + * @param string $color hexadecimal color value + * @param integer $opacity background opacity: 0-100 + * @return $this + * @uses Image::_do_background + */ + public function background($color, $opacity = 100) + { + if ($color[0] === '#') + { + // Remove the pound + $color = substr($color, 1); + } + + if (strlen($color) === 3) + { + // Convert shorthand into longhand hex notation + $color = preg_replace('/./', '$0$0', $color); + } + + // Convert the hex into RGB values + list ($r, $g, $b) = array_map('hexdec', str_split($color, 2)); + + // The opacity must be in the range of 0 to 100 + $opacity = min(max($opacity, 0), 100); + + $this->_do_background($r, $g, $b, $opacity); + + return $this; + } + + /** + * Save the image. If the filename is omitted, the original image will + * be overwritten. + * + * // Save the image as a PNG + * $image->save('saved/cool.png'); + * + * // Overwrite the original image + * $image->save(); + * + * [!!] If the file exists, but is not writable, an exception will be thrown. + * + * [!!] If the file does not exist, and the directory is not writable, an + * exception will be thrown. + * + * @param string $file new image path + * @param integer $quality quality of image: 1-100 + * @return boolean + * @uses Image::_save + * @throws ErrorException + */ + public function save($file = NULL, $quality = 100) + { + if ($file === NULL) + { + // Overwrite the file + $file = $this->file; + } + + if (is_file($file)) + { + if ( ! is_writable($file)) + { + throw new ErrorException(sprintf('File must be writable: %s',$file)); + } + } + else + { + // Get the directory of the file + $directory = realpath(pathinfo($file, PATHINFO_DIRNAME)); + + if ( ! is_dir($directory) OR ! is_writable($directory)) + { + throw new ErrorException(sprintf('Directory must be writable: %s',$directory)); + } + } + + // The quality must be in the range of 1 to 100 + $quality = min(max($quality, 1), 100); + + return $this->_do_save($file, $quality); + } + + /** + * Render the image and return the binary string. + * + * // Render the image at 50% quality + * $data = $image->render(NULL, 50); + * + * // Render the image as a PNG + * $data = $image->render('png'); + * + * @param string $type image type to return: png, jpg, gif, etc + * @param integer $quality quality of image: 1-100 + * @return string + * @uses Image::_do_render + */ + public function render($type = NULL, $quality = 100) + { + if ($type === NULL) + { + // Use the current image type + $type = image_type_to_extension($this->type, FALSE); + } + + return $this->_do_render($type, $quality); + } + + /** + * Execute a resize. + * + * @param integer $width new width + * @param integer $height new height + * @return void + */ + abstract protected function _do_resize($width, $height); + + /** + * Adaptation the image. + * + * @param integer $width image width + * @param integer $height image height + * @param integer $bg_width background width + * @param integer $bg_height background height + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + */ + abstract protected function _do_adapt($width, $height, $bg_width, $bg_height, $offset_x, $offset_y); + + /** + * Execute a crop. + * + * @param integer $width new width + * @param integer $height new height + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + * @return void + */ + abstract protected function _do_crop($width, $height, $offset_x, $offset_y); + + /** + * Execute a rotation. + * + * @param integer $degrees degrees to rotate + * @return void + */ + abstract protected function _do_rotate($degrees); + + /** + * Execute a flip. + * + * @param integer $direction direction to flip + * @return void + */ + abstract protected function _do_flip($direction); + + /** + * Execute a sharpen. + * + * @param integer $amount amount to sharpen + * @return void + */ + abstract protected function _do_sharpen($amount); + + /** + * Execute a reflection. + * + * @param integer $height reflection height + * @param integer $opacity reflection opacity + * @param boolean $fade_in TRUE to fade out, FALSE to fade in + * @return void + */ + abstract protected function _do_reflection($height, $opacity, $fade_in); + + /** + * Execute a watermarking. + * + * @param Kohana_Image $image watermarking Kohana_Image + * @param integer $offset_x offset from the left + * @param integer $offset_y offset from the top + * @param integer $opacity opacity of watermark + * @return void + */ + abstract protected function _do_watermark(Kohana_Image $image, $offset_x, $offset_y, $opacity); + + /** + * Execute a background. + * + * @param integer $r red + * @param integer $g green + * @param integer $b blue + * @param integer $opacity opacity + * @return void + */ + abstract protected function _do_background($r, $g, $b, $opacity); + + /** + * Execute a save. + * + * @param string $file new image filename + * @param integer $quality quality + * @return boolean + */ + abstract protected function _do_save($file, $quality); + + /** + * Execute a render. + * + * @param string $type image type: png, jpg, gif, etc + * @param integer $quality quality + * @return string + */ + abstract protected function _do_render($type, $quality); + +} // End Image diff --git a/common/config/bootstrap.php b/common/config/bootstrap.php index fb64fc7..d195e08 100755 --- a/common/config/bootstrap.php +++ b/common/config/bootstrap.php @@ -3,4 +3,5 @@ Yii::setAlias('@common', dirname(__DIR__)); Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend'); Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend'); Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console'); +Yii::setAlias('@storage', dirname(dirname(__DIR__)) . '/storage'); Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage'); diff --git a/common/config/main.php b/common/config/main.php index 721a1c5..61c3de5 100755 --- a/common/config/main.php +++ b/common/config/main.php @@ -69,6 +69,66 @@ return [ ], ], ], + 'artboximage' => [ + 'class' => 'common\components\artboximage\ArtboxImage', + 'driver' => 'GD', //GD or Imagick + 'rootPath' => Yii::getAlias('@storage'), + 'rootUrl' => Yii::getAlias('/storage'), + 'presets' => [ + 'product' => [ + 'resize' => [ + 'width' => 300, + 'height' => 300, + 'master' => null + ], + /*'flip' => [ + 'direction' => \common\components\artboximage\drivers\Image::HORIZONTAL + ]*/ + ], + 'brandlist' => [ + 'resize' => [ + 'width' => 138, + 'height' => 78, + 'master' => null + ], + ], + 'product_trumb' => [ + 'resize' => [ + 'width' => 80, + 'height' => 80, + 'master' => null + ], + ], + 'product_list' => [ + 'resize' => [ + 'width' => 130, + 'height' => 70, + 'master' => null + ], + ], + 'product_list2' => [ + 'resize' => [ + 'width' => 130, + 'height' => 70, + 'master' => null + ], + ], + 'mainmenu' => [ + 'resize' => [ + 'width' => 160, + 'height' => 170, + 'master' => null + ], + ], + 'large' => [ + 'resize' => [ + 'width' => 600, + 'height' => 600, + 'master' => null + ], + ], + ] + ], ], 'modules' => [ diff --git a/common/modules/product/models/Brand.php b/common/modules/product/models/Brand.php index b7c6ef9..7c5882c 100755 --- a/common/modules/product/models/Brand.php +++ b/common/modules/product/models/Brand.php @@ -123,10 +123,10 @@ class Brand extends \yii\db\ActiveRecord } public function getImageFile() { - return empty($this->image) ? null : '/images/brand/'. $this->image; + return empty($this->image) ? null : Yii::getAlias('@storage/brand/'. $this->image); } public function getImageUrl() { - return empty($this->image) ? null : '/images/brand/'. $this->image; + return empty($this->image) ? null : '/storage/brand/'. $this->image; } } diff --git a/common/modules/product/models/Category.php b/common/modules/product/models/Category.php index 7ba9b7a..2b6c773 100755 --- a/common/modules/product/models/Category.php +++ b/common/modules/product/models/Category.php @@ -177,9 +177,13 @@ class Category extends \yii\db\ActiveRecord return empty($this->categoryName) ? null : $this->categoryName->value; } + public function getImageFile() { + return empty($this->image) ? null : Yii::getAlias('@storage/category/'. $this->image); + } + public function getImageUrl() { - return empty($this->image) ? null : '/images/category/' . $this->image; + return empty($this->image) ? null : '/storage/category/' . $this->image; } public function beforeSave($insert) diff --git a/common/modules/product/models/Product.php b/common/modules/product/models/Product.php index b92a057..007ab5b 100755 --- a/common/modules/product/models/Product.php +++ b/common/modules/product/models/Product.php @@ -197,7 +197,7 @@ class Product extends \yii\db\ActiveRecord // $this->imagesUpload = [$this->imagesUpload]; // } // foreach($this->imagesUpload as $image) { -// $image->saveAs((Yii::getAlias('@frontend/web/images/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension))); +// $image->saveAs((Yii::getAlias('@storage/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension))); // } // // @@ -233,12 +233,12 @@ class Product extends \yii\db\ActiveRecord foreach ($this->imagesUpload as $image) { $imageName = $image->baseName .'.'. $image->extension; $i = 0; - while(file_exists(Yii::getAlias('@frontend/web/images/products/' . $imageName))) { + while(file_exists(Yii::getAlias('@storage/products/'. $imageName))) { $i++; $imageName = $image->baseName .'_'. $i .'.'. $image->extension; } - $image->saveAs(Yii::getAlias('@frontend/web/images/products/' .$imageName)); + $image->saveAs(Yii::getAlias('@storage/products/'. $imageName)); $images[] = $imageName; } return $images; diff --git a/common/modules/product/models/ProductImage.php b/common/modules/product/models/ProductImage.php index 307433a..b8b4a79 100755 --- a/common/modules/product/models/ProductImage.php +++ b/common/modules/product/models/ProductImage.php @@ -97,7 +97,7 @@ class ProductImage extends \yii\db\ActiveRecord */ public function getImageFile() { - return isset($this->image) ? '/images/products/' . $this->image : null; + return isset($this->image) ? Yii::getAlias('@storage/products/'. $this->image) : null; } /** @@ -107,7 +107,7 @@ class ProductImage extends \yii\db\ActiveRecord public function getImageUrl() { // return a default image placeholder if your source image is not found - return isset($this->image) ? '/images/products/'. $this->image : 'default.jpg'; + return isset($this->image) ? '/storage/products/'. $this->image : 'default.jpg'; } /** diff --git a/common/modules/product/widgets/views/brandsCarousel.php b/common/modules/product/widgets/views/brandsCarousel.php index 9b4ef14..949aca0 100755 --- a/common/modules/product/widgets/views/brandsCarousel.php +++ b/common/modules/product/widgets/views/brandsCarousel.php @@ -3,7 +3,7 @@ diff --git a/common/modules/product/widgets/views/submenu.php b/common/modules/product/widgets/views/submenu.php index c3d8731..ccb8932 100755 --- a/common/modules/product/widgets/views/submenu.php +++ b/common/modules/product/widgets/views/submenu.php @@ -12,7 +12,7 @@ image)) :?> - imageUrl ? Yii::$app->imageCache->thumb($_item->imageUrl, 'mainmenu') : ''?> + imageUrl ? \common\components\artboximage\ArtboxImageHelper::getImage($_item->imageUrl, 'mainmenu') : ''?>
categoryName->value?>
@@ -34,7 +34,7 @@ image)) :?> - imageUrl ? Yii::$app->imageCache->thumb($_item['item']->imageUrl, 'mainmenu') : ''?> + imageUrl ? \common\components\artboximage\ArtboxImageHelper::getImage($_item['item']->imageUrl, 'mainmenu') : ''?>
categoryName->value?>
diff --git a/common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php b/common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php index 5fe2bed..586b750 100755 --- a/common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php +++ b/common/modules/rubrication/behaviors/ArtboxSynonymBehavior.php @@ -116,7 +116,7 @@ class ArtboxSynonymBehavior extends Behavior { if ($isave) { $valueModel->setAttribute($this->valueOptionId, $this->owner->getAttribute($this->keyNameId)); $valueModel->save(); - if (!empty($this->slug) && empty($this->owner->getAttribute($this->slug['slugKeyName']))) { + if (!empty($this->slug) && empty($this->owner->{$this->slug['slugKeyName']})) { $this->owner->{$this->slug['slugKeyName']} = $this->slugify($valueModel->{$this->slug['valueKeyName']}); } } diff --git a/composer.json b/composer.json index 298acb2..2ad5a4f 100644 --- a/composer.json +++ b/composer.json @@ -5,9 +5,6 @@ "homepage": "http://www.yiiframework.com/", "type": "project", "license": "BSD-3-Clause", - "platform": { - "php": "5.5.0" - }, "support": { "issues": "https://github.com/yiisoft/yii2/issues?state=open", "forum": "http://www.yiiframework.com/forum/", @@ -38,7 +35,13 @@ "unclead/yii2-multiple-input": "~1.0", "codeception/codeception":"*", "phpmailer/phpmailer": "^5.2", - "league/oauth2-client": "^1.3" + "league/oauth2-client": "^1.3", + "kartik-v/yii2-grid": "@dev", + "kartik-v/yii2-mpdf": "@dev", + "kartik-v/yii2-widget-fileinput": "@dev", + "maxmirazh33/yii2-uploadable-cropable-image": "*", + "iutbay/yii2-imagecache": "*", + "yurkinx/yii2-image": "dev-master" }, "require-dev": { "yiisoft/yii2-codeception": "*", diff --git a/composer.lock b/composer.lock deleted file mode 100644 index ce416eb..0000000 --- a/composer.lock +++ /dev/null @@ -1,4040 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "d817e95d434dbdfff82796cc0b6e9c9e", - "content-hash": "a704572d721b5adc21f823d363fcd4de", - "packages": [ - { - "name": "2amigos/yii2-transliterator-helper", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/2amigos/yii2-transliterator-helper.git", - "reference": "1e4284351f4250a8f2ce553ea4f420fcbb424309" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/2amigos/yii2-transliterator-helper/zipball/1e4284351f4250a8f2ce553ea4f420fcbb424309", - "reference": "1e4284351f4250a8f2ce553ea4f420fcbb424309", - "shasum": "" - }, - "require": { - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "autoload": { - "psr-4": { - "dosamigos\\transliterator\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Antonio Ramirez", - "email": "ramirez.cobos@gmail.com", - "homepage": "http://www.ramirezcobos.com" - } - ], - "description": "Transliterator Helper for Yii2.", - "keywords": [ - "extension", - "helper", - "transliterator", - "yii" - ], - "time": "2014-06-23 14:01:30" - }, - { - "name": "almasaeed2010/adminlte", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/almasaeed2010/AdminLTE.git", - "reference": "8db979795044412a2e2b4e9659788c23cb59fcd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/almasaeed2010/AdminLTE/zipball/8db979795044412a2e2b4e9659788c23cb59fcd3", - "reference": "8db979795044412a2e2b4e9659788c23cb59fcd3", - "shasum": "" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Abdullah Almsaeed", - "email": "support@almsaeedstudio.com" - } - ], - "description": "AdminLTE - admin control panel and dashboard that's based on Bootstrap 3", - "homepage": "http://almsaeedstudio.com/", - "keywords": [ - "JS", - "admin", - "back-end", - "css", - "less", - "responsive", - "template", - "theme", - "web" - ], - "time": "2016-03-24 14:31:41" - }, - { - "name": "behat/gherkin", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Behat/Gherkin.git", - "reference": "6f005467f571c3c53477fb0a646ba8092aa54bd4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/6f005467f571c3c53477fb0a646ba8092aa54bd4", - "reference": "6f005467f571c3c53477fb0a646ba8092aa54bd4", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "phpunit/phpunit": "~4.5|~5", - "symfony/phpunit-bridge": "~2.7|~3", - "symfony/yaml": "~2.3|~3" - }, - "suggest": { - "symfony/yaml": "If you want to parse features, represented in YAML files" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-0": { - "Behat\\Gherkin": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - } - ], - "description": "Gherkin DSL parser for PHP 5.3", - "homepage": "http://behat.org/", - "keywords": [ - "BDD", - "Behat", - "Cucumber", - "DSL", - "gherkin", - "parser" - ], - "time": "2015-12-31 10:51:34" - }, - { - "name": "bower-asset/admin-lte", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/almasaeed2010/AdminLTE.git", - "reference": "fe147c9b2188bc3e4c651ca24581a6710d5421ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/almasaeed2010/AdminLTE/zipball/fe147c9b2188bc3e4c651ca24581a6710d5421ff", - "reference": "fe147c9b2188bc3e4c651ca24581a6710d5421ff", - "shasum": "" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "index2.html", - "dist/css/AdminLTE.css", - "dist/js/app.js", - "build/less/AdminLTE.less" - ], - "bower-asset-ignore": [ - "/.*", - "node_modules", - "bower_components", - "composer.json", - "documentation" - ] - }, - "license": [ - "MIT" - ], - "description": "Admin dashboard and control panel template", - "keywords": [ - "admin", - "backend", - "bootstrap", - "css", - "html", - "js", - "responsive", - "template", - "theme" - ], - "time": "2016-03-14 01:14:03" - }, - { - "name": "bower-asset/bootstrap", - "version": "v3.3.5", - "source": { - "type": "git", - "url": "https://github.com/twbs/bootstrap.git", - "reference": "16b48259a62f576e52c903c476bd42b90ab22482" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/16b48259a62f576e52c903c476bd42b90ab22482", - "reference": "16b48259a62f576e52c903c476bd42b90ab22482", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.9.1" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "less/bootstrap.less", - "dist/js/bootstrap.js" - ], - "bower-asset-ignore": [ - "/.*", - "_config.yml", - "CNAME", - "composer.json", - "CONTRIBUTING.md", - "docs", - "js/tests", - "test-infra" - ] - }, - "license": [ - "MIT" - ], - "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", - "keywords": [ - "css", - "framework", - "front-end", - "js", - "less", - "mobile-first", - "responsive", - "web" - ] - }, - { - "name": "bower-asset/fontawesome", - "version": "v4.5.0", - "source": { - "type": "git", - "url": "https://github.com/FortAwesome/Font-Awesome.git", - "reference": "fddd2c240452e6c8990c4ef75e0265b455aa7968" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/fddd2c240452e6c8990c4ef75e0265b455aa7968", - "reference": "fddd2c240452e6c8990c4ef75e0265b455aa7968", - "shasum": "" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "less/font-awesome.less", - "scss/font-awesome.scss" - ], - "bower-asset-ignore": [ - "*/.*", - "*.json", - "src", - "*.yml", - "Gemfile", - "Gemfile.lock", - "*.md" - ] - }, - "license": [ - "OFL-1.1", - "MIT", - "CC-BY-3.0" - ], - "description": "Font Awesome" - }, - { - "name": "bower-asset/jquery", - "version": "2.2.3", - "source": { - "type": "git", - "url": "https://github.com/jquery/jquery-dist.git", - "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/af22a351b2ea5801ffb1695abb3bb34d5bed9198", - "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198", - "shasum": "" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "dist/jquery.js", - "bower-asset-ignore": [ - "package.json" - ] - }, - "license": [ - "MIT" - ], - "keywords": [ - "browser", - "javascript", - "jquery", - "library" - ] - }, - { - "name": "bower-asset/jquery-ui", - "version": "1.11.4", - "source": { - "type": "git", - "url": "https://github.com/components/jqueryui.git", - "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1", - "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.6" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "jquery-ui.js" - ], - "bower-asset-ignore": [] - } - }, - { - "name": "bower-asset/jquery.inputmask", - "version": "3.2.7", - "source": { - "type": "git", - "url": "https://github.com/RobinHerbots/jquery.inputmask.git", - "reference": "5a72c563b502b8e05958a524cdfffafe9987be38" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/5a72c563b502b8e05958a524cdfffafe9987be38", - "reference": "5a72c563b502b8e05958a524cdfffafe9987be38", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.7" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "./dist/inputmask/inputmask.js" - ], - "bower-asset-ignore": [ - "**/*", - "!dist/*", - "!dist/inputmask/*", - "!dist/min/*", - "!dist/min/inputmask/*", - "!extra/bindings/*", - "!extra/dependencyLibs/*", - "!extra/phone-codes/*" - ] - }, - "license": [ - "http://opensource.org/licenses/mit-license.php" - ], - "description": "jquery.inputmask is a jquery plugin which create an input mask.", - "keywords": [ - "form", - "input", - "inputmask", - "jquery", - "mask", - "plugins" - ] - }, - { - "name": "bower-asset/punycode", - "version": "v1.3.2", - "source": { - "type": "git", - "url": "https://github.com/bestiejs/punycode.js.git", - "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", - "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", - "shasum": "" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "punycode.js", - "bower-asset-ignore": [ - "coverage", - "tests", - ".*", - "component.json", - "Gruntfile.js", - "node_modules", - "package.json" - ] - } - }, - { - "name": "bower-asset/yii2-pjax", - "version": "v2.0.6", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/jquery-pjax.git", - "reference": "60728da6ade5879e807a49ce59ef9a72039b8978" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978", - "reference": "60728da6ade5879e807a49ce59ef9a72039b8978", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.8" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "./jquery.pjax.js", - "bower-asset-ignore": [ - ".travis.yml", - "Gemfile", - "Gemfile.lock", - "CONTRIBUTING.md", - "vendor/", - "script/", - "test/" - ] - }, - "license": [ - "MIT" - ] - }, - { - "name": "cebe/markdown", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/cebe/markdown.git", - "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cebe/markdown/zipball/e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5", - "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5", - "shasum": "" - }, - "require": { - "lib-pcre": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "cebe/indent": "*", - "facebook/xhprof": "*@dev", - "phpunit/phpunit": "4.1.*" - }, - "bin": [ - "bin/markdown" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "cebe\\markdown\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", - "role": "Creator" - } - ], - "description": "A super fast, highly extensible markdown parser for PHP", - "homepage": "https://github.com/cebe/markdown#readme", - "keywords": [ - "extensible", - "fast", - "gfm", - "markdown", - "markdown-extra" - ], - "time": "2016-03-18 13:28:11" - }, - { - "name": "cebe/yii2-gravatar", - "version": "1.1", - "target-dir": "cebe/gravatar", - "source": { - "type": "git", - "url": "https://github.com/cebe/yii2-gravatar.git", - "reference": "c9c01bd14c9bdee9e5ae1ef1aad23f80c182c057" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cebe/yii2-gravatar/zipball/c9c01bd14c9bdee9e5ae1ef1aad23f80c182c057", - "reference": "c9c01bd14c9bdee9e5ae1ef1aad23f80c182c057", - "shasum": "" - }, - "require": { - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "autoload": { - "psr-0": { - "cebe\\gravatar\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", - "role": "Core framework development" - } - ], - "description": "Gravatar Widget for Yii 2", - "keywords": [ - "gravatar", - "yii" - ], - "time": "2013-12-10 17:49:58" - }, - { - "name": "codeception/codeception", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Codeception/Codeception.git", - "reference": "a04ceaea52d2a050d8df19df1a85fb1b24456477" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c3a92199d02598de6fb59fa57913a10909628e4f", - "reference": "a04ceaea52d2a050d8df19df1a85fb1b24456477", - "shasum": "" - }, - "require": { - "behat/gherkin": "~4.4.0", - "ext-json": "*", - "ext-mbstring": "*", - "facebook/webdriver": ">=1.0.1 <2.0", - "guzzlehttp/guzzle": ">=4.1.4 <7.0", - "guzzlehttp/psr7": "~1.0", - "php": ">=5.4.0 <8.0", - "phpunit/php-code-coverage": ">=2.1.3", - "phpunit/phpunit": ">4.8.20 <6.0", - "symfony/browser-kit": ">=2.7 <3.1", - "symfony/console": ">=2.7 <3.1", - "symfony/css-selector": ">=2.7 <3.1", - "symfony/dom-crawler": ">=2.7 <3.1", - "symfony/event-dispatcher": ">=2.7 <3.1", - "symfony/finder": ">=2.7 <3.1", - "symfony/yaml": ">=2.7 <3.1" - }, - "require-dev": { - "codeception/specify": "~0.3", - "facebook/php-sdk-v4": "~5.0", - "flow/jsonpath": "~0.2", - "league/factory-muffin": "^3.0", - "league/factory-muffin-faker": "^1.0", - "monolog/monolog": "~1.8", - "pda/pheanstalk": "~3.0", - "php-amqplib/php-amqplib": "~2.4" - }, - "suggest": { - "codeception/specify": "BDD-style code blocks", - "codeception/verify": "BDD-style assertions", - "flow/jsonpath": "For using JSONPath in REST module", - "league/factory-muffin": "For DataFactory module", - "league/factory-muffin-faker": "For Faker support in DataFactory module", - "phpseclib/phpseclib": "for SFTP option in FTP Module" - }, - "bin": [ - "codecept" - ], - "type": "library", - "extra": { - "branch-alias": [] - }, - "autoload": { - "psr-4": { - "Codeception\\": "src\\Codeception", - "Codeception\\Extension\\": "ext" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" - } - ], - "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", - "keywords": [ - "BDD", - "TDD", - "acceptance testing", - "functional testing", - "unit testing" - ], - "time": "2016-03-26 21:39:36" - }, - { - "name": "developeruz/yii2-db-rbac", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/developeruz/yii2-db-rbac.git", - "reference": "28c1b0ebcc45b6365af6f1e9949b4d9cfeaebf1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/developeruz/yii2-db-rbac/zipball/28c1b0ebcc45b6365af6f1e9949b4d9cfeaebf1b", - "reference": "28c1b0ebcc45b6365af6f1e9949b4d9cfeaebf1b", - "shasum": "" - }, - "require": { - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "autoload": { - "psr-4": { - "developeruz\\db_rbac\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Elvira Sheina", - "email": "elleuz@gmail.com", - "homepage": "http://developer.uz" - } - ], - "description": "Dynamic control of access rights in YII2", - "keywords": [ - "rbac", - "yii" - ], - "time": "2015-10-03 05:56:47" - }, - { - "name": "dmstr/yii2-adminlte-asset", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/dmstr/yii2-adminlte-asset.git", - "reference": "73eca05cf04d70f169a88b430d2c03c3b54d623a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dmstr/yii2-adminlte-asset/zipball/73eca05cf04d70f169a88b430d2c03c3b54d623a", - "reference": "73eca05cf04d70f169a88b430d2c03c3b54d623a", - "shasum": "" - }, - "require": { - "almasaeed2010/adminlte": "~2.0", - "cebe/yii2-gravatar": "1.*", - "rmrevin/yii2-fontawesome": "~2.9", - "yiisoft/yii2": "2.*", - "yiisoft/yii2-bootstrap": "2.*" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "dmstr\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Tobias Munk", - "email": "tobias@diemeisterei.de" - }, - { - "name": "Evgeniy Tkachenko", - "email": "et.coder@gmail.com" - } - ], - "description": "Backend theme for Yii2 Framework", - "keywords": [ - "AdminLTE", - "extension", - "yii2" - ], - "time": "2016-03-23 04:18:15" - }, - { - "name": "doctrine/instantiator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/416fb8ad1d095a87f1d21bc40711843cd122fd4a", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14 21:17:01" - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.7.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40", - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, - "files": [ - "library/HTMLPurifier.composer.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "time": "2015-08-05 01:03:42" - }, - { - "name": "facebook/webdriver", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "1c98108ba3eb435b681655764de11502a0653705" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/1c98108ba3eb435b681655764de11502a0653705", - "reference": "1c98108ba3eb435b681655764de11502a0653705", - "shasum": "" - }, - "require": { - "php": ">=5.3.19" - }, - "require-dev": { - "phpunit/phpunit": "4.6.*" - }, - "suggest": { - "phpdocumentor/phpdocumentor": "2.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facebook\\WebDriver\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "A PHP client for WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", - "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" - ], - "time": "2015-12-31 15:58:49" - }, - { - "name": "fortawesome/font-awesome", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/FortAwesome/Font-Awesome.git", - "reference": "f97ab41d187553e86abb8c7f6c057c9c0b88de58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/06b2efcda0d4612eccdaf8b79ae428fd079f2dfb", - "reference": "f97ab41d187553e86abb8c7f6c057c9c0b88de58", - "shasum": "" - }, - "require-dev": { - "jekyll": "1.0.2", - "lessc": "1.4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OFL-1.1", - "MIT" - ], - "authors": [ - { - "name": "Dave Gandy", - "email": "dave@fontawesome.io", - "homepage": "http://twitter.com/davegandy", - "role": "Developer" - } - ], - "description": "The iconic font and CSS framework", - "homepage": "http://fontawesome.io/", - "keywords": [ - "FontAwesome", - "awesome", - "bootstrap", - "font", - "icon" - ], - "time": "2016-03-23 12:04:52" - }, - { - "name": "guzzlehttp/guzzle", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "d094e337976dff9d8e2424e8485872194e768662" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/85cb758d7367f3aaaa8ffc9269e777919c5f68bb", - "reference": "d094e337976dff9d8e2424e8485872194e768662", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "~1.0", - "guzzlehttp/psr7": "~1.1", - "php": ">=5.5.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "~4.0", - "psr/log": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2016-03-21 20:02:09" - }, - { - "name": "guzzlehttp/promises", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8", - "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-03-08 01:15:46" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "31382fef2889136415751badebbd1cb022a4ed72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/31382fef2889136415751badebbd1cb022a4ed72", - "reference": "31382fef2889136415751badebbd1cb022a4ed72", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "time": "2016-04-13 19:56:01" - }, - { - "name": "imagine/imagine", - "version": "0.5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/avalanche123/Imagine.git", - "reference": "343580fceed1f89220481ac98480e92f47d91e6c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/avalanche123/Imagine/zipball/343580fceed1f89220481ac98480e92f47d91e6c", - "reference": "343580fceed1f89220481ac98480e92f47d91e6c", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "sami/sami": "dev-master" - }, - "suggest": { - "ext-gd": "to use the GD implementation", - "ext-gmagick": "to use the Gmagick implementation", - "ext-imagick": "to use the Imagick implementation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "0.5-dev" - } - }, - "autoload": { - "psr-0": { - "Imagine": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bulat Shakirzyanov", - "email": "mallluhuct@gmail.com", - "homepage": "http://avalanche123.com" - } - ], - "description": "Image processing for PHP 5.3", - "homepage": "http://imagine.readthedocs.org/", - "keywords": [ - "drawing", - "graphics", - "image manipulation", - "image processing" - ], - "time": "2014-06-13 10:54:04" - }, - { - "name": "ircmaxell/random-lib", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/RandomLib.git", - "reference": "ad6a37d7bce67b0954be63feb1b4c47da77c527f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/RandomLib/zipball/ad6a37d7bce67b0954be63feb1b4c47da77c527f", - "reference": "ad6a37d7bce67b0954be63feb1b4c47da77c527f", - "shasum": "" - }, - "require": { - "ircmaxell/security-lib": "1.1.*@dev", - "php": ">=5.3.2" - }, - "require-dev": { - "mikey179/vfsstream": "1.1.*", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "RandomLib": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@ircmaxell.com", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A Library For Generating Secure Random Numbers", - "homepage": "https://github.com/ircmaxell/RandomLib", - "keywords": [ - "cryptography", - "random", - "random-numbers", - "random-strings" - ], - "time": "2016-02-22 13:55:31" - }, - { - "name": "ircmaxell/security-lib", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/SecurityLib.git", - "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/SecurityLib/zipball/f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5", - "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "mikey179/vfsstream": "1.1.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "SecurityLib": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@ircmaxell.com", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A Base Security Library", - "homepage": "https://github.com/ircmaxell/SecurityLib", - "time": "2015-03-20 14:31:23" - }, - { - "name": "kartik-v/yii2-krajee-base", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/kartik-v/yii2-krajee-base.git", - "reference": "3e491e51ed742663b239cd6e0b7f76d403bed7e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kartik-v/yii2-krajee-base/zipball/3115b09aeb15a5e06f38dc16860baf153d9bf70e", - "reference": "3e491e51ed742663b239cd6e0b7f76d403bed7e1", - "shasum": "" - }, - "require": { - "yiisoft/yii2-bootstrap": "@dev" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "1.8.x-dev" - } - }, - "autoload": { - "psr-4": { - "kartik\\base\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kartik Visweswaran", - "email": "kartikv2@gmail.com", - "homepage": "http://www.krajee.com/" - } - ], - "description": "Base library and foundation components for all Yii2 Krajee extensions.", - "homepage": "https://github.com/kartik-v/yii2-krajee-base", - "keywords": [ - "base", - "extension", - "foundation", - "krajee", - "widget", - "yii2" - ], - "time": "2016-03-03 12:24:13" - }, - { - "name": "kartik-v/yii2-widget-colorinput", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/kartik-v/yii2-widget-colorinput.git", - "reference": "18537fcdab0f5491d5eebff8e2464ef6a616ee4c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kartik-v/yii2-widget-colorinput/zipball/1a10c5e9a528270e22dc8a5eba404c72f417665a", - "reference": "18537fcdab0f5491d5eebff8e2464ef6a616ee4c", - "shasum": "" - }, - "require": { - "kartik-v/yii2-krajee-base": "*" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "kartik\\color\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD 3-Clause" - ], - "authors": [ - { - "name": "Kartik Visweswaran", - "email": "kartikv2@gmail.com", - "homepage": "http://www.krajee.com/" - } - ], - "description": "An enhanced Yii 2 widget encapsulating the HTML 5 color input (sub repo split from yii2-widgets)", - "homepage": "https://github.com/kartik-v/yii2-widget-colorinput", - "keywords": [ - "HTML5", - "color", - "extension", - "form", - "input", - "jquery", - "plugin", - "widget", - "yii2" - ], - "time": "2016-02-02 14:28:12" - }, - { - "name": "kartik-v/yii2-widget-datepicker", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/kartik-v/yii2-widget-datepicker.git", - "reference": "3f7b38886e334a2c8c4262f155d98812461efd36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kartik-v/yii2-widget-datepicker/zipball/52606c8764a174aa0d5e6483ed811f617c74ee4e", - "reference": "3f7b38886e334a2c8c4262f155d98812461efd36", - "shasum": "" - }, - "require": { - "kartik-v/yii2-krajee-base": "~1.7" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "kartik\\date\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kartik Visweswaran", - "email": "kartikv2@gmail.com", - "homepage": "http://www.krajee.com/" - } - ], - "description": "Enhanced Yii2 wrapper for the bootstrap datepicker plugin (sub repo split from yii2-widgets).", - "homepage": "https://github.com/kartik-v/yii2-widget-datepicker", - "keywords": [ - "date", - "extension", - "form", - "jquery", - "picker", - "plugin", - "select2", - "widget", - "yii2" - ], - "time": "2016-03-29 09:44:50" - }, - { - "name": "kartik-v/yii2-widget-select2", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/kartik-v/yii2-widget-select2.git", - "reference": "cb2a5992cb96bd2939e30ec1c76eba418d6a30af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kartik-v/yii2-widget-select2/zipball/cb2a5992cb96bd2939e30ec1c76eba418d6a30af", - "reference": "cb2a5992cb96bd2939e30ec1c76eba418d6a30af", - "shasum": "" - }, - "require": { - "kartik-v/yii2-krajee-base": "~1.7" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "kartik\\select2\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kartik Visweswaran", - "email": "kartikv2@gmail.com", - "homepage": "http://www.krajee.com/" - } - ], - "description": "Enhanced Yii2 wrapper for the Select2 jQuery plugin (sub repo split from yii2-widgets).", - "homepage": "https://github.com/kartik-v/yii2-widget-select2", - "keywords": [ - "dropdown", - "extension", - "form", - "jquery", - "plugin", - "select2", - "widget", - "yii2" - ], - "time": "2016-03-10 11:33:59" - }, - { - "name": "league/oauth2-client", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/oauth2-client.git", - "reference": "5e5c0bc5bd219515c8d8db8bcb61f19753101b7c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/5e5c0bc5bd219515c8d8db8bcb61f19753101b7c", - "reference": "5e5c0bc5bd219515c8d8db8bcb61f19753101b7c", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "guzzlehttp/guzzle": "~6.0", - "ircmaxell/random-lib": "~1.1", - "php": ">=5.5.0" - }, - "require-dev": { - "jakub-onderka/php-parallel-lint": "0.8.*", - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "0.6.*", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\OAuth2\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Bilbie", - "email": "hello@alexbilbie.com", - "homepage": "http://www.alexbilbie.com", - "role": "Developer" - } - ], - "description": "OAuth 2.0 Client Library", - "keywords": [ - "Authentication", - "SSO", - "authorization", - "identity", - "idp", - "oauth", - "oauth2", - "single sign on" - ], - "time": "2016-02-13 20:18:03" - }, - { - "name": "lusitanian/oauth", - "version": "v0.3.6", - "source": { - "type": "git", - "url": "https://github.com/Lusitanian/PHPoAuthLib.git", - "reference": "4ce8c488971410233eb3b1e6d9ac4e81debb41d5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/4ce8c488971410233eb3b1e6d9ac4e81debb41d5", - "reference": "4ce8c488971410233eb3b1e6d9ac4e81debb41d5", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*", - "predis/predis": "0.8.*@dev", - "symfony/http-foundation": "~2.1" - }, - "suggest": { - "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.", - "predis/predis": "Allows using the Redis storage backend.", - "symfony/http-foundation": "Allows using the Symfony Session storage backend." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.1-dev" - } - }, - "autoload": { - "psr-0": { - "OAuth": "src", - "OAuth\\Unit": "tests" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "David Desberg", - "email": "david@daviddesberg.com" - }, - { - "name": "Pieter Hordijk", - "email": "info@pieterhordijk.com" - } - ], - "description": "PHP 5.3+ oAuth 1/2 Library", - "keywords": [ - "Authentication", - "authorization", - "oauth", - "security" - ], - "time": "2015-09-09 06:43:02" - }, - { - "name": "mihaildev/yii2-ckeditor", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/MihailDev/yii2-ckeditor.git", - "reference": "d20aa7f6bcf610fee226d6eb15212a279875bf87" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MihailDev/yii2-ckeditor/zipball/d20aa7f6bcf610fee226d6eb15212a279875bf87", - "reference": "d20aa7f6bcf610fee226d6eb15212a279875bf87", - "shasum": "" - }, - "require": { - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "mihaildev\\ckeditor\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Mihail", - "email": "mihail.kucher@gmail.com", - "homepage": "https://github.com/MihailDev", - "role": "Developer" - } - ], - "description": "Yii2 CKEditor", - "homepage": "https://github.com/MihailDev/yii2-ckeditor", - "keywords": [ - "CKEditor", - "editor", - "wysiwyg", - "yii" - ], - "time": "2014-11-19 22:04:08" - }, - { - "name": "mihaildev/yii2-elfinder", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/MihailDev/yii2-elfinder.git", - "reference": "64b42572dec94e5c2d0d1630bce8292848a98f4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MihailDev/yii2-elfinder/zipball/64b42572dec94e5c2d0d1630bce8292848a98f4b", - "reference": "64b42572dec94e5c2d0d1630bce8292848a98f4b", - "shasum": "" - }, - "require": { - "yiisoft/yii2-jui": "*" - }, - "type": "yii2-extension", - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "mihaildev\\elfinder\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Mihail", - "email": "mihail.kucher@gmail.com", - "homepage": "https://github.com/MihailDev", - "role": "Developer" - } - ], - "description": "Yii2 ElFinder", - "homepage": "https://github.com/MihailDev/yii2-elfinder", - "keywords": [ - "elfinder", - "filemanager", - "yii" - ], - "time": "2015-07-03 07:08:52" - }, - { - "name": "nodge/lightopenid", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/Nodge/LightOpenID.git", - "reference": "a5492cc0c932c557b7e9b54a6e5bbd85cc5fa041" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nodge/LightOpenID/zipball/a5492cc0c932c557b7e9b54a6e5bbd85cc5fa041", - "reference": "a5492cc0c932c557b7e9b54a6e5bbd85cc5fa041", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "type": "library", - "autoload": { - "classmap": [ - "openid.php", - "provider/provider.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT License" - ], - "authors": [ - { - "name": "Mewp", - "homepage": "http://code.google.com/p/lightopenid/" - }, - { - "name": "Ignat Ignatov", - "homepage": "https://github.com/iignatov/LightOpenID" - } - ], - "description": "Lightweight PHP5 library for easy OpenID authentication.", - "homepage": "https://github.com/Nodge/LightOpenID", - "keywords": [ - "Authentication", - "OpenId" - ], - "time": "2013-08-31 16:48:56" - }, - { - "name": "nodge/yii2-eauth", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Nodge/yii2-eauth.git", - "reference": "f45efd95e3853db33153cc1b856d1f648d221938" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nodge/yii2-eauth/zipball/f45efd95e3853db33153cc1b856d1f648d221938", - "reference": "f45efd95e3853db33153cc1b856d1f648d221938", - "shasum": "" - }, - "require": { - "lib-curl": "*", - "lusitanian/oauth": "~0.3.0", - "nodge/lightopenid": "~1.1.0", - "php": ">=5.4.0", - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "extra": { - "bootstrap": "nodge\\eauth\\Bootstrap" - }, - "autoload": { - "psr-4": { - "nodge\\eauth\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "New BSD License" - ], - "authors": [ - { - "name": "Maxim Zemskov", - "email": "nodge@yandex.ru", - "homepage": "http://nodge.ru/" - } - ], - "description": "Yii2 EAuth Extension. EAuth allows to authenticate users with accounts on other websites (Google, Facebook, Twitter, etc).", - "homepage": "https://github.com/Nodge/yii2-eauth", - "keywords": [ - "Authentication", - "OpenId", - "eauth", - "extension", - "oauth", - "yii2" - ], - "time": "2016-01-13 18:15:48" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, - { - "name": "phpmailer/phpmailer", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "3d4e3b1a0da0a33889f8b0b2afda6ad4f6d011b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/3d4e3b1a0da0a33889f8b0b2afda6ad4f6d011b5", - "reference": "3d4e3b1a0da0a33889f8b0b2afda6ad4f6d011b5", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpdocumentor/phpdocumentor": "2.*", - "phpunit/phpunit": "4.*" - }, - "suggest": { - "league/oauth2-client": "Needed for XOAUTH2 authentication" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2016-04-07 09:04:03" - }, - { - "name": "phpspec/prophecy", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b02221e42163be673f9b44a0bc92a8b4907a7c6d", - "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2016-02-21 17:41:21" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-10-06 15:47:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2015-06-21 13:08:43" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21 13:50:34" - }, - { - "name": "phpunit/php-timer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2015-06-21 08:01:12" - }, - { - "name": "phpunit/php-token-stream", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644", - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-09-23 14:46:55" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1a1b63266c046e1856fd03812a4e0ac2b51aa2d5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/496745aeba741e63b7149da3e1f712d441751182", - "reference": "1a1b63266c046e1856fd03812a4e0ac2b51aa2d5", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2016-03-14 15:10:21" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2015-10-02 06:51:40" - }, - { - "name": "psr/http-message", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2015-05-04 20:22:00" - }, - { - "name": "rmrevin/yii2-comments", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/rmrevin/yii2-comments.git", - "reference": "c68ddf276fe24ece0173781a8f7391a2cf7e6a12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rmrevin/yii2-comments/zipball/c68ddf276fe24ece0173781a8f7391a2cf7e6a12", - "reference": "c68ddf276fe24ece0173781a8f7391a2cf7e6a12", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "rmrevin/yii2-fontawesome": "~2.10", - "yiisoft/yii2": "2.0.*" - }, - "type": "yii2-extension", - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "rmrevin\\yii\\module\\Comments\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Revin", - "email": "xgismox@gmail.com", - "homepage": "http://rmrevin.ru/" - } - ], - "description": "Comments module for Yii2", - "keywords": [ - "comment", - "module", - "widget", - "yii" - ], - "time": "2016-03-01 13:18:41" - }, - { - "name": "rmrevin/yii2-fontawesome", - "version": "2.13.0", - "source": { - "type": "git", - "url": "https://github.com/rmrevin/yii2-fontawesome.git", - "reference": "2efbfacb22be59f373d11a7e3dfa9213e2ba18a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rmrevin/yii2-fontawesome/zipball/2efbfacb22be59f373d11a7e3dfa9213e2ba18a9", - "reference": "2efbfacb22be59f373d11a7e3dfa9213e2ba18a9", - "shasum": "" - }, - "require": { - "bower-asset/fontawesome": "4.5.*", - "php": ">=5.4.0", - "yiisoft/yii2": "2.0.*" - }, - "type": "yii2-extension", - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "rmrevin\\yii\\fontawesome\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Revin Roman", - "email": "roman@rmrevin.com", - "homepage": "https://rmrevin.com/" - } - ], - "description": "Asset Bundle for Yii2 with Font Awesome", - "keywords": [ - "asset", - "awesome", - "bundle", - "font", - "yii" - ], - "time": "2015-11-26 15:24:53" - }, - { - "name": "sebastian/comparator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2015-07-26 15:48:44" - }, - { - "name": "sebastian/diff", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2015-12-08 07:14:41" - }, - { - "name": "sebastian/environment", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2016-02-26 18:40:46" - }, - { - "name": "sebastian/exporter", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f88f8936517d54ae6d589166810877fb2015d0a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f88f8936517d54ae6d589166810877fb2015d0a2", - "reference": "f88f8936517d54ae6d589166810877fb2015d0a2", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2015-08-09 04:23:41" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12 03:26:01" - }, - { - "name": "sebastian/recursion-context", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-01-28 05:39:29" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" - }, - { - "name": "swiftmailer/swiftmailer", - "version": "5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9", - "reference": "fffbc0e2a7e376dbb0a4b5f2ff6847330f20ccf9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "mockery/mockery": "~0.9.1,<0.9.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.4-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", - "keywords": [ - "email", - "mail", - "mailer" - ], - "time": "2016-01-03 15:42:47" - }, - { - "name": "symfony/browser-kit", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "e07127ac31230b30887c2dddf3708d883d239b14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e07127ac31230b30887c2dddf3708d883d239b14", - "reference": "e07127ac31230b30887c2dddf3708d883d239b14", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "symfony/dom-crawler": "~2.8|~3.0" - }, - "require-dev": { - "symfony/css-selector": "~2.8|~3.0", - "symfony/process": "~2.8|~3.0" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "https://symfony.com", - "time": "2016-03-04 07:55:57" - }, - { - "name": "symfony/console", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "6b1175135bc2a74c08a28d89761272de8beed8cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7541c505d2b804cc65a4edf90a6f1cb496523fef", - "reference": "6b1175135bc2a74c08a28d89761272de8beed8cd", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.8|~3.0", - "symfony/process": "~2.8|~3.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2016-03-16 17:00:50" - }, - { - "name": "symfony/css-selector", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "65e764f404685f2dc20c057e889b3ad04b2e2db0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/65e764f404685f2dc20c057e889b3ad04b2e2db0", - "reference": "65e764f404685f2dc20c057e889b3ad04b2e2db0", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com", - "time": "2016-03-04 07:55:57" - }, - { - "name": "symfony/dom-crawler", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "18a06d7a9af41718c20764a674a0ebba3bc40d1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/49b588841225b205700e5122fa01911cabada857", - "reference": "18a06d7a9af41718c20764a674a0ebba3bc40d1f", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "symfony/css-selector": "~2.8|~3.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "https://symfony.com", - "time": "2016-03-23 13:23:25" - }, - { - "name": "symfony/event-dispatcher", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9002dcf018d884d294b1ef20a6f968efc1128f39" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/17b04e6b1ede45b57d3ad5146abe50df6c3968b4", - "reference": "9002dcf018d884d294b1ef20a6f968efc1128f39", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0", - "symfony/dependency-injection": "~2.8|~3.0", - "symfony/expression-language": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2016-03-10 10:34:12" - }, - { - "name": "symfony/finder", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "c54e407b35bc098916704e9fd090da21da4c4f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/c54e407b35bc098916704e9fd090da21da4c4f52", - "reference": "c54e407b35bc098916704e9fd090da21da4c4f52", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2016-03-10 11:13:05" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "1289d16209491b584839022f29257ad859b8532d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d", - "reference": "1289d16209491b584839022f29257ad859b8532d", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2016-01-20 09:13:37" - }, - { - "name": "symfony/yaml", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "0047c8366744a16de7516622c5b7355336afae96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0047c8366744a16de7516622c5b7355336afae96", - "reference": "0047c8366744a16de7516622c5b7355336afae96", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2016-03-04 07:55:57" - }, - { - "name": "unclead/yii2-multiple-input", - "version": "1.2.12", - "source": { - "type": "git", - "url": "https://github.com/unclead/yii2-multiple-input.git", - "reference": "3fd9a3ab9b7d11951f6aa708ba13406868e537fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/unclead/yii2-multiple-input/zipball/3fd9a3ab9b7d11951f6aa708ba13406868e537fd", - "reference": "3fd9a3ab9b7d11951f6aa708ba13406868e537fd", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "autoload": { - "psr-4": { - "unclead\\widgets\\examples\\": "examples/", - "unclead\\widgets\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Eugene Tupikov", - "email": "unclead.nsk@gmail.com" - } - ], - "description": "Widget for handle multiple inputs for an attribute of Yii2 framework model", - "keywords": [ - "yii2", - "yii2 array input", - "yii2 multiple field", - "yii2 multiple input", - "yii2 tabular input" - ], - "time": "2016-03-09 09:01:35" - }, - { - "name": "yiisoft/yii2", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-framework.git", - "reference": "bcc317666439a8ec1dc28874e0577b860b6dd6b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/b7e62df2cfa1dfab4e70223770a99c3798d4a412", - "reference": "bcc317666439a8ec1dc28874e0577b860b6dd6b3", - "shasum": "" - }, - "require": { - "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable", - "bower-asset/jquery.inputmask": "~3.2.2", - "bower-asset/punycode": "1.3.*", - "bower-asset/yii2-pjax": "~2.0.1", - "cebe/markdown": "~1.0.0 | ~1.1.0", - "ext-ctype": "*", - "ext-mbstring": "*", - "ezyang/htmlpurifier": "~4.6", - "lib-pcre": "*", - "php": ">=5.4.0", - "yiisoft/yii2-composer": "~2.0.4" - }, - "bin": [ - "yii" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com", - "homepage": "http://www.yiiframework.com/", - "role": "Founder and project lead" - }, - { - "name": "Alexander Makarov", - "email": "sam@rmcreative.ru", - "homepage": "http://rmcreative.ru/", - "role": "Core framework development" - }, - { - "name": "Maurizio Domba", - "homepage": "http://mdomba.info/", - "role": "Core framework development" - }, - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", - "role": "Core framework development" - }, - { - "name": "Timur Ruziev", - "email": "resurtm@gmail.com", - "homepage": "http://resurtm.com/", - "role": "Core framework development" - }, - { - "name": "Paul Klimov", - "email": "klimov.paul@gmail.com", - "role": "Core framework development" - }, - { - "name": "Dmitry Naumenko", - "email": "d.naumenko.a@gmail.com", - "role": "Core framework development" - } - ], - "description": "Yii PHP Framework Version 2", - "homepage": "http://www.yiiframework.com/", - "keywords": [ - "framework", - "yii2" - ], - "time": "2016-03-30 14:53:41" - }, - { - "name": "yiisoft/yii2-bootstrap", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-bootstrap.git", - "reference": "4dd9f52e2a376a875d998de6ab4c381291b0c69e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/772b610ea7940059584f9220f7b87e4b2b1a0e78", - "reference": "4dd9f52e2a376a875d998de6ab4c381291b0c69e", - "shasum": "" - }, - "require": { - "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*", - "yiisoft/yii2": ">=2.0.6" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "yii\\bootstrap\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The Twitter Bootstrap extension for the Yii framework", - "keywords": [ - "bootstrap", - "yii2" - ], - "time": "2016-03-30 22:44:25" - }, - { - "name": "yiisoft/yii2-composer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-composer.git", - "reference": "348122de0b2c2e343b579f93fcda1da78cab4912" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/f5fe6ba58dbc92b37daed5d9bd94cda777852ee4", - "reference": "348122de0b2c2e343b579f93fcda1da78cab4912", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "yii\\composer\\Plugin", - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\composer\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The composer plugin for Yii extension installer", - "keywords": [ - "composer", - "extension installer", - "yii2" - ], - "time": "2016-03-21 19:11:44" - }, - { - "name": "yiisoft/yii2-imagine", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-imagine.git", - "reference": "a6c34ef6b69fb4670ba987ce4b9cfdb2131a8b99" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-imagine/zipball/3be1ecc324aa156a97f03e3fc59045c8d61be1f8", - "reference": "a6c34ef6b69fb4670ba987ce4b9cfdb2131a8b99", - "shasum": "" - }, - "require": { - "imagine/imagine": "0.5.*", - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\imagine\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Antonio Ramirez", - "email": "amigo.cobos@gmail.com" - } - ], - "description": "The Imagine integration for the Yii framework", - "keywords": [ - "helper", - "image", - "imagine", - "yii2" - ], - "time": "2016-03-21 19:13:31" - }, - { - "name": "yiisoft/yii2-jui", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-jui.git", - "reference": "69cd9763b4807dbbce367d599dc615c5b8a8ef4f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-jui/zipball/9ab9a2cb17cd7f13921339e11e5146295cf39083", - "reference": "69cd9763b4807dbbce367d599dc615c5b8a8ef4f", - "shasum": "" - }, - "require": { - "bower-asset/jquery-ui": "1.11.*@stable", - "yiisoft/yii2": ">=2.0.4" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "yii\\jui\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The Jquery UI extension for the Yii framework", - "keywords": [ - "jQuery UI", - "yii2" - ], - "time": "2016-03-29 21:32:13" - }, - { - "name": "yiisoft/yii2-swiftmailer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-swiftmailer.git", - "reference": "20775fef1047cd927908270a8d7983580304eb57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/163b9c6273e133c43a596aef46a9f5b1537731f9", - "reference": "20775fef1047cd927908270a8d7983580304eb57", - "shasum": "" - }, - "require": { - "swiftmailer/swiftmailer": "~5.0", - "yiisoft/yii2": ">=2.0.4" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\swiftmailer\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Paul Klimov", - "email": "klimov.paul@gmail.com" - } - ], - "description": "The SwiftMailer integration for the Yii framework", - "keywords": [ - "email", - "mail", - "mailer", - "swift", - "swiftmailer", - "yii2" - ], - "time": "2016-03-21 19:16:09" - } - ], - "packages-dev": [ - { - "name": "bower-asset/typeahead.js", - "version": "v0.11.1", - "source": { - "type": "git", - "url": "https://github.com/twitter/typeahead.js.git", - "reference": "588440f66559714280628a4f9799f0c4eb880a4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/588440f66559714280628a4f9799f0c4eb880a4a", - "reference": "588440f66559714280628a4f9799f0c4eb880a4a", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.7" - }, - "require-dev": { - "bower-asset/jasmine-ajax": "~1.3.1", - "bower-asset/jasmine-jquery": "~1.5.2", - "bower-asset/jquery": "~1.7" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "dist/typeahead.bundle.js" - } - }, - { - "name": "fzaninotto/faker", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "8deb6343c80c4edf546a6fff01a2b05c7dc59ac4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/1c33e894fbbad6cf65bd42871719cd33227ed6a7", - "reference": "8deb6343c80c4edf546a6fff01a2b05c7dc59ac4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "time": "2016-03-29 16:49:43" - }, - { - "name": "phpspec/php-diff", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpspec/php-diff.git", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Diff": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Chris Boulton", - "homepage": "http://github.com/chrisboulton", - "role": "Original developer" - } - ], - "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", - "time": "2013-11-01 13:02:21" - }, - { - "name": "yiisoft/yii2-codeception", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-codeception.git", - "reference": "e01b3c46917b3f00c42f6a4aabf612cc36d792e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-codeception/zipball/572a6d46d942cc5733c45931fdbd1d60228f3c89", - "reference": "e01b3c46917b3f00c42f6a4aabf612cc36d792e6", - "shasum": "" - }, - "require": { - "yiisoft/yii2": ">=2.0.4" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\codeception\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Mark Jebri", - "email": "mark.github@yandex.ru" - } - ], - "description": "The Codeception integration for the Yii framework", - "keywords": [ - "codeception", - "yii2" - ], - "time": "2016-03-21 19:11:26" - }, - { - "name": "yiisoft/yii2-debug", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-debug.git", - "reference": "081795536b31d29106b0d1de0cb3aefa3e05e995" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/e26905af4bc1ca5ecbababac112c7f7f722cabd2", - "reference": "081795536b31d29106b0d1de0cb3aefa3e05e995", - "shasum": "" - }, - "require": { - "yiisoft/yii2": ">=2.0.4", - "yiisoft/yii2-bootstrap": "*" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\debug\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The debugger extension for the Yii framework", - "keywords": [ - "debug", - "debugger", - "yii2" - ], - "time": "2016-03-21 19:12:39" - }, - { - "name": "yiisoft/yii2-faker", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-faker.git", - "reference": "a8daa97749e7154d91676405a1c59ed81e1ca999" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/6e6eb430809e3f9c05e367303909a05a4912d4c0", - "reference": "a8daa97749e7154d91676405a1c59ed81e1ca999", - "shasum": "" - }, - "require": { - "fzaninotto/faker": "~1.4", - "yiisoft/yii2": "*" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\faker\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Mark Jebri", - "email": "mark.github@yandex.ru" - } - ], - "description": "Fixture generator. The Faker integration for the Yii framework.", - "keywords": [ - "Fixture", - "faker", - "yii2" - ], - "time": "2016-03-21 19:13:03" - }, - { - "name": "yiisoft/yii2-gii", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-gii.git", - "reference": "989d6c52c92e51f0d562729c329ee1012191cba2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/70edab5a7938b5bf4b5dc3ad1e1c3ce673552f48", - "reference": "989d6c52c92e51f0d562729c329ee1012191cba2", - "shasum": "" - }, - "require": { - "bower-asset/typeahead.js": "0.10.* | ~0.11.0", - "phpspec/php-diff": ">=1.0.2", - "yiisoft/yii2": ">=2.0.4", - "yiisoft/yii2-bootstrap": "~2.0" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - }, - "autoload": { - "psr-4": { - "yii\\gii\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The Gii extension for the Yii framework", - "keywords": [ - "code generator", - "gii", - "yii2" - ], - "time": "2016-03-21 19:13:26" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": { - "kartik-v/yii2-widget-select2": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.4.0" - }, - "platform-dev": [] -} diff --git a/frontend/views/catalog/product.php b/frontend/views/catalog/product.php index a581e8a..32d656e 100755 --- a/frontend/views/catalog/product.php +++ b/frontend/views/catalog/product.php @@ -1,4 +1,7 @@ title = $product->name; @@ -16,7 +19,7 @@ $this->params['breadcrumbs'][] = $product->name .' #'. $product->variant->sku; image)) :?> <?= $product->name?> - image->imageUrl ? Yii::$app->imageCache->thumb($product->image->imageUrl, 'product') : ''?> + image->imageUrl ? ArtboxImageHelper::getImage($product->image->imageUrl, 'product') : ''?>