ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/webapp/lib/OpenPNE/Smarty.php @ 6341

Last change on this file since 6341 was 6341, checked in by ogawa, 14 years ago

#2187:Smartyのdefault_modifiersが過剰に適用されるのを改善(仮実装

File size: 4.9 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7require_once 'Smarty/Smarty.class.php';
8
9class OpenPNE_Smarty extends Smarty
10{
11    var $templates_dir;
12    var $output_charset;
13
14    function OpenPNE_Smarty($configs=array())
15    {
16        $this->Smarty();
17        $this->autoload_filters['pre'][] = 'pne_nodefaults';
18
19        // 設定値をセット
20        foreach ($configs as $key => $value) {
21            if (isset($this->$key)) {
22                $this->$key = $value;
23            }
24        }
25    }
26
27    // extディレクトリ対応 SMARTY->display() ラッパー
28    function ext_display($resource_name, $cache_id = null, $compile_id = null)
29    {
30        $this->load_filter('output', 'pne_display_emoji');
31        $this->register_outputfilter('smarty_outputfilter_pne_display_emoji');
32        // とりあえず携帯用にSJISのみ対応
33        if ($this->output_charset == 'SJIS') {
34            $this->register_outputfilter('smarty_outputfilter_convert_utf82sjis');
35            $this->register_outputfilter('smarty_outputfilter_unescape_emoji');
36            require_once 'OpenPNE/KtaiUA.php';
37            $ktai = new OpenPNE_KtaiUA();
38            if ($ktai->is_docomo() && OPENPNE_IS_SET_KTAI_FONT_SIZE) {
39                $this->register_outputfilter('smarty_outputfilter_add_font4docomo');
40            }
41            if ($ktai->is_vodafone()) {
42                $this->register_outputfilter('smarty_outputfilter_change_table_width4softbank');
43            }
44        }
45        $this->sendContentType();
46        $this->ext_fetch($resource_name, $cache_id, $compile_id, true);
47    }
48
49    function ext_fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
50    {
51        if ($this->templates_dir) {
52            $place = '';
53            $template = $this->templates_dir . '/' . $resource_name;
54
55            if (!$tpl = $this->ext_search($template, $place)) {
56                return false;
57            }
58            $tpl = 'file:' . $tpl;
59            $cache_id = $compile_id = $place . '_' . str_replace('/', '_', $this->templates_dir);
60        } else {
61            $tpl = $resource_name;
62        }
63
64        return $this->fetch($tpl, $cache_id, $compile_id, $display);
65    }
66
67    function ext_search($path, &$place)
68    {
69        $dft = OPENPNE_MODULES_DIR . '/' . $path;
70        $ext = OPENPNE_MODULES_EXT_DIR . '/' . $path;
71        $biz = OPENPNE_MODULES_BIZ_DIR . '/' . $path;
72
73        if (USE_EXT_DIR && is_readable($ext)) {
74            $place = 'ext';
75            return $ext;
76        } elseif (USE_BIZ_DIR && is_readable($biz)) {
77            $place = 'biz';
78            return $biz;
79        } elseif (is_readable($dft)) {
80            $place = 'dft';
81            return $dft;
82        }
83
84        return false;
85    }
86
87    function setOutputCharset($charset)
88    {
89        $this->output_charset = $charset;
90    }
91
92    function sendContentType()
93    {
94        if ($this->output_charset == 'SJIS') {
95            header('Content-Type: text/html; charset=Shift_JIS');
96        } else {
97            header('Content-Type: text/html; charset=UTF-8');
98        }
99    }
100}
101
102function smarty_outputfilter_convert_utf82sjis($tpl_output, &$smarty)
103{
104    return mb_convert_encoding($tpl_output, 'SJIS-win', 'UTF-8');
105}
106
107function smarty_outputfilter_unescape_emoji($tpl_output, &$smarty)
108{
109    $tpl_output = emoji_unescape($tpl_output, true);
110    $tpl_output = emoji_unescape($tpl_output, false);
111    return $tpl_output;
112}
113
114function smarty_outputfilter_add_font4docomo($tpl_output, &$smarty)
115{
116    // 開始タグは属性値が入る可能性があるので正規表現で置換
117    $pattern_start_tag = array('/(<body.*?>)/', '/(<td.*?>)/');
118    $replacement_start_tag = '$1<font size="2">';
119    $tpl_output = preg_replace($pattern_start_tag, $replacement_start_tag, $tpl_output);
120
121    // 終了タグは単純な置換
122    $pattern_end_tag = array('</body>', '</td>');
123    $replacement_end_tag = array('</font></body>', '</font></td>');
124    $tpl_output = str_replace($pattern_end_tag, $replacement_end_tag, $tpl_output);
125
126    return $tpl_output;
127}
128
129function smarty_outputfilter_change_table_width4softbank($tpl_output, &$smarty)
130{
131    // table要素のwidth属性を x-jphone-display で得られる表示可能幅に置換
132    // ただし3G端末は x-jphone-display の仕様が異なるため、置換しない
133    if (!strncmp($_SERVER['HTTP_USER_AGENT'], 'J-PHONE', 7) && !is_null($_SERVER['HTTP_X_JPHONE_DISPLAY'])) {
134        $display_size = explode('*', $_SERVER['HTTP_X_JPHONE_DISPLAY']);
135
136        if (!ctype_digit($display_size[0]) || intval($display_size[0]) <= 0) {
137            return $tpl_output;
138        }
139
140        $pattern_start_tag = '<table width="100%"';
141        $replacement_start_tag = '<table width="' . intval($display_size[0]) . '"';
142        $tpl_output = str_replace($pattern_start_tag, $replacement_start_tag, $tpl_output);
143    }
144
145    return $tpl_output;
146}
147
148?>
Note: See TracBrowser for help on using the repository browser.