CodeIgniterの学習 15 - Zend Framework を CodeIgniter上で使う
ええと、昨日のエントリの続き、
Zend Frameworkにある沢山の有用なライブラリを、CodeIgniterで使えるようにしてしまいましょうというお話。
「じゃあ全部 Zend Frameworkで作ればいいじゃん」 と言う話は置いておく。
CodeIgniterで足りないライブラリは一から作らずにZend Frameworkを使っちゃおうと。ハイブリッド最強。
元ネタは、FreakAuth(ログイン認証)のところから。
http://www.4webby.com/freakauth/tutorials/using-zend-framework-components-in-code-igniter.html
基本ほぼここに書いて有るとおりなんだが、一応作業履歴を残す。
手順
1)Zend Frameworkのソースをダウンロードして解凍する。
http://framework.zend.com/download/latest から ZendFramework-1.6.1.tar.gzをダウンロードした。
2)ディレクトリ application/my_classes/ を作成する。
この下にライブラリを入れる。pearとかもここに入れればいいか。
3)application/my_classes/以下にZendFramework-1.6.1/library/Zendディレクトリを丸まるコピーする。
(application/my_classes/Zend/ ね、元ネタの説明とちょっと構成が違うみたい。)
4)application/config/config.php で、$config['enable_hooks'] = TRUE; に設定する。
フックを有効に。
5)application/config/hooks.php に以下の記述を追加する。
これでコントローラが呼ばれる直前にフックがかかり、
application/hooks/MyClasses.phpの MyClasses->index() が呼ばれる。
<?php //上略 //for my_classes $hook['pre_controller'][] = array( 'class' => 'MyClasses', 'function' => 'index', 'filename' => 'MyClasses.php', 'filepath' => 'hooks' ); //下略 ?>
6)application/hooks/MyClasses.php を以下の内容で作成する。
インクルードパスを追加しているだけ。
元ネタでは APPPATH . 'my_classes/' の所が、 BASEPATH.'application/my_classes' だったけど、
ウチのディレクトリ構成が、 http://d.hatena.ne.jp/dix3/20080919/1221815250 の様にしているから。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class MyClasses { /** * includes the directory application\my_classes\ in your includes directory */ function index() { // includes the directory application\my_classes\ // for windows tests change the ':' before APPPATH to ';' //ini_set( 'include_path', ini_get( 'include_path' ) . ':' . APPPATH . 'my_classes/' ); ini_set( 'include_path', APPPATH . 'my_classes/' );//余計なインクルードパスを読み込まないようにした。 } } /* End of file MyClasses.php */ /* Location: ./application/hooks/MyClasses.php */ ?>
動作確認用サンプルソースを作る
これまた元ネタ http://www.4webby.com/freakauth/tutorials/using-zend-framework-components-in-code-igniter.html とほぼ一緒。
FlickrのAPIを叩くライブラリの使用例。独自性なくてすんません。
ここから先はほぼ Zend_Service_Flickr の世界。
Flickrのapi_keyは別途必要、my.yahoo.comのアカウント(Flickrのアカウント)が有ればすぐとれる。
http://www.flickr.com/services/api/keys/apply/
1)コントローラ側: application/controllers/flickr.php
なんかキーワードを入れて検索するとそのタグでFlickrから画像を取得するだけ。
http://framework.zend.com/manual/ja/zend.service.flickr.html からたどればいろいろ書いてる。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); // フリッカーの実験 class Flickr extends Controller { // コンストラクタ function Flickr() { parent :: Controller(); // ログイン認証、ログインしてなければログイン画面に飛ばされる //$this -> freakauth_light -> check(); } function index() { require_once( 'Zend/Service/Flickr.php' ); $flickr = new Zend_Service_Flickr( '*** api_keyを貼り付ける ***' ); $body = ""; $info =""; $word = isset($_POST['word']) ? $this->input->xss_clean($this->input->post('word')) : "" ; try { if($word){ $results = $flickr -> tagSearch( $word ,array("per_page"=>30,) ); if ( $results -> totalResults() > 0 ) { foreach ( $results as $result ) { if("0" == $result -> license ){//todo:こういうときに使って良いライセンスって何番? $uri = $result -> Square -> uri ; $clickUri = $result -> Square -> clickUri ; $body .= '<a href="' . $clickUri . '" target="_blank" style="border:0;text-decoration:none;"><img src="' . $uri . '" style="border:0;" /></a>'; } } } else { $info = $word. 'は見つからなかったよ'; } }else{ $info = 'なんか入れてくだされ'; } } catch ( Zend_Service_Exception $e ) { $info = 'なんかエラーが発生したからもう一度ためしてみてね'; //$info .= $e -> getMessage(); } //取得結果を格納 $data["body"] = $body; $data["info"] = $info; $data["word"] = $word; // 大枠のテンプレート側の変数(ヘッダ部分のタイトルと、xajax用javascriptタグ) $tpl["page_title"] = "Zendフレームワークとの融合テスト"; // 中身のテンプレートにデータをセット $tpl["main_content"] = $this -> load -> view( 'flickr_view', $data , true ); // 大枠のテンプレートに、タスクリストのビューをはめ込む $this -> load -> view( 'base_view', $tpl ); } } //Endofclass /** * End of file flickr.php */ /** * Location: ./application/controllers/flickr.php */ ?>
2)ビュー側(中身):application/views/flickr_view.php
<h2>↓Zend Frameworkとの融合テスト↓</h2> <h3>(Zend/Service/Flickr.phpを使ってみるテスト)</h3> <form method="post"> <label>タグ検索</label> <input type="text" name="word" style="width:200px;" value="<?=form_prep($word);?>"> <input type="submit" name="submit" value="検索するっす"> <?php if($info){ ?><p class="info yellow"><?=$info?></p> <?php } ?> <div> <?=$body?> </div> </form>
3)ビュー側(外枠):application/views/base_view.php
以前のエントリと同じなので省略
結果
花は美しい。
apiの反応が遅いから、非同期で取得してかつキャッシュさせないと重すぎるな。
Zend Framework on CodeIgniter つう組み合わせで夢が広がりまくりんぐ。
dix3はhookのつかいかたをてにいれた。
dix3はZend Frameworkをてにいれた。
はやくコーディングしろよ、俺。
(08/11/17一部変更、ini_set時に余計なインクルードパスを読み込まないようにした。)