WEB/システム/IT技術ブログ

CakePHP1.3でヘルパーを使ってみます。
ヘルパーはビュー上でめんどくさいhtmlコーディングやjsのコードを自動的に出力してくれます。

いくつか既存で組込みヘルパーが用意されていますが、例えば、HtmlHelperのimageをビューで呼び出してみます。

echo $html->image('/images/sample.jpg');

これにブラウザアクセスすると、該当箇所に以下のコードが自動で埋め込まれます。

<img src="/images/sample.jpg" alt="" />

ちなみに、HtmlHelperはビュー上でデフォルトで使用可能ですが、他のヘルパーはコントローラで明示的に使用することを宣言しなければいけません。FormHelperを使うためには以下のようにします。

class TestController extends AppController {

	public $name = "Test";
	public $helpers = array('Form');

	function index(){
		/* 省略 */
	}
}

CakePHP1.3でdefineなど定数の定義、また、PEARのインクルードなどをどこで宣言するのが最適なのか調べていました。

結果からいうと「/app/config/bootstrap.php」に記述するのがよいようです。bootstrap.phpはCakePHPにアクセスがあった場合に、一番最初に呼ばれる処理です。デフォルトではコメントのみで、処理は空になっているはずです。
例えば以下のようにして通常のとおり宣言すればよいですね。

require_once 'PEAR/XXX.php';
define('API_KEY', 'XXXXXXXXXXXXXXXX');

部分的に利用する定数の場合、適宜、コントローラで宣言するべきかもしれませんが、開発規模が大きくなると管理がめんどくさくなりそうなので、bootstrap.phpで一括してまとめたほうが楽でしょう。

あと、話は外れますが「CakePHPを使うならPEARなんていいらない」なんて言う方がいらっしゃいますが、果たしてそうでしょうか。。。

CakePHP1.3でエレメントを利用してみます。
以前に、ビューの外枠にレイアウトがあることを記事にしましたが、それに対してエレメントはビューの中で再利用される部品のようなものです。
フォーム、メニュー、広告など、異なるビューの中で繰り返し利用したい場合にエレメントを利用します。

例えば以下のような内容のエレメント「/app/views/elements/sidemenu.ctp」を用意します。

CakePHPではレイアウトという便利な機能があります。大枠のテンプレートのようなもので、ビューはこのレイヤーにのっかっているイメージです。
つまりは、サイト全体で変更のない大枠をここでレイアウトできるということです。

デフォルトのレイアウトは「/app/views/layouts/default.ctp」にコーディングします。もちろん、layoutsフォルダに任意の名前でctpファイルを置くことで、コントローラから動的に切り替えることが可能です。
以下、default.ctpのサンプルです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="" />
<link rel="stylesheet" href="/css/common.css" type="text/css" media="all" />
<script type="text/javascript" src="/js/common.js"></script>
<?php echo $scripts_for_layout ?>
<title><?php echo $title_for_layout ?></title>
</head>

<body>

<?php echo $content_for_layout ?>

</body>
</html>

CakePHPではコンポーネントという概念があります。
簡単に説明すると複数のコントローラで同じ処理を共有したい場合に、コンポーネントとして切り出して再利用するわけです。クラス、パッケージ化みたいなものでしょうか。

例えばコンポーネント「test」を作成したい場合、まずは新規ファイル「/app/controllers/components/test.php」を作成します。そのファイルの中身を以下のように実装したとします。

class TestComponent extends Object{

	var $controller = null;
	var $settings = array();

	function initialize(&$controller, $settings){
		$this->controller = $controller;
		$this->settings = $settings;
	}
	function show(){
		echo $this->settings['test1'] . "<br />";
		echo $this->settings['test2'];
	}
}

initializeはクラスでいうコンストラクトのようなもので、コンポーネントが呼ばれた際に、初めに実行される処理です。

CakePHPでコントローラとビューについては把握しました。しかし、いざトップページのコントローラを設定するとなるとうまくいきません。

