/** * 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; }