Blame view

components/artboximage/ArtboxImageHelper.php 6.16 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
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
      
      use Yii;
      use yii\base\Object;
      use yii\helpers\Html;
      
      class ArtboxImageHelper extends Object
      {
          
          /**
           * @var  ArtboxImage $imageDriver
           */
          private static $imageDriver;
          
          /**
           * @var array $presets
           */
          private static $presets;
          
          /**
           * Get image manipulation driver
           *
d0c66642   Yarik   Namespaces
25
           * @return \artweb\artbox\components\artboximage\ArtboxImage
01799a55   Yarik   first commit
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
           */
          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
49
      
01799a55   Yarik   first commit
50
51
52
53
54
55
          /**
           * Get image HTML for image
           *
           * @param string       $file
           * @param array|string $preset
           * @param array        $imgOptions
8e5f1983   Yarik   Image helper improve
56
           * @param int          $quality
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
           */
8e5f1983   Yarik   Image helper improve
61
          public static function getImage($file, $preset, $imgOptions = [], $quality = 75)
01799a55   Yarik   first commit
62
63
          {
              $preset_alias = is_array($preset) ? array_keys($preset)[ 0 ] : null;
8e5f1983   Yarik   Image helper improve
64
              return Html::img(self::getImageSrc($file, $preset, $preset_alias, $quality), $imgOptions);
01799a55   Yarik   first commit
65
          }
8e5f1983   Yarik   Image helper improve
66
      
01799a55   Yarik   first commit
67
68
69
70
71
72
          /**
           * Get src for image
           *
           * @param string      $file
           * @param string      $preset
           * @param null|string $preset_alias
8e5f1983   Yarik   Image helper improve
73
           * @param int         $quality
01799a55   Yarik   first commit
74
75
76
           *
           * @return bool|string
           */
8e5f1983   Yarik   Image helper improve
77
          public static function getImageSrc($file, $preset, $preset_alias = null, $quality = 75)
01799a55   Yarik   first commit
78
79
80
81
82
83
84
85
          {
              if (is_string($preset)) {
                  $preset_alias = $preset;
                  $preset = self::getPreset($preset);
              }
              if (empty( $preset ) || empty( $preset_alias )) {
                  return $file;
              }
01799a55   Yarik   first commit
86
87
88
89
90
91
92
93
94
              $filePath = self::getPathFromUrl($file);
              if (!file_exists($filePath) || !preg_match(
                      '#^(.*)\.(' . self::getExtensionsRegexp() . ')$#',
                      $file,
                      $matches
                  )
              ) {
                  return $file;
              }
8e5f1983   Yarik   Image helper improve
95
              return self::getPresetUrl($filePath, $preset, $preset_alias, $quality);
01799a55   Yarik   first commit
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
          }
          
          /**
           * 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
121
      
01799a55   Yarik   first commit
122
123
124
125
126
127
          /**
           * 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
128
           * @param int    $quality
01799a55   Yarik   first commit
129
130
131
           *
           * @return bool|string
           */
8e5f1983   Yarik   Image helper improve
132
          private static function getPresetUrl($filePath, $preset, $preset_alias, $quality = 75)
01799a55   Yarik   first commit
133
134
135
136
137
138
139
140
141
142
143
          {
              $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
144
              $output = self::createPresetImage($filePath, $preset, $preset_alias, $quality);
01799a55   Yarik   first commit
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
              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
160
161
162
163
           * @param string  $filePath
           * @param array   $preset
           * @param string  $preset_alias
           * @param integer $quality
01799a55   Yarik   first commit
164
165
166
           *
           * @return string
           */
8e5f1983   Yarik   Image helper improve
167
          private static function createPresetImage($filePath, $preset, $preset_alias, $quality = 75)
01799a55   Yarik   first commit
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
          {
              $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;
                  }
              }
84c5618b   Yarik   Image test
186
              return $image->render(null, 30);
01799a55   Yarik   first commit
187
188
189
190
191
192
193
194
195
196
197
198
199
          }
          
          /**
           * Get extensions regexp
           *
           * @return string regexp
           */
          private static function getExtensionsRegexp()
          {
              $keys = array_keys(self::getDriver()->extensions);
              return '(?i)' . join('|', $keys);
          }
      }