CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

こんにちは、helog.jpの管理者です。

Web技術者として日々お仕事する中、「実際に触って学ぶ」事が多く、いくつもサイトを立ち上げては潰すことを繰り返してもうすぐ10年になります。

新しい技術、興味のある技術、仕事に必要な技術があると、とりあえず自身のサイトに導入してみる。その過程をそのままそのブログにメモとして書き留める。たまに失敗してサイトを壊す。。。といった感じです。かわいそう。

さて、近年、「小規模で簡単にCMSサイトを作れる」技術が充実してきたような気がします。
WordPressもブログツールとしてだいぶ安定してきて、CMSサイトを構築する機能やプラグインも増えてきました。
まだ精度は高くなくとも、CakePHPやFuelPHPなどPHPベースのフレームワークの今後も期待できます。

そうです。何を隠そう、このサイトも、新しい実験台がほしかったのでオープンした次第です。

「CMS helog」が今後どのような変貌を遂げるのか見守っていただければ、
また、メモ代わりの技術記事が少しでも世のためになればという思いをのせて、スタートいたします!!

CakePHP1.3でWebアプリケーションを構築する上で、Authコンポーネントを使った管理画面を作ってみます。

前提として、adminコントローラ配下に認証をかけることにします。つまりCakePHPで構築したサイト内で「http://xxx.xxx.xxx/admin」にアクセスするためには管理者権限を必要とするようにします。

ユーザ管理テーブルを用意する

ユーザIDとパスワードを管理するテーブル「users」を用意します。

CREATE TABLE users ( 
	id INTEGER(8) auto_increment PRIMARY KEY,
	username VARCHAR(50) NOT NULL, 
	password VARCHAR(50) NOT NULL, 
	date_create VARCHAR(19) NOT NULL, 
	date_update TIMESTAMP NOT NULL
);

最低限「ユーザID」と「パスワード」の2カラムを用意します。その他のカラムは任意です。また、カラム名は変更可能ですが、デフォルトの「username」「password」とします。今回は記述しませんが、カラム名を変更するためにはコントローラ内で設定が必要です。
今回、このテーブルへのINSERTは手動で行います。パスワードはハッシュ値を登録します。

例えば、CDショップのサイトをCakePHPで構築するとして、ロック音楽のパスを「/cd/rock/」、ポップ音楽のパスを「/cd/pop/」としたと仮定します。

CakePHPのコントローラの基本的なルールでは、「/cd/rock/」にアクセスがあった場合に、コントローラ「CdController」のメソッド「rock」で処理が行われ、ビュー「/app/views/cd/rock.ctp」で表示されます。
同じくして、「/cd/pop/」にアクセスがあった場合に、コントローラ「CdController」のメソッド「pop」で処理が行われ、ビュー「/app/views/cd/pop.ctp」で表示されます。

ここでコントローラの処理についていうと、ジャンルは違えど処理はほとんど同じのはずです。処理を共通化したい場合には、コンポーネントを活用すればよいことは以前書きました。
CakePHPでコンポーネントを作成する

Product Advertising APIを利用するために、PEARの「Services_Amazon」を使ってみます。

今回、構築したのはPHP5.3.0上です。
コマンドラインが実行できないレンタルサーバなどの環境下では、パッケージを手動でPEARのサイトからダウンロードします。「Services_Amazon」を動作させるためには、以下のPEARパッケージが必要となります。それらを以下にまとめます。

Services_Amazon 0.8.0 http://pear.php.net/package/Services_Amazon
HTTP_Request 1.4.4 http://pear.php.net/package/HTTP_Request/
Net_URL 1.0.15 http://pear.php.net/package/Net_URL/
Net_Socket 1.0.10 http://pear.php.net/package/Net_Socket/
XML_Serializer 0.20.2 http://pear.php.net/package/XML_Serializer/
XML_Parser 1.3.4 http://pear.php.net/package/XML_Parser/

コマンドラインが実行できる環境であれば、以下を実行するだけでインストールは完了します。

pear install Services_Amazon-0.8.0

手間な場合はローカルでコマンドを実行した後、インストール済みのPEARパッケージをまるごとレンタルサーバにアップロードする方法もあります。

サブドメインやマルチドメインに対応したレンタルサーバで複数のCakePHPで構築したサイトを公開する場合に、一番には複数のCakePHPをインストールすればよいと考えます。しかし、リソースが無駄に使用されるようで嫌ですよね。
当然ともいえる事のようですが、CakePHP1.3では複数のWebサイトを管理できます。

まず、前提として、CakePHPを非公開のディレクトリにインストールした構成とします。詳細は以前の記事を参照してください。
CakePHPのディレクトリ構成を変えてセキュリティ強化

例えば、以下のようなディレクトリ構成で、3つのサイト「http://site1.helog.jp/」「http://site2.helog.jp/」「http://site3.helog.jp/」をマルチドメインで公開するとします。

cakephpインストールディレクトリ /cakephp/
サイト1公開ディレクトリ /public_site1/
サイト2公開ディレクトリ /public_site2/
サイト3公開ディレクトリ /public_site3/

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はクラスでいうコンストラクトのようなもので、コンポーネントが呼ばれた際に、初めに実行される処理です。

Monthly Archives

Search