というわけで、OpenPNE2のコード読み。手を入れるかも知れないし。
んー、Mojaviベースだよなー・・・・と思いながら、Mojaviディレクトリを探したけど無い・・・・。
あ、MojaviはLGPLなんで、OpenPNEをPHPライセンスにする時に衝突回避のためになくしたのかな・・・って、LGPLのSmarty同梱してるな・・・。ま、いいや。多分、構造自体はMojaviによく似た感じなんだろう。
とりあえず、htmlspecialcharsを探す
ユーザー名とか、ちゃんとエスケープしてるんだけど、SmartyにAssignしてる時点でやってるのかなーって思ったけど、
/openpne2/webapp/lib/OpenPNE/Action.php
<?php class OpenPNE_Action { /** * Viewに値をセットする * * @param string $key * @param mixed $value */ function set($key, $value = null) { $this->view->assign($key, $value); } /**
あれー、直で渡してる・・・。
うーん、$this->viewのclass OpenPNE_Smarty extends Smartyでも、assignメソッドはオーバーライドされてないし・・・。
あー、OpenPNE_Smartyのコンストラクタに
/openpne2/webapp/lib/OpenPNE/Smarty.php
<?php $this->default_modifiers = array('@t_escape');
って入ってるから、Defaultで変数の出力時にやってるんだ。なるほど。FrameworkだとRenderingエンジンを変えた場合問題になるけど、PNEはSmartyOnlyだからこれで問題ないわけだ。
えー、じゃあHTMLが必要なところは???
日記の詳細ページのテンプレート見たら
({$target_diary.body|nl2br|t_url2cmd:'diary':$target_diary.c_member_id|t_cmd:'diary'|t_decoration})
とか、めっちゃ頑張ってた。
しかし、Actionが継承されてないから
Actionが全部extends OpenPNE_Actionなもんで、実行コードの重複がヒドイ・・・。まー、Mojaviベースだからしょーがないんかなー*1。まぁ、これ見たら確かにPNE3はSymfonyでゼロから作りたくなるけど、ここまで機能を付けているからフルスクラッチは大変じゃろう・・・。しかも、ユーザーはそんなこと知らないから
「なんでバージョン上がってるのに機能ないねん」
みたいにとらえちゃうだろうしな。このあたりは、XOOPS→XOOPSCubeLegacyも同じ末路をたどりそうだったけど、XOOPSはMOD精神だったんで「コードは新しいけど、過去遺産も継続」っていうウルトラCなことやってたし。
だけど、コアだけ新しいから
「新しくなったつーけど、機能は増えてないやん」
みたいに言われてた。(笑)
ま、モジュール開発者にとっては、XOOPSよりXOOPSCubeLegacyの方が100倍くらい楽しいんだけど。だから、モジュール作ってXCLの方がいいですよーってやってる自分。*2