2008年11月アーカイブ

レイアウトの作り方で「カット」しておいた、くり抜いた中身を、app/views/pages/home.ctpに貼り付けます。

これで完成です

いや、ホンマに。


あとは、トップページに必要な正しいリンクとか、ビューとしての作法に置き換えていきます。

正しいリンク、というのは、例えばフォームのpost先やプログラムへのリンクを書き換えるということになります。

ビューの作法というのは、代表的なのは画像パスですね。レイアウトでやったcss同様に、パスが変わっていってしまうので、htmlヘルパーを使います。ヘルパーでいえば、フォームもフォームヘルパーを使う方がよい場合もあります。(使わない方がハンドリングが楽ということも...)

また、他のページで流用するようなパーツは、エレメントとしてまとめた方がメンテナンス性が上がるのは前回のエントリーで触れたとおりです。

このへんは、まだ書いてませんが、後にビューについて触れていこうと思います。


ちなみに、こうして(自分としては)丁寧に書いているのは、しばらく触れないといると簡単に忘れてしまうので、自分用に書いているだけです。

初心者の初心者による初心者のためのエントリーです。初心者とは私のことですが。


追記

書くつもりですっかり忘れていました。

この方法でトップページを置いた場合に、はまりやすいのが、PageTitleの設定です。
普通はアクションがあるので、そこで指定するのですが、このトップページはデフォルトページなので、この時点で何のアクションも発生していません。

いや、厳密には /cake/libs/controller/pages_controller.php が呼ばれていますが、ページタイトルを入れるためだけに、わざわざコントローラを作るのはスマートではありません。

もちろん、トップページでいきなり処理が必要な場合は、先のpages_controller.phpをコントローラにコピーして(どちらかを読むので、内包している必要あり)、必要な記述を加えればよいです。


ページタイトルだけなら、簡単に入れられます。

home.ctpの冒頭で

<? $this->pageTitle = 'ページタイトルです'; ?>

と宣言して下さい。これだけで、大丈夫です。

えっと、この辺からは他のサイトでも色々載っているので、間違いだらけの私が書いていくことはないんですが、過去、方方をググり続けて疲弊してしまった経験から、もしこのサイトにたどり着いた初心者の人が、少しでも楽になれば、ということで書いていきます。

なので、間違ってるかもしれんから、心して読みたもーれ。
(というか、間違いを見つけたら、コメントで指摘して下さい。お願いです。)


前回、トップページをカスタマイズするのに、home.ctpをいじるけど、そのまんまhtmlをつっこんだらアカンという話をしました。

これは、どんなページでも「レイアウト」というファイルを通じて表示をするからです。
このレイアウトというのは、俗にいうテンプレートです。DreamWeaver(以下DW)のテンプレートみたいなもの。表示するのに必要なベースとなるhtmlを記述します。そして、その中に「ここはシステムが書き出すところだよ」という情報を入れてあげることで、システムは常にそのテンプレート...もといレイアウトをベースにhtmlを生成します。

普通はレイアウトを作らないと、CakePHPデフォルトのレイアウトが使われる羽目になるので、作るのは作らないといけません。
レイアウトを使わない出力というのもできると思いますが、レイアウトは自由に切り替えができますから、とりあえずはレイアウトは使うものだと思っておいた方が、無駄な頭は使わずに済みます。


とりあえず、レイアウトの作り方。

views/layoutsにdefault.ctpというファイルを作ります。
まず、これにデザイナーに作らせたトップページを全部つっこんでしまいましょう。

