首页 » ZenCart » ZenCart分析 » 阅读文章
ZenCart产品图片实现原理分析
zencart产品图片信息是放在表products的products_image字段中的,图片存储在images下,其中大图放在images/large,中图放在images/medium下,图片命名的格式如原始小图地址是在images/abc/model001.jpg,对应的中图为images/medium/abc/model001_MED.jpg,大图为images/medium/abc/model001_LRG.jpg
主图分析
主图实现是在includes\modules\main_product_image.php中
$products_image_extension = substr($products_image, strrpos($products_image, '.'));
$products_image,数据库中产品图片的信息,在includes\modules\pages\product_info\main_template_vars.php中获取的
strrpos()函数获取字符串中指定字符最后一次出现的位置
substr()截取字符串函数,里面指定从什么位置截取到什么位置
结合起来$products_image_extension获取图片扩展名的。如上示例中$products_image_extension=".jpg"
$products_image_base = str_replace($products_image_extension, '', $products_image);
str_replace()字符串替换函数
这句即得到不含扩展名的部分,示例中$products_image_base="abc/model001"
$products_image_medium = $products_image_base . IMAGE_SUFFIX_MEDIUM . $products_image_extension; $products_image_large = $products_image_base . IMAGE_SUFFIX_LARGE . $products_image_extension;
这2句就简单了,组合起来获得中图,大图的地址,其中IMAGE_SUFFIX_MEDIUM 和IMAGE_SUFFIX_LARGE中图和大图后缀可以在后台-->Configuration-->Imagess设置,默认是_MED和_LRG
if (!file_exists(DIR_WS_IMAGES . 'medium/' . $products_image_medium)) { $products_image_medium = DIR_WS_IMAGES . $products_image; } else { $products_image_medium = DIR_WS_IMAGES . 'medium/' . $products_image_medium; }
DIR_WS_IMAGES常量为images/
file_exists()判断文件是否存在
这句话也就很好理解了,判断中图是否存在,如果不存在就用原始小图。
同理
if (!file_exists(DIR_WS_IMAGES . 'large/' . $products_image_large)) { if (!file_exists(DIR_WS_IMAGES . 'medium/' . $products_image_medium)) { $products_image_large = DIR_WS_IMAGES . $products_image; } else { $products_image_large = DIR_WS_IMAGES . 'medium/' . $products_image_medium; } } else { $products_image_large = DIR_WS_IMAGES . 'large/' . $products_image_large; }
判断大图是否存在,不存在就判断中图,存在就是用中图,不存在就是用小图
细节图分析
细节图实现是在includes\modules\additional_images.php中
if ($products_image != '' && $flag_show_product_info_additional_images != 0)
$flag_show_product_info_additional_images参数在includes\modules\pages\product_info\main_template_vars.php中获取的,产品布局开关,在后台-->Catalog-->Product Types控制
if (strrpos($products_image, '/')) { $products_image_match = substr($products_image, strrpos($products_image, '/')+1); //echo 'TEST 1: I match ' . $products_image_match . ' - ' . $file . ' - base ' . $products_image_base . '<br>'; $products_image_match = str_replace($products_image_extension, '', $products_image_match) . '_'; $products_image_base = $products_image_match; }
判断是否有子文件夹存在,如果存在着逐步剥离,目的是使$products_image_base为得到细节图图片名主体部分(如上示例$products_image_base="model001_")
$products_image_directory = str_replace($products_image, '', substr($products_image, strrpos($products_image, '/'))); if ($products_image_directory != '') { $products_image_directory = DIR_WS_IMAGES . str_replace($products_image_directory, '', $products_image) . "/"; } else { $products_image_directory = DIR_WS_IMAGES; }
这句是获取图片的路径,前面判断是图片是否在子文件夹中
if ($dir = @dir($products_image_directory)) { while ($file = $dir->read()) { if (!is_dir($products_image_directory . $file)) { if (substr($file, strrpos($file, '.')) == $file_extension) { // if(preg_match("/" . $products_image_match . "/i", $file) == '1') { if(preg_match("/" . $products_image_base . "/i", $file) == 1) { if ($file != $products_image) { if ($products_image_base . str_replace($products_image_base, '', $file) == $file) { // echo 'I AM A MATCH ' . $file . '<br>'; $images_array[] = $file; } else { // echo 'I AM NOT A MATCH ' . $file . '<br>'; } } } } } } if (sizeof($images_array)) { sort($images_array); } $dir->close(); }
dir() 函数打开一个目录句柄,并返回一个对象。这个对象包含三个方法:read() , rewind() 以及 close()
这句话执行流程是:打开图片所在文件夹-->循环出文件夹里所有文件和文件夹-->筛选剔除不是文件的-->筛选剔除和原始图扩展名不同的-->正则匹配和细节图主体$products_image_base一致的-->剔除原始主图-->组合验证下是否完全匹配-->都通过后将文件名放入$images_array数组
sort()函数对数组重新排序
if ($num_images < IMAGES_AUTO_ADDED || IMAGES_AUTO_ADDED == 0 ) { $col_width = floor(100/$num_images); } else { $col_width = floor(100/IMAGES_AUTO_ADDED); }
定义细节图横排的宽度
for ($i=0, $n=$num_images; $i<$n; $i++)
依次循环出细节图
$products_image_large = str_replace(DIR_WS_IMAGES, DIR_WS_IMAGES . 'large/', $products_image_directory) . str_replace($products_image_extension, '', $file) . IMAGE_SUFFIX_LARGE . $products_image_extension; $flag_has_large = file_exists($products_image_large); $products_image_large = ($flag_has_large ? $products_image_large : $products_image_directory . $file); $flag_display_large = (IMAGE_ADDITIONAL_DISPLAY_LINK_EVEN_WHEN_NO_LARGE == 'Yes' || $flag_has_large); $base_image = $products_image_directory . $file; $thumb_slashes = zen_image($base_image, addslashes($products_name), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT); $thumb_regular = zen_image($base_image, $products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT); $large_link = zen_href_link(FILENAME_POPUP_IMAGE_ADDITIONAL, 'pID=' . $_GET['products_id'] . '&pic=' . $i . '&products_image_large_additional=' . $products_image_large);
依次为组合细节图大图地址,判断大图是否存在,不存在即用小图,组合小图地址,小图输出html格式,大图链接
$list_box_contents[$row][$col] = array('params' => 'class="additionalImages centeredContent back"' . ' ' . 'style="width:' . $col_width . '%;"', 'text' => "\n " . $link);
组合$list_box_contents数组,然后利用includes\templates\template_default\common\tpl_columnar_display.php输出。
声明: 本文由Ezencart原创,转载请保留链接:ZenCart产品图片实现原理分析
评论 共0条 (RSS 2.0) 发表评论