Blame view

components/artboximage/ArtboxImageHelper.php 6.71 KB
01799a55   Yarik   first commit
1
2
  <?php
      
d0c66642   Yarik   Namespaces
3
      namespace artweb\artbox\components\artboximage;
01799a55   Yarik   first commit
4
5
6
7
      
      use Yii;
      use yii\base\Object;
      use yii\helpers\Html;
ce8a5e76   Administrator   add variantSku
8
  
01799a55   Yarik   first commit
9
10
      class ArtboxImageHelper extends Object
      {
01799a55   Yarik   first commit
11
12
13
14
15
16
17
18
19
20
21
22
23
          /**
           * @var  ArtboxImage $imageDriver
           */
          private static $imageDriver;
          
          /**
           * @var array $presets
           */
          private static $presets;
          
          /**
           * Get image manipulation driver
           *
d0c66642   Yarik   Namespaces
24
           * @return \artweb\artbox\components\artboximage\ArtboxImage
01799a55   Yarik   first commit
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
           */
          public static function getDriver()
          {
              if (empty( self::$imageDriver )) {
                  self::$imageDriver = Yii::$app->get('artboximage');
              }
              return self::$imageDriver;
          }
          
          /**
           * Get named preset from driver preset list.
           *
           * @param string $preset
           *
           * @return array|null
           */
          public static function getPreset($preset)
          {
              if (empty( self::$presets )) {
                  self::$presets = self::getDriver()->presets;
              }
              return empty( self::$presets[ $preset ] ) ? null : self::$presets[ $preset ];
          }
8e5f1983   Yarik   Image helper improve
48
      
01799a55   Yarik   first commit
49
50
51
52
53
54
          /**
           * Get image HTML for image
           *
           * @param string       $file
           * @param array|string $preset
           * @param array        $imgOptions
8e5f1983   Yarik   Image helper improve
55
           * @param int          $quality
a6322189   Yarik   Lazyload
56
           * @param bool         $lazy
01799a55   Yarik   first commit
57
           *
01799a55   Yarik   first commit
58
           * @return string
8e5f1983   Yarik   Image helper improve
59
           * @see Html::img()
01799a55   Yarik   first commit
60
           */
a6322189   Yarik   Lazyload
61
          public static function getImage($file, $preset, $imgOptions = [], $quality = 65, $lazy = false)
01799a55   Yarik   first commit
62
63
          {
              $preset_alias = is_array($preset) ? array_keys($preset)[ 0 ] : null;
a6322189   Yarik   Lazyload
64
65
              $src = self::getImageSrc($file, $preset, $preset_alias, $quality);
              if($lazy) {
a556e990   Yarik   Lazyload
66
                  $square = self::getImageSrc('/white.jpg', $preset, $preset_alias, 10);
a6322189   Yarik   Lazyload
67
68
69
70
71
                  if(isset($imgOptions['class'])) {
                      $imgOptions['class'] = $imgOptions['class'].' artbox-lazy';
                  } else {
                      $imgOptions['class'] = 'artbox-lazy';
                  }
001da090   Yarik   Lazyload
72
                  $imgOptions['data-original'] = $src;
a556e990   Yarik   Lazyload
73
                  return Html::img($square, $imgOptions);
a6322189   Yarik   Lazyload
74
75
76
              } else {
                  return Html::img($src, $imgOptions);
              }
01799a55   Yarik   first commit
77
          }
8e5f1983   Yarik   Image helper improve
78
      
01799a55   Yarik   first commit
79
80
81
82
83
84
          /**
           * Get src for image
           *
           * @param string      $file
           * @param string      $preset
           * @param null|string $preset_alias
8e5f1983   Yarik   Image helper improve
85
           * @param int         $quality
01799a55   Yarik   first commit
86
87
88
           *
           * @return bool|string
           */
a1dded18   Administrator   add variantSku
89
          public static function getImageSrc($file, $preset, $preset_alias = null, $quality = 65)
01799a55   Yarik   first commit
90
91
92
93
94
95
96
97
          {
              if (is_string($preset)) {
                  $preset_alias = $preset;
                  $preset = self::getPreset($preset);
              }
              if (empty( $preset ) || empty( $preset_alias )) {
                  return $file;
              }
01799a55   Yarik   first commit
98
99
100
101
102
103
104
105
106
              $filePath = self::getPathFromUrl($file);
              if (!file_exists($filePath) || !preg_match(
                      '#^(.*)\.(' . self::getExtensionsRegexp() . ')$#',
                      $file,
                      $matches
                  )
              ) {
                  return $file;
              }
8e5f1983   Yarik   Image helper improve
107
              return self::getPresetUrl($filePath, $preset, $preset_alias, $quality);
01799a55   Yarik   first commit
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
          }
          
          /**
           * Replace web path with file path
           *
           * @param string $url
           *
           * @return string
           */
          private static function getPathFromUrl($url)
          {
              return substr_replace($url, self::getDriver()->rootPath, 0, strlen(self::getDriver()->rootUrl));
          }
          
          /**
           * Replace file path with web path
           *
           * @param string $path
           *
           * @return string
           */
          private static function getUrlFromPath($path)
          {
              return substr_replace($path, self::getDriver()->rootUrl, 0, strlen(self::getDriver()->rootPath));
          }
8e5f1983   Yarik   Image helper improve
133
      
01799a55   Yarik   first commit
134
135
136
137
138
139
          /**
           * Get formatted file url or create it if not exist
           *
           * @param string $filePath
           * @param array  $preset
           * @param string $preset_alias
8e5f1983   Yarik   Image helper improve
140
           * @param int    $quality
01799a55   Yarik   first commit
141
142
143
           *
           * @return bool|string
           */
a1dded18   Administrator   add variantSku
144
          private static function getPresetUrl($filePath, $preset, $preset_alias, $quality = 65)
01799a55   Yarik   first commit
145
146
147
148
149
150
151
152
153
154
155
          {
              $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);
              }
