2007年 5月 25(金曜日) のエントリ一覧

 
  • Home
  • Archives
  • Download
  • About
  • Contact

2007年 5月 25(金曜日)

Tips 動的にテンプレートを変えるプラグイン

SJIS TIPSの流れから引き続き、関連のTIPSです。
といっても、テンプレートを変更するプラグインでTemplateSwitcherっていうプラグインがあるんですが・・・基本はこれと同じなわけです。
条件をUAによって振り分けれれば、SJISプラグインと合わせることによりページング処理を除いて携帯対応ってことになりますね。
今回使用するイベントは、OnLoadWebDocumentっていうイベントです。
このイベントが発生したときには、実は$modx->documentContentという変数には使用するテンプレートが展開されて入ってきてます。
このあとに、中身をパースしてドキュメントの中身を指示に従って入れ込んだり、スニペットを呼び出したと実際のページ作成の処理に入っていきます。
なので、このイベントでテンプレートの中身を入れ替える必要がでてくるわけです。

以下のコードは、以前携帯対応をしたときの抜粋&若干の手直しバージョンです。
携帯か?の判断文はありませんが、判断を入れれば、携帯のときのみにテンプレートを入れ替えるということが可能になります。
単純な携帯判定であれば、

if (preg_match("#docomo|softbank|vodafone|kddi#i",$_SERVER["HTTP_USER_AGENT"])
{
   ここにテンプレート切り替えロジックを入れる
}

みたいな感じになるでしょうか?
PearのNet_UserAgent_Mobileを利用して、判定ロジックはそちらに委ねるのもよいかと思います。
0.9.6でもこの部分の内部ロジックに変更はなかったので、多分いけるはずですが、実際に利用していた時期は0.9.2.1の頃です。

  1. switch ($e->event)
  2. {
  3. case "OnLoadWebDocument":
  4.         if($modx->documentObject['template'])
  5.         {
  6.                 $sql = "SELECT templatename FROM ".$modx->getFullTableName("site_templates")." WHERE ".$modx->getFullTableName("site_templates").".id = '".$modx->documentObject['template']."';";
  7.                 $result = $modx->dbQuery($sql);
  8.                 $row = $modx->fetchRow($result);
  9.                 $templates = $row['templatename'];
  10.                 if (!strstr($templates,"M@"))
  11.                 {       
  12.                         $templates = "M@".$templates;
  13.                         $sql = "SELECT id FROM ".$this->getFullTableName("site_templates")." WHERE ".$this->getFullTableName("site_templates").".templatename = '".$templates."';";
  14.                         $result = $this->dbQuery($sql);
  15.                         $row = $this->fetchRow($result);
  16.                         $new_id = $row['id'];
  17.                         $sql = "SELECT * FROM ".$modx->getFullTableName("site_templates")." WHERE ".$modx->getFullTableName("site_templates").".id = '".$new_id."';";
  18.                         $result = $modx->dbQuery($sql);
  19.                         $rowCount = $modx->recordCount($result);
  20.                         iif($rowCount==1) {
  21.                                 $row = $modx->fetchRow($result);
  22.                                 $modx->documentContent = $row['content'];
  23.                         }
  24.                 }
  25.         }
  26.         break;
  27. }

上記の処理では、テンプレートID番号からテンプレート名を取得し、M@(キーワード)がないテンプレート名の場合は、そのテンプレート名の先頭にM@を付けたテンプレート名をデータベースから探し出し、その内容をDocumentContentに格納します。
ちなみに、$modx->documentObject['template']にテンプレートのID番号が入ってきます。
(_blankの指定の場合は、0/nullです)
該当テンプレートが見つからないか、複数見つかった場合(ありえないとは思うけど)は、テンプレートを変更せずにそのままオリジナルテンプレートで動作します。
ここら辺は、しっかりとルール通りに設置運用しておけば問題ないはずということで手を抜いています。

携帯3キャリアごとにテンプレートを分ける場合には、それぞれテンプレート名の区別する文字コードを付加して、対応テンプレートを求めればよいでしょう。(ココでは、ロジックを簡潔にする為に携帯かそうでないかしかやっていませんが)
同じように、MacかWinで別のものっていう場合も同様に可能かと思います。

もちろん、プラグインで変更ではなくてスニペットでという方法も考えられます。
実際試してはいませんが、テンプレートに判定スニペットを作ってそれを呼び出すだけ・・・・。
実際のテンプレートの内容の部分はチャンクをテンプレートとして使う一般的なやり方です。

[!UA?pc=aaaa&mobile=bbb!]

みたいな感じのスニペットで、UserAgentを判別して、PCなら変数pcのチャンクを返して、携帯なら変数mobileのチャンクを返すという方法です。

多分、いけるはずです。
この方がシンプルかも知れませんねぇ。

ところで、このテンプレートを動的に切り替えるプラグイン及びスニペットではドキュメントのキャッシュを有効にしてはいけません。
当然のことながら、UAごとに中身が変わっちゃうわけなので・・・・。

あとはページングですけど、これはPagenationプラグインも合体させればいけるんじゃないかなぁと思います。

絵文字とかについては・・・・いつか、トライしてみますが・・・コンバートするしかないなかぁ プラグインで。
アクセスキーについては、そのままPC用でも入れて置けばよいとは思いますが・・・。
ってなことで、不明な点、おかしいぞ というところがありましたらご連絡くださいまし。

投稿者 ZeRo in MODx at 17:49 | コメント (2) | トラックバック (0) このエントリーを含むはてなブックマーク
このエントリに定義されたタグ: MODx
(ページ 1/1, 合計 1 エントリ)

[PR]

カレンダー

戻る 5月 '07 転送
月 火 水 木 金 土 日
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリ

  • iPod (2)
  • MODx (31)
  • Nucleus (23)
  • OpenX (1)
  • PHP (22)
  • Ruby (1)
  • Serendipity (16)
  • WordPress (1)
  • ざれごと (93)
  • スクリプト&ソフト (6)
  • 健忘録 (4)
  • 本 (7)
すべてのカテゴリ

クイックサーチ

タグ

お風呂掃除 ちいたん アクセス解析 アフィリエイト カビ スニペット テンプレート バイオ バージョンアップ フレームワーク ミニブログ メールサーバ モップ リニューアル 加速成功 奇怪 小技 広告 本 玄箱 藤原伊織 道幸 武久 電話機 風呂掃除 ajax Cache checkpad CI CORE Server Courier-MTA dave.tv eForm extJS feedburner Firefly framework frog google GPARTED-LiveCD Insights Search iPhone iPod touch iTunesサーバ kohana Linkstation mce mixi ML300 MODx moony np_metaex np_newsfeedex NP_RelatedEX NP_Simplepie Nucleus OpenX PHP phpmixi phpTrafficA piex plugin qmail rhaco s9y Safe Mode sendping Serendipity shorewall simplepie SQLite toaster TrackBack Twitter Ubuntu USB-HDD vista wii Wii Fit Windows Live Writer wordpress xajax xfy Blog Editor XREA ZendFramework Zend_Cache

コメント

コメント: ZeRo
iPod Touch サーマルコントロールケース
2008/10/11 15:16
あら、えー と つけた ときは確か 保護シート は外しまし た。 確か 、少しの厚 みでもちゃ んと収まら なかった気 がします。 す [...]


コメント: Kaz
iPod Touch サーマルコントロールケース
2008/10/09 21:51
購入しまし た。今まで 使用してい た保護フィ ルムを貼っ たままでケ ースを装着 してしまい 、表示面に ニュートン リングが・ ・・ [...]


コメント: ZeRo
pieX Ver0.7リリース
2008/10/05 21:51
トラックバ ック先の情 報もチェッ クしてね・ ・・修正版 は後日アッ プします、 説明書もち ょっと改版 ですね(^ ^; shin tata [...]


コメント: shintata.com
pieX Ver0.7リリース
2008/10/05 21:25
全体のRSS を修正した ので、せっ かくだから 「最近の記 事」という のを表示さ せたい。 まとめたRS Sを取り込 んで表示さ せれば [...]


コメント: ZeRo
LinuxWorld Expo2008 にいってきたです
2008/06/02 22:30
さすがに、 全部動かし ているわけ じゃないで すよ。 実 際に触った ことがある ものもあり ますが、大 抵はデモサ イトとかを 見た [...]


リンク集

  • オープンソース
    • CMS/BLOG
      • MODxCMS
        • Let's enjoy MODx
        • MODxCMS
        • Phize on the Web
        • あ~ゆ~どりま~
        • ケイムズカンパニー
      • Nucleus CMS JAPAN
      • Serendipity
    • FRAMEWORK
      • CodeIgniter
        • CodeIgniter 本家
        • CodeIgniterユーザガイド日本語版
        • Rapyd Framework
      • Kohana
        • Kohana本家
      • ZendFramework
    • ライブラリ
      • SimplePie
    • Zen Cart日本公式サイト
  • サービス
    • Value-Domain
  • スクリプト
    • 206
    • ネットサーフレスキュー「Web裏技」
  • メールサーバ
    • Courier-mta日本
    • 日本Courierユーザ会
  • Nucleusなブログ
  • SHOP@PETITPOWER
  • ZeRo∞Log

インフォメーション

WORLDRANKING BELLSEARCH

 RSSリーダーで購読する

My Profile by iddy

Copyright 2005 - 2008 PETITPOWER  | Powered by Serendipity