PHPからブラウザのコンソールにログ出力するちょっとしたユーティリティです。なんとなく Gist にアップしたので、こちらでも紹介しておきます。
- [Gist] yuka2py / cconsole.php https://gist.github.com/yuka2py/5553590
PHPからブラウザのコンソールにログ出力するちょっとしたユーティリティです。なんとなく Gist にアップしたので、こちらでも紹介しておきます。
昨年ぐらいから CakePHP 2 を本格的に触ることになりまして、これまでの Paper ドライバーを卒業と喜んでいたんですが、いきなりつまづいた…というか不満に思ったのが Model の構造でした。CakePHP も 2 となり、もうてっきり Rails の ActiveRecord のようなものになっているかと思いきや、find メソッドが返すものは相変わらず array だったんですね。これはもう思想なのかも?…とはいえ、Paper ドライバーレベルではなかなか思想まで理解できません。同じような不満が出ていないかと検索してみたところ、次の記事が見つかりました。
同じことを思う方はいるもので♪ 早速、上のプラグインを利用させていただいたのですが、どうも CakePHP 2 系では上手く動かないようでしたので、修正を試みたものの、挫折。せっかくだからということで、自分で作ることにしました。これでも自称フレームワークマニアですしねw
その成果物がここで紹介する FkRecordModel です。GitHub に公開中です。
次のような簡単な構成になっています。
次のような機能があります(特に高機能ではありません)。
上述の CakeEntity プラグインとの相違点は多々とあると思いますが、とりあえず大きなところで、本プラグインは「CakePHP の通常通り配列を返す」という選択肢を設けていません。find 系メソッドは常に FkRecord または FkRecordCollection を返します。(自分はたぶん使わないからです。ごめんなさい)。また、FkRecordCollection は不要だったり邪魔だと思われる方も我慢してください(イテレータにしておくと色々と便利という信条です)。ちなみに、FkRecordCollection::sort() メソッドには不満があります(削除または改良したいです。どなたか良い案ください)。
以下、簡単な利用例です。
まずは以下のように AppModel の super クラスとして本プラグインのクラスを利用します。AppModel の他に、AppRecord も作成してください。FkRecordCollection は全てのモデルで共通に利用されます。
1 2 3 4 5 6 7 8 9 10 11 |
<?php App::uses('FkRecordModel', 'FkRecordModel.Model'); class AppModel extends FkRecordModel { // definition... } class AppRecord extends FkRecord { // definition... } |
モデルクラスでは、それぞれのモデル毎に、Model と Record を定義します。Model の定義は通常通りですが、verboseName などの指定ができます。Record にはエンティティオブジェクトで提供したい機能を実装してください。自らのフィールドへのアクセスは、$this->fieldName または $this[$alias][$fieldName] です。
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 |
<?php App::uses('AppModel', 'Model'); class Post extends AppModel { /** * Define verbose name. It is used in the label name, such as, for example. */ var $verboseName = array( 'title' => 'Title', 'description' => 'Description', ); var $hasMany = array( 'tags' => array( 'className' => 'PostTag', 'dependent' => true, ), ); // Other definition... } class PostRecord extends AppRecord { function updateDateBy($format) { return date($format, strtotime($this->modified)); } } |
Controller での利用は次のような雰囲気になります。$post->save() のようにして保存します。FkRecord::save() メソッドは、バリデーションエラーがある時には、false を返します。バリデーションエラーの内容はエンティティオブジェクトが保持し、これは View の中で利用できます。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php class PostsController extends AppController { $uses = array('Post'); function index() { $posts = $this->Post->find('all'); $this->set(compact('posts')); } function show($id) { $post = $this->Post->findById($id); $this->set(compact('post')); } function create() { $post = $this->Post->build(); $this->set(compact('post')); if ($this->request->is('post')) { $post->setData($this->data); if ($post->save()) { // processing on success. } else { // processing on failed. } } } function edit($id) { $post = $this->Post->findById($id); $this->set(compact('post')); if ($this->request->is('put')) { $post->setData($this->data); if ($post->save()) { // processing on success. } else { // processing on failed. } } } } |
FkRecordModel に定義された関連は、$post->tags のようにして FkRecordCollection/FkRecord として取得できます。なお、FkRecordCollection は empty($posts) のように空判定できません。FkRecordCollection::isEmpty() メソッドを利用してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php foreach ($posts as $post) : ?> <article id="post-<?php echo $post->getID() ?>"> <h1><?php echo $post->title ?></h1> <p><?php echo $post->description ?></p> <p>Updated at: <?php echo $post->updateDateBy('Y/m/s H:i') ?></p> <?php if (! $post->tags->isEmpty()) : ?> <ul> <?php foreach ($post->tags as $tag) : /* loop for relations */?> <li><?php echo $tag->name ?></li> <?php endforeach; # $post->tags ?> </ul> <?php endif; # !$post->tags->isEmpty() ?> </article> <?php endforeach; # $posts ?> |
フォームを扱うには、FkRecord::bindFormHelper() メソッドで FormHelper をエンティティにバインドし、以後、$post->Form->text($fieldName) といった感じでフォームエレメントを出力できます。FkRecord::getVerboseName($fieldName) でフィールドの別名を取得できます。FkRecord::getError($fieldName) で、そのフィールドにエラーがあれば、その内容を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $post->bindFormHelper($this->Form) /* Bind to FormHelper */ ?> <?php echo $post->Form->create('Post') /* Start form */ ?> ?> <label> <?php echo $post->getVerboseName('title') ?>: <?php echo $post->Form->text('title') ?> <?php echo $post->getError('title') ?> </label> <label> <?php echo $post->getVerboseName('description') ?>: <?php echo $post->Form->textarea('decription') ?> <?php echo $post->getError('description') ?> </label> <p> <?php echo $post->submit('Send') ?> </p> <?php echo $post->Form->end() ?> |
以上、簡単にですがご紹介まで。
もし奇特な方がいらっしゃいましたら、一度ご利用いただき、是非フィードバックなどを頂けたら嬉しいです! 是非! 是非!
CakePHP2.x の Shell で Component を使う、というよくありそうな要件です。
検索してみて色々出てくるのですが、微妙に上手く行かなかったり、上手くいくものの「こっちの方が正しいのでは?」と思えたりしたので、下記にメモしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php App::uses('Shell', 'Console'); App::uses('ComponentCollection', 'Controller'); App::uses('TransactionComponent', 'Controller/Component'); App::uses('SqlDumpComponent', 'Controller/Component'); /** * Application Shell * @package app.Console.Command */ class AppShell extends Shell { public function startup() { $this->components = new ComponentCollection(); $this->Transaction = $this->components->load('Transaction'); $this->SqlDump = $this->components->load('SqlDump'); } } |
特に難しいことをしているわけでなく、ComponentCollection を new し、そこから load するのが良さそうなのかな、ということですが、ComponentCollection を自分で new するのに少々疑問もあるのです。 (; ^ω^)
もしより良い方法があればどなたかご教示ください。
「appfog」は、とても手軽で簡単な PaaS 環境で、私は最近実験的なプロジェクトや、WordPress の開発環境として利用させて頂いています。今回は、appfog に、プレーンな PHP + MySQL 環境を構築してみましたので、手順を簡単にご紹介いたします。「appfog 簡単そう!」って思ってもらえると幸いです。
まず、ダッシュボードから、Create App に入り、PHP 環境を選択します。
次に、インフラを選択します。個人的には AWS US East か HP がお気に入りです(理由は URL が短いからですw)。サブドメインも入力して、[Create App] します。
これだけ httpd 環境が出来るのですから、素晴らしいですね!
処理完了後、上の図の例では、http://c5.aws.af.cm にアクセスすると、既にHello World が表示されます。
次に MySQL をセットアップします。
アプリの管理画面の Services のセクションを開きます。
画面下の方、Provision Service のセクションから、MySQL を選び、DB 名を入力してから、[Create] します。
これだけで、アプリケーションから利用できる MySQL のセットアップが完了です。
さて、PHP から MySQL へ接続情報はどのように入手できるでしょうか?
appfog の場合、DB 接続の為のホストや、ユーザー名、パスワードといった情報は、VCAP_SERVICES という環境変数より JSON で取得できます。appfog のドキュメントだと、次ページに関連の記述があります。
http://docs.appfog.com/services/overview
この環境変数を取得し、JSON をパースして DB アクセス情報を取得する PHP スクリプトは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $services_json = getenv('VCAP_SERVICES'); $services = json_decode($services_json, true); $config = null; foreach ($services as $name => $service) { if (0 === stripos($name, 'mysql')) { $config = $service[0]['credentials']; break; } } is_null($config) && die('MySQL service information not found.'); $db_hostname = $config["hostname"]; $db_hostport = $config["port"]; $db_username = $config["user"]; $db_password = $config["password"]; |
以上、ということで、簡単ですねー! DB接続情報の取得は少々面倒に思われるかも知れませんが、全体を通してとてもシンプルで扱い易い PaaS 環境です。無料の基本利用枠があり、トラフィックさえ少ない感じなら5サイトぐらいは運用できそうです。環境を作ったり削除したりも Web の管理画面から簡単に出来たり、これまで使った PaaS の中では一番気に入っています。
ちなみに、好きなものを好きと言ってるだけです。ステマじゃありませんのであしからず♪
最近まで「WordPressって何?」って感じだった僕ですが、今更ながらに WordPress を使ってみています。今日は、WordBench 神戸の勉強会にて教わったプラグインの作り方をまとめてみました。
お題は「顔文字チェンジャー」!
記事本文の内容の中の「。」のテキストを任意の顔文字に置換しちゃう楽しいプラグインです。なお、本記事は PHP は分かる人向けに書いていますー。
WordPress プラグインは、/wp-content/plugins/ ディレクトリ内に作成します。
ここでは、/wp-content/plugins/moji-changer/ を作成します。またそのディレクトリ内に、プラグインディレクトリと同名のファイル、moji-changer.php を作成します。
結果、以下のようなディレクトリとファイルが出来ます。
1 2 |
/wp-content/plugins/moji-changer/ /wp-content/plugins/moji-changer/moji-changer.php |
moji_changer.php を開いて、スクリプト冒頭に、下記のようなメタ情報を書きます。
1 2 3 4 5 6 7 8 9 |
<?php /* Plugin Name: 顔文字チェンジャー Plugin URI: http://www.lurala.com/ Description: 投稿本文中の「。」を顔文字に変換するなんだか楽しいプラグイン♪ Author: yuka2py Version: 1.0.0 Author URI: http://www.lurala.com/ */ |
まずこれだけで WordPress はこのプラグインを認識してくれるですね。
管理画面でプラグインの一覧に表示されているので確認できます。
この状態で、プラグインを有効化しておいてください。
でもこれだけだともちろん何も起こらないです。
行いたい処理を追加していきます。
上のメタ情報の下に続けて、以下のコードを書いてみます。
1 2 3 4 5 |
add_filter('the_content', 'moji_changer_content_filter'); function moji_changer_content_filter($content) { return str_replace('。', ' (*´艸‵*)ウフッ♪', $content); } |
フィルターフックを登録する WordPress の関数です。
第1引数にフックの種類を登録します。ここでは、the_content を指定しています。
‘the_content’ は、記事本文が画面表示される前に呼び出されるフックの指定です。
第2引数は、そのフックで実行される関数を指定します。
ここでは、moji_changer_content_filter を登録しています。
そして、ここに登録した名前の関数を自分で作成します。
この関数は、$content で記事本文のテキストを受け取って、「。」を「 (*´艸‵*)ウフッ♪」の顔文字に変換して返しています。
これで OK です。
ブログの記事画面を開いてみると、記事中の「。」が「 (*´艸‵*)ウフッ♪」になって、なんだか素敵なブログになっていると思います。
add_filter について、詳しくはコチラ:
http://wpdocs.sourceforge.jp/関数リファレンス/add_filter
変換される顔文字を、管理画面で設定出来るようにしてみましょう。
上記のコードに続けて、次のコードを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
add_action('admin_menu', 'moji_changer_admin_menu'); function moji_changer_admin_menu() { add_menu_page( '顔文字チェンジャー', '顔文字チェンジャー設定', 'administrator', 'moji_changer_admin_menu', 'moji_changer_edit_setting' ); } function moji_changer_edit_setting() { echo "設定画面をここに書くよ!"; } |
これだけで、管理画面をリロードすると、サイドバーにメニューが追加されます。また、メニューをクリックすると、「設定画面をここに書くよ!」と表示されます。
ここで、add_action、add_menu_page は、WordPress の関数です。moji_changer_admin_menu は、管理画面を登録する関数で、moji_changer_edit_setting は、設定ページの本体を出力する関数です。
以下、順に見ていきます。
アクションフックを登録する WordPress の関数です。
第1引数にフックの種類を登録します。ここでは、admin_menu を指定しています。‘admin_menu’ は、管理画面メニューの基本部分が配置された後に実行されるフックの指定です。
第2引数は、そのフックで実行される関数を指定します。
ここでは、moji_changer_admin_menu を登録しています。
add_action について、詳しくはコチラ:
http://wpdocs.sourceforge.jp/関数リファレンス/add_action
上述の add_action での登録で呼ばれる関数です。
ここでは、add_menu_page を呼び出し、管理画面メニューを追加しています。
管理画面にカスタムページを追加する WordPress の関数です。
第1引数は、追加するカスタムページの名前です。
第2引数は、カスタムページへアクセスするためのメニューの項目名。このメニューは、管理画面サイドバーのトップレベルに表示されます。
第3引数は、カスタムページを利用できる権限の制限。ここでは、administrator で管理者とします。
第4引数は、(たぶん)カスタムページを特定する名前。つまり、url パラメータになります。
第5引数が、(やっと)管理画面の本体となる関数です。管理画面の内容などを出力します。
…なんか長くなりましたが、要するに↓みたいな感じですね♪
1 |
add_menu_page('ページ名', 'メニュー表示名', '権限の制限', 'urlに入る名前', '管理画面本体を出力する関数'); |
add_menu_page について、詳しくはコチラ:
http://codex.wordpress.org/Function_Reference/add_menu_page
最後に、管理画面本体となる関数です。
管理画面の画面表示を行ったり、データの保存や読み出しなど必要な処理を行います。ここではとりあえず、echo で「設定画面をここに書くよ!」と出力しているだけですが、これによって、管理画面に「設定画面をここに書くよ!」と表示されました。
わぉっ。簡単だ!
管理メニューの追加について、詳しくはコチラ:
http://wpdocs.sourceforge.jp/管理メニューの追加
さて、管理画面で実際に設定できるようにしてみますが、これもすごく簡単です。上で書いた moji_changer_content_filter と moji_changer_edit_setting の2つの関数を、以下のように書き換えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function moji_changer_content_filter($content) { $kaomoji = get_option('kaomoji_changer_plugin_value'); return str_replace('。', $kaomoji, $content); } //… 中略 … function moji_changer_edit_setting() { if (isset($_POST['kaomoji'])) { update_option('kaomoji_changer_plugin_value', $_POST['kaomoji']); } $kaomoji = get_option('kaomoji_changer_plugin_value'); echo <<<EOD <div> <h2>顔文字チェンジャー</h2> <form action="" method="post"> <p><input type="text" name="kaomoji" value="{$kaomoji}" /></p> <p><input type="submit" value="登録" /></p> </form> </div> EOD; } |
フォームの action を空にしているので、設定画面の表示時にも、顔文字の登録時にも、いずれも同じ moji_changer_edit_setting 関数がコールされることに注意すると、PHPer なら動作は容易に想像できると思います。
ここで、get_option、update_option という2つの新しい WordPress の関数が登場しています。これは、WordPress の単純なデータストア API です。
1 2 3 4 |
$key = '一意なキー名'; $value = '保存したいデータ'; update_option($key, $value); //保存 $value = get_option($key); //取り出し |
という書式で、データを保存したり、取り出したりできます。
こういう単純な API があると便利ですね!
注意点として、キー名は WordPress 全体で共通なので、他のプラグインや機能と重複しないように注意して設定する必要があります。
これで、管理画面に顔文字を登録するフォームが完成し、[登録] ボタンから顔文字の変更が出来るようになりました。驚くほど簡単です!
以下、ここまでのコードをまとめて掲載します。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php /* Plugin Name: 顔文字チェンジャー Plugin URI: http://www.lurala.com/ Description: 投稿本文中の「。」を顔文字に変換するなんだか楽しいプラグイン♪ Author: yuka2py Version: 1.0.0 Author URI: http://www.lurala.com/ */ add_filter('the_content', 'moji_changer_content_filter'); function moji_changer_content_filter($content) { $kaomoji = get_option('kaomoji_changer_plugin_value'); return str_replace('。', $kaomoji, $content); } add_action('admin_menu', 'moji_changer_admin_menu'); function moji_changer_admin_menu() { add_menu_page( '顔文字チェンジャー', '顔文字チェンジャー設定', 'administrator', 'moji_changer_admin_menu', 'moji_changer_edit_setting' ); } function moji_changer_edit_setting() { if (isset($_POST['kaomoji'])) { update_option('kaomoji_changer_plugin_value', $_POST['kaomoji']); } $kaomoji = get_option('kaomoji_changer_plugin_value'); echo <<<EOD <div class="wrap"> <h2>顔文字チェンジャー</h2> <form action="" method="post"> <p><input type="text" name="kaomoji" value="{$kaomoji}" /></p> <p><input type="submit" class="button-primary" value="登録" /></p> </form> </div> EOD; } |
わくわく楽しいプラグインが出来ました♪
何か鬱憤がたまったら、プラグインを有効化して変な顔文字いっぱいのブログにしてスッキリしてやります。
そこで、もうすこし自由度を増すために、もう少しだけプラグインを改造してみました。名前も、「顔文字チェンジャー」改め、「文字チェンジャー」です。
php のファイルは以下の2ファイルになりました。
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 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php /* Plugin Name: 文字チェンジャー Plugin URI: http://www.lurala.com/ Description: 投稿本文中の任意のテキストを任意のテキストに置換する。 Author: yuka2py Version: 1.0.2 Author URI: http://www.lurala.com/ */ define('MOJI_CHANGER','MOJI_CHANGER'); add_filter('the_content', 'moji_changer_content_filter'); add_action('admin_menu', 'moji_changer_admin_menu'); function moji_changer_content_filter($content) { $moji_changer_vars = get_option(MOJI_CHANGER); if (!empty($moji_changer_vars['from'])) { $content = str_replace( $moji_changer_vars['from'], $moji_changer_vars['to'], $content); } return $content; } function moji_changer_admin_menu() { add_menu_page( '文字チェンジャー', '文字チェンジャー設定', 'administrator', 'moji_changer_admin_menu', 'moji_changer_edit_setting' ); } function moji_changer_edit_setting() { if (isset($_POST['moji_changer_vars'])) { update_option(MOJI_CHANGER, $_POST['moji_changer_vars']); } $moji_changer_vars = get_option(MOJI_CHANGER); include 'setting.html.php'; } |
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 |
<div class="wrap"> <?php screen_icon('edit'); ?> <h2>文字チェンジャー</h2> <p>記事本文中の任意の文字を、別の文字に変換するプラグインです。<br /> 「置き換えする文字」を空欄にすると、置換処理は行われません。</p> <form action="" method="post"> <table class="form-table"> <tr> <th><label for="moji_changer_vars[from]">置き換えする文字</label></th> <td><input id="moji_changer_vars[from]" type="text" name="moji_changer_vars[from]" value="<?php echo isset($moji_changer_vars['from']) ? $moji_changer_vars['from'] : '' ?>" /></td> </tr> <tr> <th><label for="moji_changer_vars[to]">置き換える文字</label></th> <td><input id="moji_changer_vars[to]" type="text" name="moji_changer_vars[to]" value="<?php echo isset($moji_changer_vars['to']) ? $moji_changer_vars['to'] : '' ?>" /></td> </tr> </table> <p><input type="submit" class="button-primary" value="登録" /></p> </form> </div> |
以上です。
大きな変化はありませんが、WordPress 的なポイントとしては、get_option、update_option 関数が、単純なプリミティブな値以外にも、配列などを保存できるということです。これは素敵。便利ですねー!