Zend Frameworkの例と、CakePHPのルールから推測するには「/app/controllers/index_controller.php」を設置すればよいはずですよね。しかし、うまくいきません。

少し調べたところ、トップページだけは例外のようです。
その設定が記述されているのは「/app/config/routes.php」のです。

/**
 * Here, we are connecting '/' (base path) to controller called 'Pages',
 * its action called 'display', and we pass a param to select the view file
 * to use (in this case, /app/views/pages/home.ctp)...
 */
	Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
/**
 * ...and connect the rest of 'Pages' controller's urls.
 */
	Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

PHPのフレームワークCakePHPの基盤を使って「Hello World!」を表示させてみます。

CakePHPもZend Frameworkと同様にMVCを採用しており、mod_rewriteを利用してindex.phpをフロントコントローラとしています。詳細は同blogのZend Framework関連の記事を参照してください。
Zend Framework | cms helog – CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

まず「/test/hello」にアクセスするため、「test」コントローラにアクションメソッド「hello」を用意します。
ファイル「/app/controllers/test_controller.php」を作成して、以下の内容を記述します。ファイル名はコントローラ名の後に「_controller.php」を足すのがルールです。

class TestController extends AppController {

	public $name = "Test";
	public $uses = null;
	public $autoRender = true;

	function index(){
	}

	function hello(){
		$this->set("content", "Hello World!");
	}
}

今回はCakePHPをインストールします。

PHPのフレームワークが本格的に取り上げられるようになってきて間もないですが、近年では、安定したフレームワークが出てきているようで、PHP開発者として一つは習得しなければいけないと考えました。前回までにZend Frameworkの記事をいくつか書きましたが、Zend Frameworkについて調べていると、やたら「CakePHP」というキーワードが目に映ります。

Zend Frameworkの概要はつかめてきたのですが、本格的な開発に入る前に、CakePHPも学んでみて、どちらが私にとって有用かを比較してみたいと思いました。

CakePHPはRuby on Railsの概念に沿って作り上げられた経緯があり、その導入コストはかなり低いものになっているようです。また、PHP4でもPHP5でも動作し環境依存が小さいので、どのレンタルサーバにも比較的インストールし易いといった特徴があります。その容易さとは反面、機能は多彩で、初心者から上級者まで安定して使用できるフレームワークのようです。

前回、Zend FrameworkにテンプレートエンジンSmartyを組み込む方法を紹介しました。
Zend FrameworkとSmartyを連携させる(1)
今回はその環境での動作確認です。

まずはフレームワーク上でSmartyが動作しているかの確認です。
「/application/controllers/TestController.php」に以下を実装します。

require_once 'Zend/Controller/Action.php';

class TestController extends Zend_Controller_Action{

	public function indexAction(){
	}

	public function helloAction(){
		$this->view->word = 'Hello World!';
	}

}

次にテンプレート「/application/smarty/templates/test/hello.html」を用意します。

{$word}

これで、テスト環境「http://(てすと環境)/test/hello」にブラウザでアクセスすると

Hello World!

と表示されます。
つまりはSmartyのテンプレートが機能している間は、Zend Frameworkのビューワー「/application/views/scripts」は不要になるんですね。

今回はZend Frameworkのフレームワーク機能の中に、Smartyのテンプレートエンジンを組み込みます。

Zend FrameworkではMVCモデルを採用していますが、Viewの部分はあくまで見栄えを切り離しただけで、Smartyのようなテンプレート機能は備えていません。そこで、Zend Frameworkの公式マニュアルでも紹介されえているSmartyラッパーを実装してみます。
Zend Framework: Documentation: ビュースクリプト – Zend Framework Manual

まずはそれぞれのバージョンは以下のとおりです。

Apache 2.2.12
PHP 5.3.0
Zend Framework 1.11.1
Smarty 2.6.26

Monthly Archives