読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

OpnePNE2のソースコードを読んでみる。(その1)

php

というわけで、OpenPNE2のコード読み。手を入れるかも知れないし。

んー、Mojaviベースだよなー・・・・と思いながら、Mojaviディレクトリを探したけど無い・・・・。

あ、MojaviLGPLなんで、OpenPNEPHPライセンスにする時に衝突回避のためになくしたのかな・・・って、LGPLSmarty同梱してるな・・・。ま、いいや。多分、構造自体は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

*1:そんなこともないかと思うけど

*2:このあたりは、自分はXOOPSCubeLegacyでしか動かないモジュールでいいって思ってる理由でもある