developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #1003: function.mailto.php

File function.mailto.php, 4.2 KB (added by foxmask, 12 years ago)
Line 
1<?php
2/**
3 * Plugin from smarty project and adapted for jtpl
4 * @package    jelix
5 * @subpackage jtpl_plugin
6 * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
7 *          (Smarty online manual)
8 * @link http://jelix.org/
9 * @author   Monte Ohrt <monte at ohrt dot com>
10 * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
11 */
12
13/**
14 * Examples:
15 * <pre>
16 * {mailto address="me@domain.com"}
17 * {mailto address="me@domain.com" encode="javascript"}
18 * {mailto address="me@domain.com" encode="hex"}
19 * {mailto address="me@domain.com" subject="Hello to you!"}
20 * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
21 * {mailto address="me@domain.com" extra='class="mailto"'}
22 * </pre>
23 * @params  array
24 */
25function jtpl_function_html_mailto($tpl,$params)
26{
27    $extra = '';
28
29    if (empty($params['address'])) {
30        throw new jException("jelix~errors.tplplugin.function.argument.unknow", array('address','mailto',$tpl->_templateName)); 
31    } else {
32        $address = $params['address'];
33    }
34
35    $text = $address;
36
37    // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
38    // so, don't encode it.
39    $search = array('%40', '%2C');
40    $replace  = array('@', ',');
41    $mail_parms = array();
42    foreach ($params as $var=>$value) {
43        switch ($var) {
44            case 'cc':
45            case 'bcc':
46            case 'followupto':
47                if (!empty($value))
48                    $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
49                break;
50               
51            case 'subject':
52            case 'newsgroups':
53                $mail_parms[] = $var.'='.rawurlencode($value);
54                break;
55
56            case 'extra':
57            case 'text':
58                $$var = $value;
59
60            default:
61        }
62    }
63
64    $mail_parm_vals = '';
65    for ($i=0; $i<count($mail_parms); $i++) {
66        $mail_parm_vals .= (0==$i) ? '?' : '&';
67        $mail_parm_vals .= $mail_parms[$i];
68    }
69    $address .= $mail_parm_vals;
70
71    $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
72    if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
73        throw new jException("jelix~errors.tplplugin.function.argument.unknow", array($encode,'mailto',$tpl->_templateName));
74    }
75
76    if ($encode == 'javascript' ) {
77        $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
78
79        $js_encode = '';
80        for ($x=0; $x < strlen($string); $x++) {
81            $js_encode .= '%' . bin2hex($string[$x]);
82        }
83
84        echo '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
85
86    } elseif ($encode == 'javascript_charcode' ) {
87        $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
88
89        for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
90            $ord[] = ord($string[$x]);   
91        }
92
93        $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
94        $_ret .= "<!--\n";
95        $_ret .= "{document.write(String.fromCharCode(";
96        $_ret .= implode(',',$ord);
97        $_ret .= "))";
98        $_ret .= "}\n";
99        $_ret .= "//-->\n";
100        $_ret .= "</script>\n";
101       
102        echo $_ret;
103       
104       
105    } elseif ($encode == 'hex') {
106
107        preg_match('!^(.*)(\?.*)$!',$address,$match);
108        if(!empty($match[2])) {
109            throw new jException("jelix~errors.tplplugin.function.argument.unknow", array($match[2],' ', ' ' ));
110        }
111        $address_encode = '';
112        for ($x=0; $x < strlen($address); $x++) {
113            if(preg_match('!\w!',$address[$x])) {
114                $address_encode .= '%' . bin2hex($address[$x]);
115            } else {
116                $address_encode .= $address[$x];
117            }
118        }
119        $text_encode = '';
120        for ($x=0; $x < strlen($text); $x++) {
121            $text_encode .= '&#x' . bin2hex($text[$x]).';';
122        }
123
124        $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
125        echo '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
126
127    } else {
128        // no encoding
129        echo '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
130
131    }
132
133}