BlogCakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。(木)【BaserCMS】テーマファイルを安全に配置する方法BaserCMS関連のTips続編です。導入が楽でお手軽に使える事を目指しているBaserCMSですが、一つだけ個人的に良くないかなーと思う点があります。「テーマ機能」を用いて簡単にデザインを変えられる機能がありますが、ビューファイル(*.ctp)もドキュメントルート内に置く仕様になっているため、ctpファイル単体が閲覧できてしまう問題があります。Topページのビューは、インストール直後は「/themed/demo/pages/index.ctp」にあります。「http://www.example.com/themed/demo/pages/index.ctp」とすると次のように見えてしまいます。PHPの関数コールが分かってしまうソースコードが丸わかり。ビューにコードをいろいろ書いてしまうと危険!これはあまり気持ちの良い事ではないので、ビューファイルだけは見えないところに移動してみましょう。テーマファイルは「app/webroot/themed/」以外に「app/views/themed/」内においても動作をします。そこで次の対処を行います。「app/views/」内に「themed」ディレクトリを作成するさらに、対処したいテーマ名のディレクトリを「themed」内に作成する。今回は「app/views/themed/demo/」となる「app/webroot/themed/demo」内にある「elements」「feed」「leyouts」「pages」を「app/views/themed/demo/」内に移動するなお、これが可能なのは「webrootをドキュメントルートとしている」場合のみです。ドキュメントルート内にBaserCMS本体を置いて運用されている方は対処する事が出来ません。(2011.01.26追記:「スマートURL」設定であれば、どのようなインストール方法でも上記は有効です)また、上記対処をする事で問題点もあります。管理画面上でテーマファイルの編集が出来なくなりますので、別の方法でファイルを直接扱わなければならなくなります。プログラマーの方でしたら特に問題はないでしょう。ビューファイルの拡張子がphpでしたらPHPコードとして実行されるためエラーコードがはき出されるのみですみますが、そうでない場合は普通にテキストファイルとして入手できてしまうので、場合によっては脆弱を生む事になります。これはBaserCMSに限った事ではなく、CakePHPを丸ごとドキュメントルート内において運用する場合にも起こりうる問題です。ビューにはあまりコードを書かないようにするか、ちゃんとwebrootをドキュメントルートにした上で、上記のようにthemedからビューファイルを外に追い出した方が安全でしょう。いえ、システムの方で一応ディレクトリを分ける対応をした方が問題がなさそうな気がします。丸ごとインストールされているとまあどうしようもないのですが...【追記】(2011.01.26)@nojimageさんから「.htaccessにAddHandlarでctpも加えたら」というアイデアをいただきました(ありがとうございます!)。お使いのサーバで「.httaccessの編集権」「AddHandlar使用権」がある場合は、ctpファイルをPHPコードと見なす事で、webroot内にctpファイルがあっても、コードの中身を閲覧する事を(一応)防ぐ事が出来ます。「app/webroot/.htaccess」に次のように記述します。.ctpたいていの場合、内部のメソッド・関数が見つからないために致命的エラーとなり、閲覧が出来なくなります。ドキュメントルートに丸ごとBaserCMSをインストールしている場合は「/(BaserCMSのインストールディレクトリ)/.htaccess」に記述する事でBaserCMS内の全てのctpファイルを防げます。(木)【BaserCMS】app/webrootをドキュメントルートにする場合の注意点いままでBaserCMSの話題が全くなかったので、ちょっと取り上げてみようと思います。4月頃、東京で「BaserCMSの勉強会」の開催をもくろんでいます。興味がありましたら是非ご参加ください。お手伝いいただける方、会場をちょろっとお借りできる会社様等ありましたら是非ご協力お願いいたします。このへんについてはまた後日。本題なのですが、Bakerの皆さんがCakePHPを扱う場合、おそらくapp/webrootをドキュメントルートとしてサーバ設定をする事が多いと思いますが、同じようにBaserCMSもこのように設定すると、インストーラ実行後、表画面もしくは裏画面のどちらかがうまく表示されなくなってしまうかと思います。BaserCMSは標準ではドキュメントルート内にアーカイブ一式をコピーする事を前提で設定がされているため、いくつかの箇所で不具合を生じてしまいます。app/webrootをドキュメントルートにする場合は次のようにします。'');インストール後うまくいかないようでしたら、たぶんこの辺が影響していると思います。(木)【CakePHP】「CakePHP新春勉強会」に行ってきましたCakePHPの勉強会が久々にありましたので参加しました。Matsuri以来となりますが、当方は顔を出したものの完全参加はできなかったので、実質昨年5月以来です。Library」ではなく、CakePHPで製作されたCMSアプリケーション「BaserCMS」をLTでご紹介させていただきました。スライド(をPDF化したもの)を公開いたします。■クリックするとpdfを参照できますCake界隈では「Croogo」あるいはかなり前から存在している「Wildflower」などがありますが、これらは日本向けのCMSではないため、かなりカスタマイズをしないと難しい点がありました。BaserCMSは日本で開発されているため作りも日本向けであり、サポートもされやすいてんがメリットです。「コーポレートサイト」が簡単に作れるよう機能的にも的を絞っており、他の(Cake以外の)CMSと比べてもコーポレートサイト向けなら導入する価値が大変にあると思います。当方も開発メンバーでありますが、本業が忙しくてなかなか出来ないところがあります。今年はちょっとてこ入れをしていくつかプラグイン等を作っていきたいと思っています。本業でも売っていきたいので(笑)。ネタはいくつか考えていますが、一般向けのものについては是非公開していきたいと思います。BaserCMSは福岡では勉強会も回数をこなしており、普及を促している方もたくさんいらっしゃるため盛り上がっているのですが、残念なことに関東では情報がやってこないためなかなか認知度がありません。この便利なCMSを知っていただきたいと思い、今回勉強会を開催してみようと思っています。Cakeを日頃お使いの方はもちろんですが、特にデザイナーの方にも知っていただきたいと思っております。デザイナーさんをお誘いのうえ参加していただけますと大変に嬉しいです。現時点ではとりあえず「やる」と表明しただけで、何も決まっていない状態です。現実的になってきましたら改めて告知させていただきます。手伝っていただける方、会場をお貸しいただける方(企業)も絶賛大募集です。小さくと思っておりますが、関東でも是非盛り上げていきたいと思いますのでよろしくお願いします。...と告知が長くなってしまいましたが(汗)、勉強会そのものも大変に楽しかったです。内容については他の方がレポートされていますし、ちょっとまとめる時間もなさそうなので今回は割愛させていただきますが、CakePHP2.0は今年の大注目になりそうですね。2次会はカラオケボックス内でLT大会になりました(笑)。それがUstされたり!こんな事をするのはCakeメンバーくらいかもしれません。「第2回CakePHP温泉部」をはじめ、私もいろいろと企画したいと思います。(木)【CakePHP】Shellを拡張してTaskで親シェルのメソッドが使える「ShellEx」クラスCakePHPを利用するにあたり、基本的にはWeb上で動作するアプリケーションを作成すると思いますが、バックエンド等でCakeの機能を用いながら処理を実行したい場合も当然出てきます。そんなときは「シェル」が活躍します。みなさんシェルは活用されていますか?CakePHP1.2/1.3では、シェルの中で「タスク」という小機能を呼び出す仕組みがあります。Shellの中に膨大な機能を全部押し込まなくても済むようになるためコードの可読性が上がり、大変に便利な機能です。膨大な機能を提供しているCake機能の一つ「Bake」も、コアコードを覗けば多数のタスクで構成されています。「app/vendors/shells/」内に、例えば「hoge_shell.php」を作成します。中身はShellクラスを継承した「HogeShell」クラスを作成します。その中には「main()」メソッドを用意すれば動作します。CakePHP辞典」をご覧ください(出来れば買って!(笑))。ここからなのですが、Taskを使う場合、ShellからTaskが呼ばれるのですが、Shell内は素通りしてしまうため例えばタイトルなどをShell内で制作しても表示されません。タイトルを表示するためのメソッドを作って共通化をはかろうとしても、タスクからは呼び出し元のシェルはアクセスが出来ないため、利用することが出来ません。タイトルに限らず、シェル内で利用したいプロパティ・メソッドがあってもアクセスが不可能のため利用不可能です。そこで、タスク内から親シェルのオブジェクトを参照することが可能な機能を付加する「ShellExクラス」を作成してみました。やっていることは非常に簡単で、タスクの初期化時に親クラスのオブジェクト参照を付加するのみです。タスクの初期化・スタートアップ・実行が全てシェルのinitialize()とstartup()の間に挟まれていますので付加するタイミングがありません。このため、ShellExクラスのinitialize()内でタスクの初期化を先行して行っています。タスク初期化は「Shell::loadTasks()」が行っていますが、結果として二度実行されます。Shell::loadTasks()が二度実行されることで若干問題点があります。それは親シェル内にロードされる各タスクオブジェクトが1回上書きされることです。幸いだったのが、このとき上書きされるのはClassRegistry::getObject()で入手できる参照オブジェクトでした。実体ではないため、結果として同じオブジェクトになります。単純に無駄な処理が走るだけです。多少気持ち悪さは残りますが、とりあえず要求していた機能は実現できます。ソースコードはgistに上げました。このファイルを「app/vendors/shells」等にアップロードし、シェル内であらかじめApp::import()でこれを読み込み、extendsを「ShellEx」にすれば動作します。ファイル名は「shell_ex.php」とします。Library1.0のシェル関連機能を実装している最中に必要になりました。オリジナルのタイトルは作りたいので(笑)。さんによりますと、CakePHP2.0ではShell機能は改良されているそうです。まあ今回の記事は思いっきりバッドノウハウですね(^^;。(木)【CakePHP温泉部】第2回開催のご案内と受付開始!お待たせいたしました。第2回のCakePHP温泉部の開催について、ようやくご案内できる運びとなりましたのでお知らせいたします。基本的に、おいしいものを食べつつ温泉にゆったりとつかり、Cake話で盛り上がるといったかなりゆるい内容です(笑)。気軽に参加が可能なイベントですので、是非ご検討の上お申し込みいただけますと幸いです。皆さん日頃激務かと思いますので、のんびりと時間を過ごしましょう!場所についてはいろいろ検討していたのですが、今回も箱根にするとずっと箱根になってしまいそうでしたので、都度温泉地を変えるという趣旨で今後場所選定する事にしました。今回は箱根のお隣になる熱海にしました。※電車の場合の集合場所、もしくは車での参加は後日希望を伺います。今回も基本的に、CakePHPについての自分の考えや、日頃の業務での出来事などをざっくばらんに話しつつ、「温泉に入って日頃の疲れを癒す(ここが重要!!)」ことが主な活動になります。当日は「CakePHP温泉部的ベストプラクティス(仮)」と称して、日頃疑問に思っているCakePHPにまつわるコーディングテクニック・サイト構築・運営などを1人1つだけ持ち寄っていただいて、それについて話し合っていきたいと思います。何か発表したい人も大歓迎です。具体的な活動内容については、後日追記させていただきます。CakePHPを好きな方ならどなたでも参加できます。CakePHP!)女性の参加もOKです。今回は大部屋に宿泊する予定ですが、個室等出来る限り配慮いたします。20,000円程度(当日現金にて徴収します)。別途、交通費がかかります。定員になり次第受付を終了させていただきます。キャンセル待ちは可能ですが、あまり期待はしないでください。明記の上、ご連絡ください。groups」の招待メールを送信します。受信しましたら一度アクセスいただき、自己紹介欄に参加表明をお願いします。詳細情報やご連絡についてもこちらで全て行います。運営者より直接ご連絡させていただく場合もありますのでご了承ください。申し込み締め切りは「2011年1月10日」までです。・キャンセルは1週前までにお願いいたします。過ぎますとキャンセル料がかかってしまいますのでご注意ください(10日前に最終確認のメールをさせていただきます。1週前までに返事がない場合はキャンセル扱いになります)。・お部屋は大部屋になります。・部屋には有線のLAN回線あります。ハブ等はこちらで用意いたします。@cakespaこちらでも随時情報をつぶやきます会場となる室内。