smarty/plugins/function.mailto.php
changeset 0 c63de9eb7045
equal deleted inserted replaced
-1:000000000000 0:c63de9eb7045
       
     1 <?php
       
     2 /**
       
     3  * Smarty plugin
       
     4  * @package Smarty
       
     5  * @subpackage plugins
       
     6  */
       
     7 
       
     8 
       
     9 /**
       
    10  * Smarty {mailto} function plugin
       
    11  *
       
    12  * Type:     function<br>
       
    13  * Name:     mailto<br>
       
    14  * Date:     May 21, 2002
       
    15  * Purpose:  automate mailto address link creation, and optionally
       
    16  *           encode them.<br>
       
    17  * Input:<br>
       
    18  *         - address = e-mail address
       
    19  *         - text = (optional) text to display, default is address
       
    20  *         - encode = (optional) can be one of:
       
    21  *                * none : no encoding (default)
       
    22  *                * javascript : encode with javascript
       
    23  *                * javascript_charcode : encode with javascript charcode
       
    24  *                * hex : encode with hexidecimal (no javascript)
       
    25  *         - cc = (optional) address(es) to carbon copy
       
    26  *         - bcc = (optional) address(es) to blind carbon copy
       
    27  *         - subject = (optional) e-mail subject
       
    28  *         - newsgroups = (optional) newsgroup(s) to post to
       
    29  *         - followupto = (optional) address(es) to follow up to
       
    30  *         - extra = (optional) extra tags for the href link
       
    31  *
       
    32  * Examples:
       
    33  * <pre>
       
    34  * {mailto address="me@domain.com"}
       
    35  * {mailto address="me@domain.com" encode="javascript"}
       
    36  * {mailto address="me@domain.com" encode="hex"}
       
    37  * {mailto address="me@domain.com" subject="Hello to you!"}
       
    38  * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
       
    39  * {mailto address="me@domain.com" extra='class="mailto"'}
       
    40  * </pre>
       
    41  * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
       
    42  *          (Smarty online manual)
       
    43  * @version  1.2
       
    44  * @author   Monte Ohrt <monte at ohrt dot com>
       
    45  * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
       
    46  * @param    array
       
    47  * @param    Smarty
       
    48  * @return   string
       
    49  */
       
    50 function smarty_function_mailto($params, &$smarty)
       
    51 {
       
    52     $extra = '';
       
    53 
       
    54     if (empty($params['address'])) {
       
    55         $smarty->trigger_error("mailto: missing 'address' parameter");
       
    56         return;
       
    57     } else {
       
    58         $address = $params['address'];
       
    59     }
       
    60 
       
    61     $text = $address;
       
    62 
       
    63     // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
       
    64     // so, don't encode it.
       
    65     $search = array('%40', '%2C');
       
    66     $replace  = array('@', ',');
       
    67     $mail_parms = array();
       
    68     foreach ($params as $var=>$value) {
       
    69         switch ($var) {
       
    70             case 'cc':
       
    71             case 'bcc':
       
    72             case 'followupto':
       
    73                 if (!empty($value))
       
    74                     $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
       
    75                 break;
       
    76                 
       
    77             case 'subject':
       
    78             case 'newsgroups':
       
    79                 $mail_parms[] = $var.'='.rawurlencode($value);
       
    80                 break;
       
    81 
       
    82             case 'extra':
       
    83             case 'text':
       
    84                 $$var = $value;
       
    85 
       
    86             default:
       
    87         }
       
    88     }
       
    89 
       
    90     $mail_parm_vals = '';
       
    91     for ($i=0; $i<count($mail_parms); $i++) {
       
    92         $mail_parm_vals .= (0==$i) ? '?' : '&';
       
    93         $mail_parm_vals .= $mail_parms[$i];
       
    94     }
       
    95     $address .= $mail_parm_vals;
       
    96 
       
    97     $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
       
    98     if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
       
    99         $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
       
   100         return;
       
   101     }
       
   102 
       
   103     if ($encode == 'javascript' ) {
       
   104         $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
       
   105 
       
   106         $js_encode = '';
       
   107         for ($x=0; $x < strlen($string); $x++) {
       
   108             $js_encode .= '%' . bin2hex($string[$x]);
       
   109         }
       
   110 
       
   111         return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
       
   112 
       
   113     } elseif ($encode == 'javascript_charcode' ) {
       
   114         $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
       
   115 
       
   116         for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
       
   117             $ord[] = ord($string[$x]);   
       
   118         }
       
   119 
       
   120         $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
       
   121         $_ret .= "<!--\n";
       
   122         $_ret .= "{document.write(String.fromCharCode(";
       
   123         $_ret .= implode(',',$ord);
       
   124         $_ret .= "))";
       
   125         $_ret .= "}\n";
       
   126         $_ret .= "//-->\n";
       
   127         $_ret .= "</script>\n";
       
   128         
       
   129         return $_ret;
       
   130         
       
   131         
       
   132     } elseif ($encode == 'hex') {
       
   133 
       
   134         preg_match('!^(.*)(\?.*)$!',$address,$match);
       
   135         if(!empty($match[2])) {
       
   136             $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
       
   137             return;
       
   138         }
       
   139         $address_encode = '';
       
   140         for ($x=0; $x < strlen($address); $x++) {
       
   141             if(preg_match('!\w!',$address[$x])) {
       
   142                 $address_encode .= '%' . bin2hex($address[$x]);
       
   143             } else {
       
   144                 $address_encode .= $address[$x];
       
   145             }
       
   146         }
       
   147         $text_encode = '';
       
   148         for ($x=0; $x < strlen($text); $x++) {
       
   149             $text_encode .= '&#x' . bin2hex($text[$x]).';';
       
   150         }
       
   151 
       
   152         $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
       
   153         return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
       
   154 
       
   155     } else {
       
   156         // no encoding
       
   157         return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
       
   158 
       
   159     }
       
   160 
       
   161 }
       
   162 
       
   163 /* vim: set expandtab: */
       
   164 
       
   165 ?>