Googleドキュメントのテキスト文書をSmartyのテンプレートに利用する

この記事は次のブログに引っ越しました。

Googleドキュメントにアップロードしたテキストファイル(文書)を、PHPSmartyテンプレートとして利用すると便利です。 オンライン・コード・エディタ Smartyテンプレートの編集がGoogleAppsGMailGoogleドキュメント上で出来るようになる。 バージョン管理 「変更履歴を表示」すればバージョン管理も出来るので、版を戻すこともできる。 簡易CMSの構築 Googleスプレッドシートと併用すれば、GoogleAppsGMailベースのCMSに利用できる。 ■開発のポイント 公開されたGoogle文書のソースを見るとわかりますが、本文データはUTF-8でHTMLエンティティ化(エンコード)されています。開発のポイントとしては、ソースからテンプレートとなる必要箇所を抜き出し、デコードした文字列データをSmartyのテンプレートとして利用する点です。 テンプレートとなる文字列データを、Smartyのテンプレートとして使う場合、register_resource関数を使う「Smartyで文字列テンプレート」などの方法がありますが、問題として変数をテンプレートに渡せないなどがあります。 簡単な方法としては、Smartyオブジェクトにテンプレートとなる文字列データもassignして(渡して)しまい、テンプレート内でeval関数を用いて置換処理したものを表示させる方法がおすすめです。 ちなみにデメリットとして、テンプレートのインクルードが出来ないなどあります。 ■テンプレートの中身 アップするGoogle文書のサンプルです。 Sample Title {$sample} 上記のようなテンプレートとなる内容のテキストファイルを作成し、Googleドキュメントにアップした後、「共有」からウェブページとして公開します。 ※ここでのポイントはtemplateタグで囲っていること。 ■sample.phpの中身 表示用のスクリプトの中身です。 //Googleドキュメント文書の公開URL $sURL = "http://docs.google.com/View?id=dd5xxxxxx978vct"; /* ================================== 文書からテンプレート部を抜き出す ================================== */ //データの読み込み $sTemplate = file_get_contents( $sURL ); //BODYタグ内(テンプレート部分)だけを抜き出す。 if( preg_match_all( "/([\s\S]*)/i", $sTemplate, $matches ) ){ $sTemplate = $matches[0][0]; } //HTMLエンティティ化されていないタグを削除 ※テンプレート上のタグはHTMLエンティティ化されている為 $sTemplate = trim( strip_tags( $sTemplate ) ); //HTMLエンティティ化されているUTF-8文字をデコード $sTemplate = mb_decode_numericentity( $sTemplate, array( 0, 0xffff, 0, 0xffff ), "UTF-8" ); //HTMLエンティティ化されているタグ類をデコード $sTemplate = html_entity_decode( $sTemplate ); //templateタグ内のデータだけを抜き出す if( preg_match_all( '/([\s\S]*)/i', $sTemplate, $matches ) ){ $sTemplate = $matches[1][0]; } /* ================================== Smarty処理 ================================== */ //Smartyオブジェクトの生成 $oDocument = new Smarty(); //テンプレート用変数データの割り当て $oDocument->assign( 'sample', 'this is a sample text' ); //取得したテンプレートの文字列データもテンプレート変数として割り当て $oDocument->assign( 'buffer', $sTemplate ); //データを流し込んで表示 $oDocument->display( "buffer.tpl" ); 使いやすいようにURLを渡すだけで、テキストとして返してくれる関数を作りました。→ file_get_googletext( $sURL ); ■buffer.tplの中身 Smartyテンプレートディレクトリに置くファイルの中身です。$bufferにテンプレートの文字列データが入っているので、Smartyのeval関数でパースします。 {eval var=$buffer assign="parsedBuffer"}{$parsedBuffer}