Exemple #1
0
 /**
  * Gets an image URL (cdn if needed) from a bunch of params
  */
 public static function getUrlFromParams($params)
 {
     if (!is_array($params)) {
         return null;
     }
     $url = $params['url'];
     unset($params['url']);
     // Do some CDN magic if needed
     if (\Config::get('cmf.cdn.enabled') && ($cdn = \CMF\Storage::getCDNAdapter())) {
         $original = isset($params['path']) ? $params['path'] : ltrim($url, '/');
         $ext = '';
         // Generate a resized copy of the image locally
         if (isset($params['path'])) {
             unset($params['path']);
             try {
                 $resized = $remote = static::server()->makeImage($original, $params);
                 $sourceAdapter = static::server()->getCache();
                 $ext = @pathinfo(DOCROOT . $original, PATHINFO_EXTENSION) ?: '';
                 if (!empty($ext)) {
                     $remote .= '.' . $ext;
                 }
             } catch (\Exception $e) {
                 return $url;
             }
         } else {
             $resized = $original;
             $remote = $original . '/' . pathinfo(DOCROOT . $original, PATHINFO_BASENAME);
             $sourceAdapter = static::server()->getSource();
         }
         // Try and find a cached version of this file
         $paths = array($original, $resized);
         $files = \DB::query("SELECT * FROM `_files` AS f WHERE f.path IN:paths ORDER BY f.id DESC")->bind('paths', $paths)->execute()->as_array();
         $originalInfo = null;
         $resizedInfo = null;
         foreach ($files as $file) {
             if (is_null($originalInfo) && @$file['storage'] == 'local') {
                 $originalInfo = $file;
                 if (!is_null($resizedInfo)) {
                     break;
                 }
             }
             if (is_null($resizedInfo) && @$file['storage'] == 'cdn' && $file['path'] == $resized) {
                 $resizedInfo = $file;
                 if (!is_null($originalInfo)) {
                     break;
                 }
             }
         }
         // If there's no file in the DB, we might need to push to the CDN
         if (is_null($resizedInfo)) {
             // Write the file to CDN if it doesn't exist there
             if (!$cdn->has($remote)) {
                 $cdn->write($remote, $sourceAdapter->read($resized), array('visibility' => 'public'));
             }
             $url = '/' . $remote;
             // Write a file entry to the database
             \DB::insert('_files')->set(array('path' => $resized, 'url' => $url, 'type' => !empty($originalInfo) ? $originalInfo['type'] : null, 'field' => !empty($originalInfo) ? $originalInfo['field'] : null, 'storage' => 'cdn', 'params' => !empty($params) ? serialize($params) : null, 'parent' => !empty($originalInfo) ? intval($originalInfo['id']) : null, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s')))->execute();
         } else {
             // Fill in missing information to the file record if we have it now
             if (!is_null($originalInfo) && empty($resizedInfo['parent'])) {
                 \DB::update('_files')->set(array('parent' => intval(@$originalInfo['id']), 'type' => @$originalInfo['type'], 'field' => @$originalInfo['field']))->where('id', '=', $resizedInfo['id'])->execute();
             }
             $url = $resizedInfo['url'];
         }
         return rtrim(\Config::get('cmf.cdn.base_url', ''), '/') . $url;
     }
     return $url;
 }