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

最近ではFlashといっても多岐にわたります。Webサイトであったり、ゲーム、バナーやAIRアプリケーションなど。詳しくはないですが携帯でもFlashがあります。
要件に応じて最適な構築方法も異なると思いますが、そんな手法の一つとしてProgressionを試してみたいと思います。

ProgressionはFlash CS3~CS5に対応したフレームワークで、特にフルFlashサイトを構築する場合にその威力を発揮するようです。
標準のWebのような構成、つまり、ページがいくつか存在して、グローバルナビゲーションがあって、といったことをFlashで実現しようすると、結構たいへんだったりします。それぞれボタンを作成して、イベントを設定して、タイムラインを制御してなど、毎度繰り返しのめんどくさい作業が発生します。
そんな作業をProgressionでは比較的、軽減してくれるようです。

今回はそのProgressionをインストールしてみたいと思います。

サブドメインやマルチドメインに対応したレンタルサーバで複数の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/

ソフトバンクのAndroid携帯「HTC Desire」に、アプリ「Adobe Reader」をインストールしてコミック「ラブひな」を読んでいます。

特に「ラブひな」ファンでもマンガ好きなわけでもないですが、今回、Jコミというサイトで無料でラブひな全巻が公開されるということで、これを機に読んでいます。
Jコミ – http://www.j-comi.jp/
普段、一切アニメやコミックは見ない人間なんですが、無料となるとついつい手を伸ばしてしまいます。貧乏性なんですかね。

コンテンツは上記サイトよりPDFファイルで展開されています。
コンテンツ公開時期と、Android携帯を入手した時期が重なっていたのもあり、それから細々と読み続けています。小さい画面だと読み物には辛いという先入観がありましたが、意外にもすんなり読めますね。

CakePHP1.3のデフォルトのディレクトリ構成を変更して、セキュリティの強化を図ります。

通常、CakePHPをインストールする場合、ダウンロードしてきたソースを公開フォルダに展開するだけです。この手軽さが利点なのですが、ログやキャッシュファイルなど、直接アクセスしてもらいたくないファイルも公開ディレクトリに展開されることになります。
アクセスを許したくないフォルダに制限を設けるのも一つの方法ですが、めんどくさいですね。
ただ、詳細は省きますが、基本的にはアクセスできないようなしくみにはなっているのです。しかし、そうは言っても気持ちが悪いですよね。

CakePHPでは「/app/webroot」フォルダに設置した静的コンテンツは、ブラウザから直接リクエストを発行してアクセスできます。それ以外のリクエストについてはフレームワークで処理されます。つまり、リクエストからの処理の流れが「ドキュメントルート」⇒「webroot」⇒「フレームワーク」のようになっているのです。
この構造を少し単純化して「webroot」⇒「フレームワーク」にしてしまおうというのが今回の考えです。つまりは、「ドキュメントルート」を「webroot」にしてしまうわけです。

CakePHPでモデルを作ってみます。

モデルは、DBの入出力だけでなく、ファイル操作や通信処理などを一様に処理できるようなしくみを構築できるようになっています。また、DBと一口にいっても、MySQL、PostgreSQLやSQLiteなどさまざまなプラットフォームがありますが、それらの依存もモデルで吸収してくれるので、プログラマは特に気にせず作業することができます。
今回はMySQLとのインターフェースを自作してみます。

まずは、以前にCakePHPのインストールでも紹介したように、DBの設定がされていることを前提にします。ちなみに設定ファイルの場所は「/app/config/database.php」です。

Twitterの公式ウィジェットが簡単に自分のサイトに設置できるみたいなので、やってみました。

サービスを提供しているページは以下です。
Twitter / ウィジェット

メニューより「自分のサイト」⇒「プロフィールウィジェット」を選択します。

「設定」で表示したいプロフィールのユーザ名を入力します。その他、ツイートの表示方法やデザイン、サイズを設定することができます。
設定が済んだら「プレビューで確認」ボタンを押して、実際にどのように表示されるかが確認できます。
表示内容に問題がなければ「完了&コード取得」ボタンを押して、JavaScriptのコードを取得します。

そのJavaScriptのコードを、自身のサイトやブログに貼り付けます。
そうすれば、以下のようにツイートが表示されます。これは実際にコードを取得、貼り付けた例です。

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>

Monthly Archives