8e5f1983   Yarik   Image helper improve
156
              $output = self::createPresetImage($filePath, $preset, $preset_alias, $quality);
01799a55   Yarik   first commit
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
              if (!empty( $output )) {
                  $f = fopen($presetFilePath, 'w');
                  fwrite($f, $output);
                  fclose($f);
                  return $presetUrl;
              }
              return false;
          }
          
          /**
           * Create formatted image.
           * Available manipulations:
           * * resize
           * * flip
           *
8e5f1983   Yarik   Image helper improve
172
173
174
175
           * @param string  $filePath
           * @param array   $preset
           * @param string  $preset_alias
           * @param integer $quality
01799a55   Yarik   first commit
176
177
178
           *
           * @return string
           */
a1dded18   Administrator   add variantSku
179
          private static function createPresetImage($filePath, $preset, $preset_alias, $quality = 65)
01799a55   Yarik   first commit
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
          {
              $image = self::getDriver()
                           ->load($filePath);
              foreach ($preset as $action => $data) {
                  switch ($action) {
                      case 'resize':
                          $width = empty( $data[ 'width' ] ) ? null : $data[ 'width' ];
                          $height = empty( $data[ 'height' ] ) ? null : $data[ 'height' ];
                          $master = empty( $data[ 'master' ] ) ? null : $data[ 'master' ];
                          $image->resize($width, $height, $master);
                          break;
                      case 'flip':
                          $image->flip(@$data[ 'direction' ]);
                          break;
                      default:
                          break;
                  }
              }
8b501335   Yarik   Image test
198
              return $image->render(null, $quality);
01799a55   Yarik   first commit
199
200
201
202
203
204
205
206
207
208
209
210
211
          }
          
          /**
           * Get extensions regexp
           *
           * @return string regexp
           */
          private static function getExtensionsRegexp()
          {
              $keys = array_keys(self::getDriver()->extensions);
              return '(?i)' . join('|', $keys);
          }
      }