2012年09月12日
携帯(フィーチャー・フォン)に対してShift_JISでページを返す
PowerCMSではPCページ、スマホページをUTF-8出力、携帯ページをシフトJIS (CP932) 出力したい、といったケースにも対応できます。
KeitaiLibプラグインによって提供されるブロックタグ MTConvertSJIS を利用します。
<mtml tag="mt:IfUserAgent" params='wants="keitai" trim="1"'>
<mtml tag="mt:ConvertSJIS">
<$MTInclude module="携帯-ウェブページ"$>
<mtml tag="/mt:ConvertSJIS">
<mtml tag="mt:else">
<mtml tag="mt:IfUserAgent" params='wants="SmartPhone"'>
<$MTInclude module="スマホ-ウェブページ"$>
<mtml tag="mt:else">
<$MTInclude module="PC-ウェブページ"$>
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
注意点ですが、この際MTConvertSJIS は DynamicMTML などを利用して動的に使わなければなりません。以下のようなテンプレートにのようにするとページ内に出力ファイル中に複数の文字コードが混在するため文字化けにつながります。また、MTConvertSJIS 内の(X)HTML の文字コード宣言を Shift_JIS で記述しておく必要があります。また、フォーム機能や検索機能はそのままではシフトJISに対応できませんのでその点にも注意が必要です。
<mtml tag="mt:IfUserAgent" params='wants="keitai" trim="1"'>
<MTConvertSJIS>
<$MTInclude module="携帯-メインページ"$>
<MTIgnore>ここがスタティックに吐き出されるために文字コードが混在して化ける</MTIgnore>
</MTConvertSJIS>
<mtml tag="mt:else">
<mtml tag="mt:IfUserAgent" params='wants="SmartPhone"'>
<$MTInclude module="スマホ-メインページ"$>
<mtml tag="mt:else">
<$MTInclude module="PC-メインページ"$>
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
静的ページをシフトJIS化する場合は、別のアーカイブテンプレートを作成して、「テンプレートの設定」で「このアーカイブをShift_JISで出力する」にチェックを入れてください。
また、冒頭のDynamicMTMLを使ったシフトJIS化の応用ですが、特定のキャリア端末からのアクセスのみを対象として変換することもできます。下記の例はAU端末のみ変換対象とするテンプレートです。
<mtml tag="mt:IfUserAgent" params='wants="keitai" trim="1"'>
<mtml tag="mt:IfUserAgent" params='like="UP.Browser" trim="1"'>
<!--AU の場合-->
<mtml tag="mt:ConvertSJIS">
<$MTInclude module="携帯-ウェブページSJIS"$>
<mtml tag="/mt:ConvertSJIS">
<mtml tag="mt:Else">
<!--AU 以外の場合-->
<$MTInclude module="携帯-ウェブページ"$>
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
<mtml tag="mt:else">
<mtml tag="mt:IfUserAgent" params='wants="SmartPhone"'>
<$MTInclude module="スマホ-ウェブページ"$>
<mtml tag="mt:else">
<$MTInclude module="PC-ウェブページ"$>
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
<mtml tag="/mt:else">
<mtml tag="/mt:IfUserAgent">
共通のソースを利用している場合や、より詳細な分岐処理が必要な場合はプラグインによって動的に変換をかけることも可能です。
- plugins/ConvertSJISforFeaturePhone/php/config.php
<?php
class ConvertSJISforFeaturePhone extends MTPlugin {
var $app;
var $registry = array(
'name' => 'ConvertSJISforFeaturePhone',
'id' => 'ConvertSJISforFeaturePhone',
'key' => 'convertsjisforfeaturephone',
'callbacks' => array(
'build_page' => 'callback_build_page',
),
);
function callback_build_page ( $mt, &$ctx, &$args, &$content ) {
$app = $ctx->stash( 'bootstrapper' );
if ( $app->get_agent( 'keitai' ) ) {
$charset = strtolower( $ctx->mt->config( 'PublishCharset' ) );
$charset = preg_replace( '/\-/', '_', $charset );
if ( $charset != 'shift_jis' ) {
$pattern = '/<\?xml\s*version\s*=\s*"1.0"\s*encoding\s*=\s*"UTF-8"\s*\?>/s';
$replace = '<?xml version="1.0" encoding="Shift_JIS"?>';
$content = preg_replace( $pattern, $replace, $content );
$pattern = '/<meta\s*http\-equiv\s*=\s*"Content\-Type"\s*content\s*=\s*"text\/html;\s*charset=UTF\-8"\s*\/>/s';
$replace = '<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />';
$content = preg_replace( $pattern, $replace, $content );
$content = mb_convert_encoding( $content, 'SJIS-WIN', 'UTF-8' );
}
}
}
}
?>
コメントを投稿する