Index: trunk/kernel/units/images/image_tag_processor.php =================================================================== diff -u -N -r7867 -r8388 --- trunk/kernel/units/images/image_tag_processor.php (.../image_tag_processor.php) (revision 7867) +++ trunk/kernel/units/images/image_tag_processor.php (.../image_tag_processor.php) (revision 8388) @@ -2,21 +2,32 @@ class ImageTagProcessor extends kDBTagProcessor { - function Image($params) + /** + * Prepares all image parameters as list block parameters (for easy usage) + * + * @param kDBList $object + * @param Array $block_params + * @author Alex + */ + function PrepareListElementParams(&$object, &$block_params) { - $params['img_path'] = $this->ImageSrc($params); - if ($params['img_path'] === false) return ; - $params['img_size'] = $this->ImageSize($params); - if (!$params['img_size']){ - $params['img_size'] = ' width="'.getArrayValue($params, 'DefaultWidth').'"'; + $image_url = $this->ImageSrc($block_params); + if (!$image_url) { + return ; } - $object =& $this->Application->recallObject($this->getPrefixSpecial(), null); - $params['alt'] = htmlspecialchars($object->GetField('AltName')); - $params['name'] = $this->SelectParam($params, 'block,render_as'); - - return $this->Application->ParseBlock($params); + + $block_params['img_path'] = $image_url; + $image_dimensions = $this->ImageSize($block_params); + $block_params['img_size'] = $image_dimensions ? $image_dimensions : ' width="'.$block_params['DefaultWidth'].'"'; + $block_params['alt'] = htmlspecialchars($object->GetField('AltName')); // really used ? } - + + /** + * [AGGREGATED TAG] works as + * + * @param Array $params + * @return string + */ function ItemImage($params) { $this->LoadItemImage($params); @@ -28,15 +39,16 @@ } } $params['name'] = $this->SelectParam($params, 'render_as,block'); - $object =& $this->Application->recallObject($this->getPrefixSpecial()); + $object =& $this->getObject($params); if ( !$object->isLoaded() && !$this->SelectParam($params, 'default_image,DefaultImage') ) return false; $params['alt'] = htmlspecialchars($object->GetField('AltName')); return $this->Application->ParseBlock($params); } - function LargeImageExists($params) { - $object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix, $params); + function LargeImageExists($params) + { + $object =& $this->getObject($params); if ( $object->GetDBField('SameImages') == null || $object->GetDBField('SameImages')=='1' ) { return false; @@ -50,9 +62,8 @@ function LoadItemImage($params) { $parent_item =& $this->Application->recallObject($params['PrefixSpecial']); + $object =& $this->Application->recallObject($this->getPrefixSpecial(), null, Array('skip_autoload' => true)); - - // if we need primary thumbnail which is preloaded with products list $object->Clear(); // if we need primary thumbnail which is preloaded with products list @@ -101,40 +112,46 @@ function ImageSrc($params) { - $object =& $this->Application->recallObject($this->getPrefixSpecial(), null); + $object =& $this->getObject($params); + + $base_url = rtrim($this->Application->BaseURL(), '/'); + $ret = ''; // if we need thumb, or full image is same as thumb if ( $this->SelectParam($params, 'thumbnail,Thumbnail') || $object->GetDBField('SameImages') ) { // return local image or url - $ret = $object->GetDBField('LocalThumb') ? PROTOCOL.SERVER_NAME.BASE_PATH.'/'.$object->GetDBField('ThumbPath') : $object->GetDBField('ThumbUrl'); - if ( $object->GetDBField('LocalThumb') && !file_exists(FULL_PATH.'/'.$object->GetDBField('ThumbPath')) && !constOn('DBG_IMAGE_RECOVERY')) $ret = ''; + $ret = $object->GetDBField('LocalThumb') ? $base_url.$object->GetDBField('ThumbPath') : $object->GetDBField('ThumbUrl'); + if ($object->GetDBField('LocalThumb') && !file_exists(FULL_PATH.$object->GetDBField('ThumbPath')) && !constOn('DBG_IMAGE_RECOVERY')) { + // local thumbnail file is missing + $ret = ''; + } } else { // if we need full which is not the same as thumb - $ret = $object->GetDBField('LocalImage') ? PROTOCOL.SERVER_NAME.BASE_PATH.'/'.$object->GetDBField('LocalPath') : $object->GetDBField('Url'); - if ( $object->GetDBField('LocalImage') && !file_exists(FULL_PATH.'/'.$object->GetDBField('LocalPath')) ) $ret = ''; + $ret = $object->GetDBField('LocalImage') ? $base_url.$object->GetDBField('LocalPath') : $object->GetDBField('Url'); + if ($object->GetDBField('LocalImage') && !file_exists(FULL_PATH.$object->GetDBField('LocalPath'))) { + // local full image file is missing + $ret = ''; + } } $default_image = $this->SelectParam($params, 'default_image,DefaultImage'); - return ($ret && $ret != PROTOCOL.SERVER_NAME.BASE_PATH && $ret != PROTOCOL.SERVER_NAME.BASE_PATH.'/') ? $ret : ($default_image ? PROTOCOL.SERVER_NAME.BASE_PATH.THEMES_PATH.'/'.$default_image : false); + return ($ret && $ret != $base_url) ? $ret : ($default_image ? $base_url.THEMES_PATH.'/'.$default_image : false); } - function GetFullPath($path) + function getFullPath($path) { - if(!$path) return $path; + if (!$path) { + return $path; + } // absolute url - if( preg_match('/^(.*):\/\/(.*)$/U', $path) ) - { - if(strpos($path, PROTOCOL.SERVER_NAME.BASE_PATH) === 0) - { - $path = str_replace(PROTOCOL.SERVER_NAME.BASE_PATH, FULL_PATH.'/', $path); - } - return $path; + if (preg_match('/^(.*):\/\/(.*)$/U', $path)) { + return preg_replace('/^'.preg_quote($this->Application->BaseURL(), '/').'(.*)/', FULL_PATH.'/\\1', $path); } // relative url - return FULL_PATH.'/'.substr(THEMES_PATH,1).'/'.$path; + return FULL_PATH.'/'.substr(THEMES_PATH, 1).'/'.$path; } /** @@ -147,14 +164,14 @@ */ function ImageSize($params) { - $img_path = $this->GetFullPath( getArrayValue($params, 'img_path') ); + $img_path = $this->getFullPath($params['img_path']); - if (!file_exists($img_path)) return false; + if (!file_exists($img_path)) { + return false; + } + $image_info = @getimagesize($img_path); - -// if( !($img_path && file_exists($img_path) && isset($image_info) ) ) - if( !$image_info ) - { + if (!$image_info) { trigger_error('Image '.$img_path.' missing or invalid', E_USER_WARNING); return false; } @@ -167,36 +184,59 @@ $too_large = is_numeric($max_width) ? ($orig_width > $max_width) : false; $too_large = $too_large || (is_numeric($max_height) ? ($orig_height > $max_height) : false); - if($too_large) - { + if ($too_large) { $width_ratio = $max_width ? $max_width / $orig_width : 1; $height_ratio = $max_height ? $max_height / $orig_height : 1; $ratio = min($width_ratio, $height_ratio); $width = ceil($orig_width * $ratio); $height = ceil($orig_height * $ratio); } - else - { + else { $width = $orig_width; $height = $orig_height; } - - $size_clause = ' width="'.$width.'" height="'.$height.'"'; - return $size_clause; + + return ' width="'.$width.'" height="'.$height.'"'; } + /** + * Prepares image parameters & parses block with them (for admin) + * + * @param Array $params + * @return string + */ + function Image($params) + { + $image_url = $this->ImageSrc($params); + if (!$image_url) { + return ; + } + + $object =& $this->getObject($params); + $params['img_path'] = $image_url; + $image_dimensions = $this->ImageSize($params); + $params['img_size'] = $image_dimensions ? $image_dimensions : ' width="'.$params['DefaultWidth'].'"'; + $params['alt'] = htmlspecialchars($object->GetField('AltName')); // really used ? + $params['name'] = $this->SelectParam($params, 'block,render_as'); - // used in admin + return $this->Application->ParseBlock($params); + } + + + /** + * Returns url for image in case when image source is url (for admin) + * + * @param Array $params + * @return string + */ function ImageUrl($params) { - $object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix, $params); - if ($object->GetDBField('SameImages') ? $object->GetDBField('LocalThumb') : $object->GetDBField('LocalImage') ) - { + $object =& $this->getObject($params); + if ($object->GetDBField('SameImages') ? $object->GetDBField('LocalThumb') : $object->GetDBField('LocalImage') ) { $ret = $this->Application->Phrase(getArrayValue($params,'local_phrase')); } - else - { + else { $ret = $object->GetDBField('SameImages') ? $object->GetDBField('ThumbUrl') : $object->GetDBField('Url'); } return $ret;