これで完了です  あぅ( ̄▽ ̄*)☆α==(・・#)


このままでは、全てが決め打ちになってしまい、システムで更新できるところがありません。そこで、システムで更新する部分を置き換えていきます。

では、メタから触れていきましょう。

<?php echo $html->charset(); ?>
<title>
    <?php echo $title_for_layout; ?>
</title>
<?php
    echo $html->css('sample');
    echo $html->meta('icon');
    echo $html->meta('keywords','すごいサイトです。');
?>

上記のように記述すると、出力は次のようになります。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Home</title>
<link href="/(webroot)/favicon.ico" type="image/x-icon" rel="icon"/>
<link href="/(webroot)/favicon.ico" type="image/x-icon" rel="shortcut icon"/>
<link rel="stylesheet" type="text/css" href="/(webroot)/css/sample.css" />
<meta name="keywords" content="すごいサイトです。"/>


$html->charset();

これで、文字コードを指定することができます。
もし、EUC-JPだったら、charset('euc-jp')となります。
というか、囲ってある文字をそのまま出すっぽいので、気にせずに、JISならcharset('ISO-2022-JP')、SJISなら、charset('Shift_JIS')とか、HTMLに出したいものをそのまま書いちゃえばいいです。


$html->css('sample');

ファイル名(拡張子なし)を入れると、webroot/cssの中のcssファイルを読みに行きます。
はい。ここで、webrootの存在価値がグッと上がるわけです。

「ビューを使って表示するのに、なんでwebrootがいるの?」と薄々思っていた人は、これですっきりして下さい。

webrootは、そこにhtmlを置くことで、スタティックなページを表示するのにも役立ちますが、cakeはどんどんパスが変わってしまうので、「絶対パスで書きたいけど、それもなぁ...」的なデータを集約することができます。

そのために、webrootのディレクトリには、cssとかimgとかのフォルダがデフォルトで入っているんですね。おまけで入っているわけではないので、うぜーって削除した人は戻して下さい。

さて、cssのディレクトリにあれば、パスが変わっても大丈夫というお話なのですが、はて、cssの中でimportしている場合はどうなるのでしょう。

答え。全部webroot/cssディレクトリに入れて下さい。
元々、cssはそうなってます。

@import "init.css";

などと書いておけば、読んだcssと同じディレクトリにあるinit.cssを読みに行きます。


では、既存のサイト上のcssを利用するにはどうしたらよいか。

そりゃ、直書きしかないんじゃないでしょうか。

$html->css('/sample')と書いても、/webroot/sample.cssにしかならないので、無理矢理書くなら、$html->css('/../sample')ですかね。この場合、マジメに/webroot/../sample.cssとなりますので、美しくないです。

やりかたはあるのかも知れませんが、今、私の置かれている状況では重要ではないので、ひとまず置いときます。


あとは、マニュアルのこのへんを見て下さい。詳しく書いてあります。



さて、システムが処理した結果を出力する部分は、次のようにコーディングします。

<body>
    <?php echo $content_for_layout; ?>
</body>

bodyには、普通グローバルナビゲーションとか、ヘッダフッタ、諸々関係先があると思いますので、システムによって可変にならない部分を決め打ちにします。

そして、「ここはシステムで可変になるぞ」というところを、カットして、他のファイル(とりあえず、どっかのテキストエディタ)に書き出しておきます。捨てずにそのまま置いておいて下さい。
そして、カットした跡地にそっと上記のようなタグを入れておくのです。

これで、レイアウトとしては、ここが可変領域だよ、ということになります。


DWと違って、可変領域(DWでいう編集可能領域)は、たぶん1つです。
そうなると、「共通パーツがあれも、これもあるのに、それはそれぞれのビューで書かないといけないのかー」というと、そうでもありません。

DWで「ライブラリー」というものがありますけど、これに近いもので、Cakeにはエレメントというものがあります。
エレメントに書いたコードは、ビューの中で何度も再利用ができます。当然、元を直せば全てが一括更新されますので、ビューに直書きするよりも効率的です。

美しいコード書きを目指すのなら、HTMLにも効率性を求めるべきです。


とりあえず、トップページをいじっている現段階では、エレメントは放置しますw

ええと、開発環境のこととかを書きたいのですが、ちょうとCakeで作る仕事があって、それをたどりつつ、今まで書きためたものを加えつつ書いていこうかと思うので、順不同です。

どうせ、それが揃うころまで誰も見に来ねーよ¬( ̄。 ̄¬)



さて、まずはトップページからいじってみる。
コントローラもモデルも書かないうちにトップページってww

いや、コントローラとかモデルとかは、散々他のトコで書かれていて、資料に事欠かないわけです。

ところがです。

例えばwwwrootsampleというディレクトリで、URLが
http://hogehoge.com/sample/だったとして、
http://hogehoge.com/sample/testctr/testfunc/paramというURLなら、
testctlというコントローラを呼び出して、その中のtestfuncにparamを引き渡す。
というのは、百も承知です。分からない人は、まずググれ。本を買え!


ところが、URLをいろいろ変えてみると、
http://hogehoge.com/sample/
のときだけ、CakePHPのページが表示されて都合が悪い。
http://hogehoge.com/sample/testctr/
なら、testctrの中のindexアクションを読みに行きますから、function index()って用意してあげれば問題ない。

これに詰まってしまうわけです。
最初僕がこれをやりたいと思ったときには、それなりにググりました。

私が最初に買った、某オレンジの本にも全く出てきません。(見落としてなければ)
それどころか優良書である、某ガイドブックにも出てきません。


これの解決策としては、
1)app/config/routes.phpの設定を変えて、wwwrootへのアクセスを強制的にどこぞやのアクションにつなぐ。
2)表示されるトップページを変更する。

