作成ページでPHPが通るようにしたい

category-icon

 こんばんは。昨日に引き続き。

 ppBlogでは、ブログのエントリーとは別に自由にページを作成することが出来るので、いわばCMSGのような使い方も可能です。このページ作成機能ですが、以前から改善したいなぁと思っていたことがありました。それは、作成したページの中に記述したPHPがスクリプトとしてちゃんと動作するということです。

 現状では、例えば、以下のような記述をしてページを作成してもそのまま書いた文字列が出力されてしまいます。

<?php
 echo "Bonjour à tous!"; // やぁ、みんな!
?>

上の記述は、以下のようになる。

echo "Bonjour à tous!"; // やぁ、みんな!
?>

 ページ作成画面でPHPスクリプトを自由に記述できれば、PHPに慣れた方なら色んなことが出来るようになります。なので、そうできるようにしてみましょう。ppBlogでは、作ったページは、単なるテキストファイルとして、pagesディレクトリに保存され、それをmodules/pages.inc.phpを介して、HTMLとして出力されます。なので、pages.inc.phpモジュールをいじります。具体的には、このファイルの中で定義されているoutputPage()関数に手を加えれば良いです。

 流れとしては、テキストファイル中に書かれてあるPHPタグ<?php・・・?>があれば、その中身をeval関数で評価、その結果を保持しておく。eval関数はその場ですぐに評価されるため、それがHTMLとして出力されるのを防ぐために、出力のバッファリングを有効にしておく、ということです。簡単に実装出来そうですね。以下のような記述でいけるかと思います。

if(preg_match_all('{<¥?php(.+?)¥?>}s', $page, $mt)){ // PHPタグを含むなら
  $BUFF = array(); // 評価した結果を保存する入れ物を用意しておく
  ob_start(); // 出力のバッファリングを有効に
  $length = count($mt[0]);
  for($i = 0; $i < $length; $i++){
   $php = $mt[1][$i]; // 実行させたいPHPスクリプトの中身
   if(eval($php) === FALSE){ // PHPのパースエラーなら
    $BUFF[] = "ppBlog warning: parse error!";
   } else $BUFF[] = ob_get_contents(); // きちんと評価されれば、その結果を取得
  }
  ob_end_clean();
 }

 ポイントは、ob_start関数とeval関数の組み合わせです。その際に、eval関数の返り値は、パースエラーならFALSEを返すけど、きちんと評価されれば、ob_get_contents関数で補足可能ということですかね。

 実際には、これ以外の微調整が必要ですが、それも反映させたPHP記述が有効になるpages.inc.phpを添付しておきます。既存のやつを上書きして問題ないです。

 と、これを書いている途中で思いついたのですが、ppBlogでは、[style]...[/style]の形式で、その記事だけに適用させるスタイルシートを指定出来ますが、これもページ作成画面でも指定出来るようにしました。このサイトで「人気記事ランキング」というページを作りましたが、そのソースは以下のようになってます。これをそのままページ作成画面のテキストエリアに貼り付ければOKです。

<h2>人気記事ランキング</h2>
<?php
echo '<ol>'.NL;
echo showRanking(); // utils.phpで定義している独自の関数も使える!
echo '</ol>'.NL;
?>

[style]
h2 { color: slateblue; margin: 1em auto 2em auto; }
ol li span {
 background: pink; font: bold 12px Arial; color: navy; padding: 2px 3px;
}
ol {
 list-style-type: decimal;
 width: 480px; margin: auto;
}
[/style]

 コメントにもありますが、utils.phpで定義している関数も使えるので色々と応用が利きそうです。ちなみに、上のスタイルシートの指定で、実際には以下のように、div.page-boxが自動的に付加された形で出力されます。

 <style type="text/css">
  div.page-box h2 { color: slateblue; margin: 1em auto 2em auto; }
  div.page-box ol li span {
   background: pink; font: bold 12px Arial; color: navy; padding: 2px 3px;
  }
  div.page-box ol {
   list-style-type: decimal;
   width: 480px; margin: auto;
  }
 </style>

 スタイルシート指定も有効するには、utils.phpもちょいと書き換えが必要です。これも添付しておきます。最近のバージョン(1.7-1.8)であれば、既存のを上書きしても特に動作に問題はないかと思います(いつでも元に戻せるように元のutils.phpのバックアップはとっておいて下さい)。

— posted by martin at 06:55 am   commentComment [3]  pingTrackBack [0]

この記事に対するコメント・トラックバック [3件]

scrollUp1. にこにこ Website — 2009/08/17@20:09:48

はじめまして、今年4月よりPPblogを使わして頂いております。学童保育の情報発信に父兄より好評を頂いております。これも貴兄のPPblogのおかげと感謝しております。最近機能アップを色々はかられておられりますが、ご検討いただきたい機能が有りますそれはppblogにおいて画像ギャラリーをサイドメニューにスライドショーとして表示したくブログパーツ、PHPスクリプト等探していますがなかなか思うものがありません。もしよろしければ機能追加をご検討いただけないでしょうか?

Owner Comment martin Website  2009/08/18@16:42:53

 こんにちは。スライドショーのスクリプト、時間があればこちらで書きたいのですが、そう時間もないので探してみました。Googleのfeeds APIを使うと良い感じかなと思います。http://martin.p2b.jpLink  (テーマ3paneの場合)
 これを動かすには、mediaRSSを作成する必要があります。こういうので良ければ、記事としてエントリーしますのでお知らせ下さい。

3. にこにこ Website — 2009/08/18@20:32:03

早速、気にかけて頂きありがとうございます。:)
探していただきましたGoogleのfeeds APIを試してみます。
私の思いはサイドメニューに画像ギャラリーの画像がスライドショーになって表示されクリックするとそのエントリーが表示されるというような機能は汎用のものでは無理ですよね。
PHPが書けると出来ることは分かっているんですがなかなか難しいですね。
ppblogだけでも貴兄には感謝してもしけれませんのにご無理を言いまして申し訳ありませんでした。

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~

     
T: Y: ALL: Online:
Created in 0.0449 sec.
prev
2017.7
next
            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