このurl2cmdのif文のところで、入力されたurlを解析して、tabelogのレストランIDみたいなものを取得して、それをmain関数に渡します。main関数の部分ではiframeを作っています。この部分でiframeを作って、最後こちらで、Javascriptでdocument.writeをかけているというような仕組みになっています。このような形で作られています。このように、おもしろい機能ができるわりには、わりと行数が少なくて単純で楽しいですよっていうのが、cmdの魅力なのかなと思います。他にもいっぱいありますね。ebitvとかgoogle、まぁ、GoogleMapに対応するために結構いろいろ入ってるかなという感じです。このnetpriceとか、あと、ニコニコ動画なんていうのも実は入っています。これも13行しかないですね。houto」という検索をかけると、pne-cmdというページで、youtube小窓を例にとって作り方が記載されています。3番目の説明は、このpublic_htmlというディレクトリになります。このpublic_htmlというのは、OpenPNEを呼び出すApache側、webサーバ側がここのpublic_htmlの下を基点にして、呼び出すという形になっています。要するにブラウザでこのurlを直打ちされたら呼び出されてしまうということを気をつけた方がいいなと思います。会員データベースのエクセルとかを置かないように注意してください。このディレクトリが、ブラウザからのrootになるという形です。「/skin/birthday_f.gif」と打つと、こう表示されるという形なので、webブラウザから直接閲覧できるってことを注意してください。public_html以下っていうのはweb上に公開されます。逆に言うと公開しないと使えないものたちが入っているということです。上から説明していきます。上がcmdディレクトリで、これは後で説明しますけれど、YouTubeとかkakaku.comとか、OpenPNEの外部から引っ張り込むコンテンツをMashUpするための仕組みで、Javascriptが全部入っているというディレクトリです。基本的にOpenPNEで使うスタイルシートはこちらに入っています。違うFlashに置き換えることもできます。現状は1個しかないです。このFlashのソースコードも公開されています。これを編集して上げ直すと、違うフレンドリストが作れるので、ぜひトライしてもらいたいなぁと思っています。次、flashの下がimgです。ここはデフォルトでは使わないディレクトリです。画像の一時ファイルをvarディレクトリに入れるのではなくpublic_html側に公開することで、ブラウザが直接アクセスできるようになります。なんでその分、PHPが画像を読んで吐き出し、じゃなくて、Apacheが直接画像を読めるので、早くなるという形で、スピードを上げたいときにこのpublic_html/imgの中に画像を置くという形です。ここはデフォルトでは使ってないと思います。スピードを上げたいときには絶対使うような機能ですね。それで、あとJavascriptをいろいろ使うので、prototype.jpとか。必要なJavascriptが置いてあります。あとはmodulesっていって、モジュールごとに画像やファイルを置いておきたいので、そのために場所を用意してあります。使ったり使わなかったりという感じですね。デフォルトのスキン画像がこちらに入っています。管理画面で「初期値に戻す」という風にすると、こちらのスキン画像に戻るという形です。ここを全部そっくり入れ替えると、デフォルトのスキン画像が交換できるという仕掛けになっています。public_htmlの後半です。cap.phpというのがあります。capというのはおそらくCaptchaのことだと思います。OpenPNEで友人を招待するときに、ぐちゃぐちゃぐちゃって波打った暗号みたいなのを打たされるんですが、あれがCaptchaというんですね。Captchaを生成するものがこちらにあります。OpnePNEからは独立して動くので、ここに置いてあります。それで、こちらにもやはりconfig.inc.phpという、config.phpを探すためのファイルが置いてあります。後方互換性と言って、OpenPNEの昔のバージョンのために作られています。昔はdo_normal.phpや、page.phpといって、それぞれ別々のPHPを読んでいたんです。認証がかかっているページで実行系はdo_page.phpという風に分かれていたんですけれど、2.4か2.6くらいでは、もうindex.phpにまとめてある。すると、以前のバージョン使った日記に、このページ見てよ、この日記見てよといった人がリンク切れになってしまうので、それを防ぐために以前のPHPが入っているという形です。これはそのうちなくなってしまうと思います。それで、download.phpはファイルダウンロード用に使うんじゃないかと思うんですけれども、OpnePNE2.8からファイルアップロード機能が入りまして、そのために使われていると思います。画像を呼ぶときだけ、例えばプロフィール画像とか日記の写真とかだけは、index.phpではなくて特別なimg.phpというのを読んでいます。内部も見ていきましょうか。この中で今見ておかなきゃいけないもの、一番大きいのはindex.phpですね。これは、フロントコントローラモデルと言いまして、最近の主流です。全部index.phpに預けてしまう。一回集めてしまって、そこの中でいろいろやろうという形で、OpenPNEもこのフロントコントローラモデルというのを採用しています。index.php開くと、1行しかなくて、この「openpne_execute()」という、一個大きな関数が呼ばれて、それですべての振り分け、これは実行系なのかな、これは表示系なのかな、これはなんなのかな、といった形で、このopenpne_executeが行います。openpne_executeっていうのはまた後で説明しようと思うんですけれど、openpne_executeは、/OpenPNE/trunk/webapp/libのcontroller.php、この中にあって、この下に、indexで呼ばれたら実行されるという形でつながっています。大事なのはこのpublic_htmlの中のindex.phpが呼ばれて、ここからすべてのアクションに誘導されるということです。public_htmlはこんな感じかなと。setupのディレクトリを説明します。このsetupのディレクトリは通常の動作とはあまり関係がなくて、OpenPNEを設置するときだけに使うものです。内容としては、このsql、セットアップするために必要なデータベースのセットアップのsql文が入ってるところと、あとはHTMLファイル、セットアップの仕方を示したHTMLファイルが入っています。具体的な設置の仕方みたいなことに関しては、このHTMLの方を見てください。セットアップのHTMLを見て、設置をしてほしい。これもわかりにくいというか、素人さんには難しいところなんですけれども。前の安定版の2.6から2.8、2.8から2.10という形でのメジャーバージョンアップ用のUpgradeのガイドも書いてあります。このsqlのディレクトリの中に入りますと、mysql40とmysql41っていう形で、二つのディレクトリがあります。mysql40は、MySQL4.0用のセットアップ文が入っていて、mysql41には4.1用のセットアップ文が入っています。実はMySQL4.1と5.0の方が違いが少ないという。0.1しか違わないのと0.9違うのに結構すごく。日本語の処理のところで非常に違いがあるので、OpenPNEでは二つに分けています。新規で立ち上げる人にとってはあまりいらないものです。installだけあればいいと。大きく上がるものですね。0.2のバージョンアップ、安定版から安定版へバージョンアップすることを、upgradeとって言います。普通の利用者はupdateはほとんど使いません。updateっていうのは、OpenPNE2.9.1から2.9.2、2.9.2から2.9.3っていう形で、開発版のバージョンを上げるためのディレクトリです。安定版を使っている人、使い続けている人にとっては、upgradeだけ見てればいい。OpenPNEの最新機能を勉強したいとか、ちょっとずつ最新版を使っていきたい場合には、このupdateっていうディレクトリを見る必要があります。いうことで簡単に言うと、updateを全部やると、upgradeと同じになります。upgradeのSQLはupdateの塊でしかありません。これがupdateとupgradeの違いです。MySQL4.0用のディレクトリにはinstall、option、update、upgradeってありますし、MySQL4.1用にもまったく同じものがあります。違いがあるとすると、installのところのこのcreate_tablesという、テーブルのデータ構造を作るとき、このあたりで、MySQL4.0、4.1で多少文法の違いがあるようです。CHARSETを設定するあたりとかに、どうも違いがあるみたいです。TABLEのあたりで、データベースのテーブルを作ります。40個とか50個とかテーブルを作っています。作られた構造に、OpenPNEとしてのデータの初期値を入れます。した初期設定値が入っています。こちらだとコミュニティの初期カテゴリが、地域、グルメ、といった形で入っています。いてはvarディレクトリの説明に入ります。一時的なファイル、一時的なデータを置いておく場所です。実体のファイルではなくすべてデータベースに置こうという方針をとっています。全部のデータをデータベースから読んでいると非常にスピードが遅くなる、ということがありますので、データベースに一回読んだファイルをこちらのvarフォルダに置いておき、データベースにあまり読みにいかなくてもいいようにするという形で、スピードを上げることができます。その一時的なファイル置き場がここで、だから、実はここのファイルは消しても大丈夫です。本体のデータベースの方に読みに行って、またvarフォルダを作ってくれるので、ここは定期的に消しても構わないし、バックアップをここは取らなくても大丈夫です。OpenPNEではconfig.phpとデータベースの本体だけバックアップを取れば復旧ができるという仕掛けになっています。上から説明しますと、一番上がfunction_cacheというものを置く場所で、function_cacheっていうのが関数の結果、functionをcacheするという仕組みです。OpenPNEで関数の計算時間が長いものがあるんです。ランキングを集計するというのは非常に時間がかかります。ランキングは一日に一回だけしか計算しない。実は計算が非常に大変なんです。その日のうちに誰がどれだけアクセスがあって、というようなのを全部記録しなきゃいけないので、しかも一日に一回しかやらないでいいから、毎回計算する必要は全くない。一日に一回あらかじめ計算しておいて、このfunction_cacheに置いておこう、というような使い方として、このfunction_cacheを使っています。二回目はデータベースで計算をしないでそのままファイルを読んで出すというような使い方をしています。これがfunction_cacheです。次がimg_cacheといって、OpenPNEに上げられた日記とか、プロフィール画像とか、そういったものをキャッシュしていく場所です。このディレクトリを見ると、まずは拡張子別、gif、jpg、pngっていう形で分かれていて、その下を見ると、今度は高さ・幅、サイズ別に分かれています。プロフィール写真では180を使うとか、フレンドリストでは76を使うとか、サイズごとにキャッシュを作って置いておく。生データはh_rawに置くという形で、サイズごとに分けている。全部を一箇所に置いてしまうとものすごいファイル数になってしまって、性能が劣化するので、サイズごとに分けています。img_cacheというのは、gifとかjpgとかpngとかをリサイズした結果を、置いておくことになっています。これはエラーログとかメールの実行ログとかを記録するところです。次がrss_cache。これが、日記、外部ブログを取り込んだ結果を置いておきます。ここを5分に1回とかCRONをかけてキャッシュを置いていくということになります。あとtemplates_cというのがありまして。しているとめんどくさいので、Smartyがここを使って、構文解析の結果をここに置くという形になっています。日記を投稿して確認画面をやってる途中に、写真を保存しておく場所として、tmpという形で置かれます。ここに一時画像とか一時ファイルとかが置かれるという場所です。実際どう使われているかっていうのを説明しようと思います。OpenPNE.jpを例にして説明しようと思います。こちらがOpenPNE.jpにログインしたshellの画面になります。TeraTermを使っています。今、こちら先ほど画像を消してしまったので、ここのpublic_html/img/gifで、w76h76の画像が置かれるvarフォルダなんですけれども、ここを見ると何もないんですね。今キャッシュファイルがないという形、たった今消したんですけれど。キャッシュファイル作る場合には更新をして、画像を要求してみる。表示ができたってことはキャッシュが作られただろうと。表示をしてみると、案の定ファイルがいっぱい作られているという形です。非常に早く、レンダリング、データを返すことができます。消してしまうこともできます。それで、こうやって、きれいさっぱり消してしまっても、OpenPNEとしては表示ができると。その代わり表示がちょっと遅くなりますね。最初は、今までデータベースに読みに行かないでvarフォルダから読めてたものが、データベースに一回読みに行って画像を作り直して、表示するという形になるので、で、また表示すると入っている、という形で。他のも見ていこうかな。こちらのvarの中だと、function_cache。ここにcacheがごろごろ転がっている。実はこのデータが結構バカにならないんですね。1.7Mbyte溜まってしまっていると。ギガまでいかないけど数百Mbyte単位であるんじゃないかな、と思います。logディレクトリの中身っていうのは、PHPのエラーが記入されている。WarningとかNoticeとかいう形で、主に多分、CRONが取れませんでしたっていうエラーが結構出やすいです。あとrss_cache。ここもrssの一時データが置かれています。rssの取ってきたデータが置かれている。ここも消してしまって全然構わないです。最後にtemplates_c。ここには、Smartyのテンプレートファイルの一時データが置かれている。これも消しちゃって構わないんで、消しちゃう。最初の一回目はちょっと遅くなるんですけれども、テンプレートの再生成をして、こういう形で、テンプレートができあがります。いて、大物なんですけど、webappのディレクトリへいこうと思います。webappっていうのがOpenPNEの根幹になる部分で、その中でも、libから行きましょう。webappのlibっていうのは、いっこ上のOpenPNE直下のlibとは別で、OpenPNEで使われるライブラリが置かれています。OpenPNEで作った、という方が正しいのかな。OpenPNEがOpenPNEのために作ったライブラリが置かれています。役割ごとにファイル、モジュールを分けています。templatesというのにはOpenPNE全体にとって使われるテンプレートが置かれていて、メールのテンプレートとか、ここは少ないんですけれど、OpenPNE全体が使うテンプレートを置いています。入力値に問題がないかとか、これはメールアドレスかとか、これは文字数何文字までに当てはまっているかとかいったことを設定するための書式になります。それに、init.inc、version.php。init.incは初期設定の値。初期設定を置いています。version.phpっていうのは単に、PHPのバージョンを示すための宣言をしているファイルです。このムービーでは、この中でもlibだけを説明しようと思います。OpenPNEの、webappの中のlibっていうのは、こちらで分かれています。db、mail、OpenPNE、smarty_blugins、util......という形です。dbというのには、OpenPNEの定義された50ぐらいあるデータベースを読み書きするために使うライブラリ群が入っています。mailっていうのにはメールを操作するためのライブラリ群が入っています。OpenPNEっていうのは、OpenPNE本体の中でいろいろ作られている。携帯のメールを処理したり、データベース処理したり、画像を処理したり、あとValidatorといって入力の妥当性検証したり。携帯のUAをチェックしたり、RSSを操作したり、Smartyいじったり、Validationとか......。OpenPNEがいろいろやらなきゃいけないことを、ライブラリとして置いていると。データベースのテーブルの数だけファイルがあると思ってほしいです。いや、ちょっと違うか。action.phpっていうのはactionを操作するためのdbライブラリで、つまりactionというテーブルを操作するためのファイルです。これは一個しか関数がない。apiを操作するための関数群ですとか、あしあとデータベースを操作するための関数群ですとか。決められた数だけ取得する関数で、ここで呼ぶとあしあとのデータリストまで飛んでく。あしあとを書いたり、読んだり、あしあとのデータベースを読んだり書いたりするものが含まれています。同じような形で、ここに書いてあるのが主に、特定のテーブル、バナーテーブルとかブックマークテーブルとか、コミュニティのテーブルとか、そういったところを操作するための関数文が含まれているということです。関数を見つけるといいんじゃないかと思います。それで、その下がmail。さっき説明した、binの中のmail.phpでやってるんですけれども、その実体はこの中にあって、メール投稿であるとか、コミュニティ書き込みであるとかの処理の実体はこちらで引き受けています。webappの、modulesの中身を説明します。modulesのディレクトリの中は、admin、api、ktai、pc、setupと、役割ごとに分けています。今のところこの5項目に分かれています。ディレクトリの説明をすると、adminは、管理画面の、ページと実行系の機能文。管理画面の機能はこのディレクトリの中に全部含まれています。外部との連携をするときのプログラムが入っています。最後、setupには、OpenPNEをセットアップするためのものが入っています。上から見ていくと、adminなんですけれども。見て欲しいのが、ここではadminディレクトリ、というか、modules内のディレクトリを開いてもらうと、また下に、do、lib、page、templates、validate、auth.inc、init.incとある。この分け方で、どんな使われ方をしているのかを説明していこうと思います。doというのは、実行系の関数群、実行系の機能が含まれているディレクトリです。libというのは、このmodulesだけで使う。OpenPNEでかつこのmodulesだけしか使わない特別なlibを置く場所として作られています。これは使わないこともあります。pageというのは、表示するpage系、ページを表示するために必要なPHPが入っている。templatesは、その表示をするときに、デザイン、こういう見た目で表示をしたいというテンプレートが含まれています。妥当性検証というんですかね、入力値のチェックのために使われます。auth.incは認証をするために使って、init.incは初期設定をする。doから見ていきましょうか。実行する、なにかデータベースに影響を及ぼすような機能を入れています。doっていうのは実行するため、です。削除を実行せよ、とか。あと下の方だと、insertとかがありますね。追加とか削除とか、変更とかっていう変化を起こすためのページ群がdoということになります。大体のところではこのフォームに当てはめられています。削除ボタンとかフォーム入力のsubmitボタンとかに対応していることが多いです。doにはこういった、実行系の関数が置かれます。次にlibなんですけれど、これは、ここならadminでしか使わないlib、ここだと非常に少ないです。adminだけしか使わないデータベースの接続ライブラリが置いてあったりしている。これが、ページ群ですね。管理画面の、特定のページを表示するために使われています。管理画面のあるページを見るとして、URL内のpage_edit_skin_imageというような形が、このpageディレクトリ内のedit_skin_image.phpと対応しています。webapp_bizwebapp_ext※ムービーは作成中です。page系について※図示して説明するindex.phpでの初期化処理public_html/index.phpからどのように遷移をしているか?ブラウザからはindex.phpが呼ばれる。その後config.inc.php=>config.phpを呼び出し、設定を行うinit.incを呼び出し、OpenPNEアプリの初期設定を行う携帯ドメインの決定や、各種ライブラリの呼び出しなどを行う。初期処理の後controller.phpのopenpne_execute();を呼び出される。index.phpでは処理を全く行わない。public_htmlの中で、プログラムがどういう動きをしているかという説明に入ります。ブラウザからアクセス、リクエストが来たら、まず、index.phpが呼ばれる。最後にopenpne_executeが呼ばれる。index.phpはたったこの3行だけの作業をしています。config.inc.phpで何をしているか。何回でも呼べるけど、いろんな箇所で呼んでも、一回しかrequireしないよ、という命令です。このconfig.inc.phpがどこにあるかと言うと、index.phpと同列にあります。ここで何を呼んでいるかと言うと、ここでも、二個しか呼んでいない。これで最終的に、config.php、OpenPNEをセットアップするときに、データベースのパスワードであるとか、そういったものを設定するためのconfig.phpをrequireして、その設定値を読み込むということになっています。config.phpは、設定ファイルというイメージですね。次にinit.incというのが呼ばれます。init.incがどこにあるかというと、WEBAPP_DIRの下、となっていますので、OpenPNE/trunk/webapp/init.incが呼ばれます。携帯メールのドメインはこれである、ということを決定したり、あとはSmarty関連。いう初期化作業をいっぱいやっています。各種ライブラリを呼んでいったりとか、セッションの設定をしたりします。init.incがロードされたことでどうなるかと言うと、このPHPプログラムが、すべてのOpenPNEのツールの場所がわかるんです。このライブラリはここにあるとか、Smartyはここだとか。いう初期設定が終わっているので、OpenPNEのプログラムが、全関数を呼べるようになる。この二つが成されることによって、index.phpから、openpne_executeという関数を見つけることができるようになります。要するに、この二つの処理、config.phpの呼び出しとinit.incの呼び出しをやっておかないと、openpne_executeってどこにあるんだよ、ということになってしまう。この二つをやることで、初期値を読み込んで、初期設定も終わった、という形で、OpenPNEの全関数がどこにあるか、プログラムがわかるようになり、このopenpne_executeを呼び出せるようになる。次、openpne_executeを見てみましょう。これがどこにあるかというと、OpenPNE/trunk/webapp/libの下の、controller.phpというところにあります。呼ばれる」という形で、index.phpというのは3行しかなかった、ほとんど空っぽでした。全部このopenpne_executeの中で行っています。いう形で、モジュール名を特定する。「m=○○」とかいうのがありましたね、あれをこう、設定するという。強制的に’ktai’にしてしまえ、というような処理が入っていたりします。openpne_execute関数での処理openpne_executeの説明openpne_forwardの説明モジュール名の特定や、メンテナンスモード時の内部動作について説明する。モジュール/init.incファイルの設定もある。いてまた、openpne_executeの説明です。ここまで、openpne_executeが呼ばれたら何をするかというと、モジュール名を特定する。requestのm=pcとか、m=ktaiとかいったモジュール名を特定します。強制的に’setup’のモジュールにして、初期設定、インストールのモードにもっていってしまいます。強制的に’ktai’のモジュールを呼び出します。いう形で、決まりごとは決めていってしまう。それ以外だったら、’pc’のモジュールだよね、という形で、モジュールの名前を修正するような仕組みになっています。次にアクション名の取得ですね。「action=page_○○」とか、「action=do_○○」とかいうのがあると思うんですが、それを’a’の変数に一回取って、typeとかactionとかを特定していきます。これによって「m=pc&a=page_」の「a=」の方をきっちり取得するという。次にopenpne_forwardっていう、モジュールの処理の部分にプログラムのプロセスが移動します。このopenpne_forwardで、実際のモジュールの処理をやっていくのだけれど、openpne_forwardっていう関数には、モジュール名が渡される。typeが決まっていって、actionがセットされる。‘モジュールが見つかりません’という形で、エラーを表示しなさい、という指令を出して終わりにしてしまいます。今このプログラムではこのモジュールを使おうとしていますよという宣言をします。config.phpの設定値で、使っちゃいけないモジュール、たとえば「今は時間メンテナンス中だからPCの画面にアクセスされたくない」とかいうこともできます。「セットアップはもう使わなくていいからアクセスしないようにしよう」というように、モジュールを設定で無効にするもできる。ここに引っかかったら、モジュールが無効で、エラーに飛ばされるということになります。あとはメンテナンス中の設定になっていたら、やっぱりエラーになるわけです。「メンテナンスだから表示できません」と。先ほど最初に紹介したinit.incっていうのは、OpenPNEのプログラム全体で利用するinitです。初期設定がまた必要だったら、モジュールのinitも呼べるようにしてある、という形で、モジュールディレクトリのinit.incをロードせよ、という設定になっています。webapp/modules/pc/init.inc、ここをロードできるようにしてある。ここにはPCモジュールで使う初期設定値を入れてあります。要するに、OpenPNE全体の初期設定をする場合には最初のinit.inc、モジュールごとのセットアップをしなきゃいけない場合は、こちらのinit.incを使うという形です。このように、openpne_executeからきて、forwardにきまして、いろいろ読み込んでいると。モジュールが無効だのなんだのと。init.incをロードしました。‘リクエストの種類が正しくありません’という風になる。これで、全部通過して、OKだったら、ようやく、どういうアクションのタイプか、ページを表示しようとしているのかそれとも実行しようとしているのか、というところまでを特定してあげる。それで、最後に、ここから先がaction。これは、次にしましょうか。true;}でセットされている。いて、actionから行きたいと思います。値が正しいのかどうかからいきます。本当にactionがOpenPNEの中で定義されているかどうかを調べる。エラーだったら、アクションの書式とかが間違っていた場合は‘アクションの指定が正しくありません’とか、アクションファイルが入っていない場合は‘アクションファイルが見つかりません’と。これは要するに“{$module}/{$type}/{$action}.php”というのが見つからない場合に、エラーが出てしまうと。page、だと、modules/pc/pageの中の、c_event_editとか。これが、アクション名になるというわけです。これがなかったら、エラーが出るということ。見つかりませんよ、という形でエラーが出るという感じです。それでまぁ、classを見つけたり、とか、この辺もまだ初期処理ですね。全部大丈夫だということになったら、ようやく、アクション名にアクションがセットされる。次には’is_secure’というのがきます。is_secureというのがなにかというと、そのページをsecureにする必要があるかどうか、つまり、ログインした人にしか見せないページにするか、それともログインしてなくても見せるページにするかっていうことがあります。c_event_editのアクションクラスというのを作っているので、ここの中では必ず、is_secureの関数っていうのを含めなければならない、という決まりがあります。ここで、アクションクラスをinstans化して・・・・・・ここで、instansを$action_objという形で作ってるんですね。今度はauth.incっていう、認証系のincludeファイルをrequireする、という。これをrequireすることで、ログインした人しか入れないページを作り出すことができる。認証のチェックをしないでページをレンダリングします。認証のないページを一枚出してみましょう。false;}と書いてある。いう関数が定義されている。先ほどのif文で、この部分がfalseになる。すると、「secureじゃないよ」という返事が返ってくるということになる。それで、ログインの必要ないページではfalseが返るんだけれど、ログインが必要なページ、例えばh_homeとか。h_homeというのは、実は何も書いていない。isSecureという関数がないんですよ。これはおかしい、どうしてか、と言うと、これはextendsされている。何も設定しなければ、secureなページになってしまう。「これはsecureなページじゃないよ」と指定したときに初めて、ログインが必要じゃないページになるという感じになります。この辺、結構ハマりやすいかな、と思います。入力値のバリデーションについてバリデーションについてmodules/pc/validate/page/h_schedule_edit.iniファイルにバリデーションの設定ファイルが記述されている。するか?等の設定を行うことが出来る。type=pageのアクションを処理する。入力値をチェックするところに来ます。初期化作業をして、common_validateというところが、結構ポイントになるんですけれども、その前にopenpne_ext_searchとか、{$module}/validate/{$type}/{$action}.iniを参照してくる。これを見つけてみましょうか。webapp/modules/pc/validate/page、と行って、その下にiniファイルがあります。要するに、このiniファイルが、validaterの設定ファイルということになります。中身の多いのが、h_schedule_edit_confirm.ini。中を開いてみて、どんなvalidateになっているかというと、ここにいっぱい、設定値が書いてあります。最小値は1であるとか。bodyもstringでなければいけない。このtitle、stringは、requiredではないので、もし入力がなければ空欄で初期設定してあげますよという形で、ページに渡される引数とかが、ちゃんと正しい値におさまっているかどうかを、こういった別のファイルで管理をしています。これをプログラムで書いていくと大変なので、こういう書式になっていて、この書式をいじることで、このページの、渡される変数値のチェックをしている。不正をされてしまったりとかいうことがあるので、このバリデーションというのは結構、きっちりやる必要がある。人間がプログラムで書くと間違えやすいので、こういう設定値で管理をするということよくをやっています。controller.phpのファイルに戻って、ここで、バリデーションの処理をしている。$validator->common_validate($files)というのを行う。「バリデーション失敗しましたよ」みたいなのを返すことになります。これでまた関所を突破、バリデーション、入力値チェックという関所をまた通過しました、という形で、ようやく次は、type判定になる。page系の処理だったらこう、do系の処理だったらこう、というかたちで、ここのswitchではまず、page系の処理、要するにページをレンダリングしてくれ、という指示であることを判別したら、ようやく、ここでテンプレートエンジンのSmartyが出てきます。ここで初めてSmartyを初期化してやっていくと。先ほどのm=pcとか、変数名、page=○○とかを、ここでassignしています。後はOpenPNE側で渡さなきゃいけないメッセージとかのassign等を表しています。決められたメッセージの渡し方です。それで、もしここまでに来るまでで、エラーメッセージ等が設定されていれば、エラーメッセージもassignしてあげるという形です。設定してあげる仕組みもあります。SSLの処理だったらどうだろうとかがあって、これは、HTTPSとかたまに変えたりしなくちゃいけないケースもあるのかな。$smarty、smartyまで来ましたので、この辺りでいったん止めましょう。do系page系などプログラムの処理do系page系の説明。OpenPNEでは個別ページの表示にpage_で始まるアクション(type=page)のアクションを利用する。ここで、page系とdo系の違いがよくわからないという要望があったので、page系とdo系の説明をさせていただこうと思います。僕がよく、page系とdo系、と言うのは、こちら、OpenPNEのページを表示するときに、URLに例えばpage_h_homeとかって書いてあるもの、これがpage系。ページを表示するために使うアクションタイプを、page系と言っています。それに対してdo系というものはなにか。実はdo系というのはほとんど見えません。do系が見えるケースというのはどこかというと、フォームです。「友達を誘う」というフォームがある。ここの「確認画面」というボタンに、doが仕込まれています。ソースを開かないと、基本的にdo系は見つかりません。ここが少しわかりづらいところかと思います。普通、pageだったらpage_h_inviteという風になるんですけれど、do系というのは必ずフォームの中に、例えばここに、do_h_invite_delete_memberというのがあります。FORMを処理するためのものです。tplに、formタグを作るためにかかれている。ページからページを表示するためには、単純なpage系のリンクを張ればいい。ログアウトするとなると、このログアウトボタンには、リンクにdo_inc_page_header_logoutとあり、doでログアウト、つまりそういったアクションをする場合にはdoを使うということです。ログインボタンもdo。大体、doが使われるのはフォームが多いですね。リンクでも、ログアウトのような「処理を実行」する場合にはdoを使います。ページはpage、実行系はdoという形にして、わかりやすく分けています。これは、フレームワークのやり方によって変わってくる。「TOPページを表示する」ためのpageアクション、で、doはフォームの数だけ作るという形に分けています。これはまぁ、良し悪しですね。僕らは、1アクション、1ページ1ファイル、1実行1ファイル、という形で、シンプルにしています。‘success’;をするだけ。実際には、個別に作成する。h_home.php等の中で、Smartyにアサインする変数群を作成する。最後にsuccessをreturnする。ここまで来たら、ようやくこれでSmartyがセットされます。最後にSmartyをオブジェクトにセットしたという流れになります。functionというのを呼びます。これはモジュールごとのinit.incの中に入っていまして、modules/pc/init.incの中に、init_pc_pageというfunctionがセットされている。先に処理しておかなければならない関数群というのを決めています。PCのモジュールでは、Smartyにセットしておかなければいけない変数群がある。フレンドの「MY_FRIEND」っていう名前とか。いったものをセットします。あと$is_secureだったらsession_idを生成しなきゃとか。モジュールごとに初期設定をしなきゃいけない、モジュールで、このアクションタイプだったら、Smartyを呼ぶ前にこのセットアップをしておかないと動かない、といったものを、一括してまとめています。いうものを通過しまして、$init_funcを呼んだと。ここで、action_objのexecuteっていう関数に来ます。‘success’;}となっているんですけれど、このままだと、なにもしないでOKと返すだけ。実際の中身はwebapp/modules/pc/pageの中の、例えばh_home。これがアクションクラスのサブクラス、子クラス。pc_page_h_homeっていうのが子クラスで、ここの下にexecuteの中身、あんこが入ります。それで、ここで何をやるかっていうと、Smartyテンプレートに渡してあげる前に、いろいろリストを作ったりしなきゃならない。実際の変数を呼んでくる処理っていうのをこのexecuteの中に記述します。ここは腰を据えてやらないと、難しいっちゃ難しいんですけれど、ざっと言うと、まず、自分がログインしたIDが何であるか、ページを見に来た人のIDを$uというところに仕込む。それで、ナビを取ってきたり、ナビバーの値を変数でセットしたりとか、おしらせ欄を取ってきたりとか、いろいろざーっと、とにかく、なにをやっているかというと、ここで、h_homeってページをレンダリングするために必要な値を、どんどん引っこ抜いてきているという。フレンドはどこだ、最新日記はどこだ、とか。メッセージはあるのかないのか。最後にreturn_successと。「大丈夫だったよ」という風に返してあげる。すると今度、こちらに戻ってくるんですね。$action_obj->execute($requests);と。そこに’success’が返ってくるわけですね。’success’だったら、このif文、レンダリングをしましょうとなる。$smartyのdisplayでtplを呼び出す。次はこの、実際の、{$action}.tplの中身を説明しようかなと思います。Smartyテンプレートの中身を説明アクション名・php・テンプレートのファイル名には関連がある。アクション名がa=page_h_homeであれば呼び出されるphpはh_home.phpテンプレートはh_home.tplと決定される。OpenPNEではデフォルトのSmartyデリミタを({})に変更している。テンプレートについてはOpenPNEよりもSmartyのノウハウが必要になる。OpenPNEをカスタマイズするには、まずSmartyを勉強することになるとおもう。executeで、returnがsuccessで返ってきました。要するに、executeやったときにSmartyにいろいろ変数を突っ込んでくれた。最後、success、もうレンダリングしていいよ、と返ってきたら、ようやくこの$smartyに、display、{$action}.tplっていうのをレンダリングしなさい、という命令が入ってます。この{$action}.tplでどこのtplが呼ばれるかというと、modules/pc/templatesっていうディレクトリの中に入っている、アクション名と同名のtplがレンダリングされます。それで今回、h_homeが呼ばれた場合には、h_home.tpl。要するにページ、PHPと、tplっていうのは、全く同名になります。ページアクション名がpage_h_homeだった場合には、PHPはh_home.phpが呼ばれるし、tplは、h_home.tplがレンダリングされます。こんな感じで、tplのぐちゃっとしたファイルがある。headerを呼んで、HTMLタグとかを作るわけです。htmlとかheadとかbodyとか。検索画面を出すか、なんてのがあったり。検索ボックスを出したりとか。これはHTMLとSmartyテンプレートの拡張タグみたいなものが入り混じっているので、なかなか見難いです。いくつか特徴を挙げておきます。普通のHTMLはHTMLで書けばいいんですね。制約なしにHTMLで書けばいい、と。HTMLで書くだけでは毎回同じページが出てしまうので、意味がない。毎回ダイナミックなページを出したい場合には、このSmartyのタグを使います。通常、デフォルトのSmartyのタグっていうのは{}で作るんですけれど、{}はJavascriptと衝突するんです。OpenPNEでは、Smartyのデリミタを({})という風にしています。OpenPNEでは、({})で囲まれた部分をSmartyのタグとして認識するということです。functionで、inc_header.tplを呼んでください、という指令です。こちらの場合はif文、もしもSERCH_HOMEをDISPLAYしなさいという指令が来たら、このif文から、if文が閉じているところまで({/if})をレンダリングしましょうね、という。ここまでが検索窓です。管理画面で設定がonにされていればレンダリングされるし、offにされていればレンダリングされませんよという。あとはひたすらテンプレートと、Smartyのタグとの繰り返し。誕生日だったらここをレンダリングする。if文の設定値っていうのは、同名のh_home.phpから渡されています。ここはもう、ほとんどSmartyの書式なんで、OpenPNE扱うというよりは、Smartyのマニュアルを読むことが重要です。大事だったりするんじゃないかと思ったりします。do系(type=do)のアクションの処理フローdo系はcontroller.php内で明示的に記述されていないのでフローが追いにくい。type=pageが指定されてなければ、do系のアクションであると判別されて、executeが呼ばれる。“success”が無い。その代わりに、openpne_redirect()が呼ばれて、別のページにリダイレクトする処理が行われる。openpne_redirect()関数は、util.php内で定義されている。リダイレクトにはクライアントリダイレクト方式を使っている。HTTPプロトコルでLocation:ヘッダを送出することで、ブラウザに対してリダイレクトを依頼する。説明したいと思います。これ、プログラムの書き方がわかりにくいんですけれど、page系の方は明示的に、pageだったらこうしなさいという指示が入っている。この$action_obj->execute($requests)っていうのは、page系でもdo系でも両方、ここが実行される。page系だった場合はreturn”success”が返ってくるから、successが返ったらレンダリングしましょう、と。返ってこなかったら何もしないで後処理に回しましょう、という設計です。実はこの$action_obj->execute($requests)で、do系のexecuteも実行されている。executeがある。先ほどのpage系ではreturn_successとありましたが、ここにはreturnが何もない。別のページをレンダリングしなさいよというリダイレクトの処理に入ってしまってる。successは戻らないで、リダイレクトしなさいね、という指示になっている。openpne_redirect()、要するに「実行が終わりました」と。実行が終わっただけでは何もやらないんです。ページをレンダリングせず、実行が終わった、というだけ。やってページを返すのかと言ったら、openpne_redirect()で別のページに渡してしまおう、と。この場合はpcモジュールのpage_c_event_invite_endっていうページを飛ばせと。パラメータにはtarget_c_commu_topic_idを渡しなさい、という指示です。このopenpne_redirectは、webapp/lib/util/util.phpにあります。モジュール名とアクション名とパラメータが指定される。それで、client_redirect_absoluteというのがある。普通はそこでそのままページを返せばいいのだけれど、OpenPNEでは一回PCとか携帯にリダイレクトのheaderを返す。要するに「このページに移ってください」と空のメッセージを返すんです。クライアントリダイレクトをして、Location:ヘッダを出すんです。要するに、Locationはどこどこですよ、ページが変わったからこのページに行ってください、というのをクライアントのブラウザにいったん返す。クライアントのブラウザはそれをもらったら、普通にpage系のページに遷移するというような仕掛けになっています。これをクライアントリダイレクトとよく言います。要するにdo系が終わったらいったんユーザーに返して、ユーザーがもう一回なにかアクションをして、page系に遷移するということです。これは、page系と実行系が切り離せるので、楽なやり方です。サーバの負荷はちょっとかかりますが。普通だったらリクエストが来たらそのまま返せばいいのですが、リクエストして返してもう一回リクエストしてページを返すという仕組みになっています。OpenPNEプロジェクト。