まず、1の場合は、app/config/routes.phpを開くと次のような記述があるはずです。
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
これは、簡単に説明すると '/'(wwwroot)へアクセスしてきたものは、'pages'というコントローラの'display'アクションに引き渡します、ということですね。'home'というのは、たぶんパラメータとして渡しているんだったんじゃないかな、たぶん(爆

さらに訳すと、/でアクセスしてきた場合は、app/views/pagesの中のhome.ctpを開くようになっています。

なので、どこぞやのアクションを実行することで叶えられるなら、これが手間がかからず、ラクチンです。詳しくはidea*ideaの田口さんところのこちらでも参照して下さい。


2の方法ですが、1の解説で察しはついたでしょう。
そっか、app/views/pages/home.ctpを直せばええんやな。と。
ところが、

「開いたけど、そんなファイルないやん」
「ファイルがないのに、なんで、CakePHPのページは表示されとるんや」

という感じで(゚Д゚≡゚Д゚)?となってしまうと思います。


えっと、ここにCake(他は知らんw)の大きな特徴があります。

appにないコントローラとかビューは、コアに探しに行きます。

コアとは、appと同じ階層にあるcakeのフォルダに入っている、フレームワークのエンジン部で、通常は一切触らずに、アプリケーションごとのフォルダであるappの中を触ります。

で、cake/libs/view/pagesを開いてみてください。ありましたね?home.ctpが。
これを表示していたのです。

しかし、ここはコア。「このファイルを直せばええんやな」とは思ってはいけません。ダメ、ぜったいw

さっきいったように、app側になければ発動します。だから、app側にあればいいのです。
なので、一から(あんまりコアのhome.ctpをコピーする意味はないので)app/views/pages/home.ctpを作ればよいです。


しかし、これにそのまんまトップページのhtmlを入れてはいけません。
「レイアウト」というものが絡んできます。このあたりの仕組みは次の機会に。

ちなみに、さっきのroutes.phpで、「'pages'というコントローラの'display'アクション」につなげていましたが、app/controllerの方にはpagesというコントローラは影も形もありません。こちらも同様に cake/libs/controller にpages_controller.phpがあって、function display() というのが確かにありますね。

繰り返しますが、コアは触らない(更新しない)のが原則です。注意してください。

まぁ、僕に注意を促されても、説得力に欠けると思いますけどw
今まで(といっても2エントリーやん)、ある程度まとめた文章を書いてきましたけれども、本来は、圧倒的に「嘆き」が多いです。というか、そのはけ口と、解決策が見つかったときの備忘録、というのがこのブログの主旨です。


というわけで、


デプロイってどうすんねん。


分かった振りして書いているので、「phpでデプロイって( ´,_ゝ`)プッ」って感じかも知れませんがw

僕がやりたいのはですね、ローカルにプロジェクトを作りました。
さて、サーバで動かしてみましょうっていうときに、アップデートしたファイルをアップロードして、ブラウザで表示したい、ってことです。


そりゃ、FTPの設定してやんねん。

という事なかれ。


えっと、今僕のマシンにはローカルにはapacheを入れていません。
そしてアップしたいのは「隣に置いてある」開発用のWindowsサーバです。

このサーバでテストしたいねんけど、
FTPが入ってないねん。


デバッグ環境はどうあるべきか、というのが、やり方がよく分からない課題で、ローカルにあんまり常駐をいれたくないとか、やっぱり本番環境に近いテスト環境でやりたいとか、そういうことに対して、ローカルにxamppで入れて環境ばっちりっていうのは、なんか違う感じがする。


まぁ、デバッグという点では、ローカルにphpが必要であったり、結局はapacheがあった方がいいとか、結果論としては、賛成できます。だけど、これでしかできないというのは納得がいかない。

Cakeなので、基本的に「実行」してみるときって、そのphpを実行ではなくて、とりあえずトップページとか表示してくれたらいいと思うのね。なので、「実行」ってやったら、サーバへデプロイして、指定のトップページを表示してほしいんだが。(まぁ開かなくてもいいけど)



結局、時間オーバーで断念。

PDTと設定が違う上に、aptanaでのPHPプロジェクトの作成からデプロイまでの流れを説明したサイトが見つからなかった。

SMBでwwwrootが共有状態にあるので、仕方がなく、該当フォルダをプロジェクトとして割り当てることにした。(インポートでなく、サーバ上にプロジェクトを置く。)


参考、というかサーバ上に直接プロジェクトを置く、という発想がなかったので、そのヒントにさせていただいたのが、Aptana StudioをインストールしてPHP開発環境を作るです。


でも、これスマートじゃないっていうと怒られそう、というかMAMPだからとかそういうことかもしれないんですけど、やっぱりローカルにソースがあって、然るべきタイミングでデプロイっていうのが自然な流れのような気がするんですけど、みんなどうしてるんでしょうか。

デプロイのところは、エクスプローラ操作とか(FTPならaptanaでいいといえばいいので、FTP以外の場合)でやってるんでしょうか。

こちら(PHPサーバーの設定)を見ると、いかにも、URLと公開ディレクトリの設定があるように見えるんですが、Aptanaには見あたらない。。。


ううむ。。。


※Aptanaはスタンドアローン版をインストールしております。
1ヶ月の沈黙を経て、帰ってきたYO!

この間にメキメキ上達していたか、というとそれはナイ

はっきりいって、全く別の仕事をしてました。

よって、CakePHPなんて、

すっかり忘れました(´ー`)y-~~


いや、ホント、記憶力がないんですって。


そのまま触れなくて済めばいいんですが、やっぱり仕事はやってくるわけで。
というか、放置していたわけで。。。


ふぅ。



PHP開発をAccessと比較せざるをえないイタイ経歴はさておいても、開発環境は結構悩ましい問題だと思います。

ましてや、Accessから移行だと、辛くて仕方ないかと(;´д⊂

基本的には、エディタとFTPとサーバがあればできちゃうわけなので、話題としては実質的なプログラミングの情報が中心のことが多いです。
開発環境は、個人の好みがモロに出るので、「これを入れて下さい」という標準がありません。

単一のIDEしかない環境で開発した者としては、(゚Д゚≡゚Д゚)?となるわけです。


そもそもが、オブジェクトを配置してグリグリ動かして、コードを載せる、というスタイルではないので、プログラミングとは、全く違うことをしているような気になります。
もともとのコンパイル型の言語を扱ってくれば、実はそんなに違いはないと思うんですけど、なんせこっちはBASICマンセーでs(ry

僕の場合は、下地としてスタティックなサイト制作の経験がありまして、いわゆるWeb標準で、cssレイアウトとかもやりまして、画面を作るところには苦はありませんが、そのへんかたスタートだったら、もう大変でしょうね。

うちも、以前契約した派遣エンジニア(新人)も、phpは書けるのに、HTMLがよく分かりませんっていわれて( ゚Д゚)ポカーン としたことがありますもの。

が、このブログはAccessディベロッパーがphpに移住するためのガイドではナイので、そのへんは、各自、身につけて下さい。(<誰にいってんの)


で、僕のようなウェブ制作をやってる人は、環境として一番手っ取り早いのは

DreamWeaver

ktkr!<使うとこ違うやろ

やっぱり慣れたツールだし、サイトの定義だけしておけば、ctrl+shift+Uのショートカットですぐにアップロードできちゃうし、楽勝!


しかし、ある日「面倒くさい」と思うようになりました。



だって、
DreamWeaverの面倒くさい画面使わないフォルダばっかりでてくる
んですもの。

フォルダを行ったり来たり、面倒w


そこで、
UltraExplorer

なんといっても、ウルトラですよ。

進めているプロジェクトのフォルダをお気に入りに並べれば、なんとスマート!(≧∇≦)

UltraExplorer



しかし、待てよですよ



こうして、テキストエディタに戻るのが、本当に正しいのだろうかと。


だって、ググったらEclipseとかPDTとか騒がれてるじゃん。


やっぱり(・∀・)イイ!!とか書いてあるじゃん。


というわけで、乗り換えてみることにしました。



aptanaに。



つづく(うだうだだーだ¬( ̄。 ̄¬))

このアーカイブについて

このページには、2008年11月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。