2012-03-08 147 views
0

我們目前使用{html_image file='pumpkin.jpg'}來計算圖像的寬度/高度。Smarty html_image垂直對齊圖像

我想要做的是添加一個額外的參數給函數,所以你可以傳遞容器(父)的高度。

該插件將通過計算計算margin-top(container_height - image_height)/2

目前,我們被JS這樣做的,因爲圖像的大小動態有輕微的延遲。如果我們通過Smarty執行此操作,則會緩存margin-top

彷彿圖像[foo.jpg]爲50像素的高度和一個例如容器高度爲100像素:

{html_image file="images/foo.jpg" containerHeight=100} 
<img src="images/foo.jpg" width="60" height="50" style="margin-top: 25px" alt="" /> 

http://www.smarty.net/docs/en/language.function.html.image.tpl

<?php 
    /** 
    * Smarty plugin 
    * 
    * @package Smarty 
    * @subpackage PluginsFunction 
    */ 

    /** 
    * Smarty {html_image} function plugin 
    * 
    * Type:  function<br> 
    * Name:  html_image<br> 
    * Date:  Feb 24, 2003<br> 
    * Purpose: format HTML tags for the image<br> 
    * Examples: {html_image file="/images/masthead.gif"} 
    * Output: <img src="/images/masthead.gif" width=400 height=23> 
    * 
    * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} 
    *  (Smarty online manual) 
    * @author Monte Ohrt <monte at ohrt dot com> 
    * @author credits to Duda <[email protected]> 
    * @version 1.0 
    * @param array $params parameters 
    * Input:<br> 
    *   - file = file (and path) of image (required) 
    *   - height = image height (optional, default actual height) 
    *   - width = image width (optional, default actual width) 
    *   - basedir = base directory for absolute paths, default 
    *      is environment variable DOCUMENT_ROOT 
    *   - path_prefix = prefix for path output (optional, default empty) 
    * @param object $template template object 
    * @return string 
    * @uses smarty_function_escape_special_chars() 
    */ 
    function smarty_function_html_image($params, $template) 
    { 
     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); 

     $alt = ''; 
     $file = ''; 
     $height = ''; 
     $width = ''; 
     $extra = ''; 
     $prefix = ''; 
     $suffix = ''; 
     $path_prefix = ''; 
     $server_vars = $_SERVER; 
     $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : ''; 
     foreach($params as $_key => $_val) { 
      switch ($_key) { 
       case 'file': 
       case 'height': 
       case 'width': 
       case 'dpi': 
       case 'path_prefix': 
       case 'basedir': 
        $$_key = $_val; 
        break; 

       case 'alt': 
        if (!is_array($_val)) { 
         $$_key = smarty_function_escape_special_chars($_val); 
        } else { 
         throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); 
        } 
        break; 

       case 'link': 
       case 'href': 
        $prefix = '<a href="' . $_val . '">'; 
        $suffix = '</a>'; 
        break; 

       default: 
        if (!is_array($_val)) { 
         $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; 
        } else { 
         throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); 
        } 
        break; 
      } 
     } 

     if (empty($file)) { 
      trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); 
      return; 
     } 

     if (substr($file, 0, 1) == '/') { 
      $_image_path = $basedir . $file; 
     } else { 
      $_image_path = $file; 
     } 

     if (!isset($params['width']) || !isset($params['height'])) { 
      if (!$_image_data = @getimagesize($_image_path)) { 
       if (!file_exists($_image_path)) { 
        trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); 
        return; 
       } else if (!is_readable($_image_path)) { 
        trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); 
        return; 
       } else { 
        trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); 
        return; 
       } 
      } 
      if (isset($template->security_policy)) { 
       if (!$template->security_policy->isTrustedResourceDir($_image_path)) { 
        return; 
       } 
      } 

      if (!isset($params['width'])) { 
       $width = $_image_data[0]; 
      } 
      if (!isset($params['height'])) { 
       $height = $_image_data[1]; 
      } 
     } 

     if (isset($params['dpi'])) { 
      if (strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) { 
       $dpi_default = 72; 
      } else { 
       $dpi_default = 96; 
      } 
      $_resize = $dpi_default/$params['dpi']; 
      $width = round($width * $_resize); 
      $height = round($height * $_resize); 
     } 

     return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix; 
    } 

    ?> 

回答

0

嘗試插件函數之前添加此return聲明:

if (isset($params['containerHeight'])) { 
    $containerHeightAttr = ' style="margin-top: ' . intval(($params['containerHeight'] - $height)/2) . 'px;"'; 
    $extra .= $containerHeightAttr; 
} 

這裏完整的文件:

http://pastebin.com/raw.php?i=V9eGsXVF

嘗試,讓我知道,如果有錯誤。我沒有測試過,但我在這裏最終解決問題。