ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

Akelosでプロジェクトを作ってみる。

Akelosを始めてみました。WinXP+SP2, PHP4.4.7(8じゃないのは開発機だから)で、PHP4で行けるのか試してみます。
ところで、
http://www.akelos.org/download
↑から0.8をダウンロードしてみたのですが、中に入ってるversion.txtの中には0.7.1とか書いてあるんですけど。

とりあえず始めてみます。

続きを読む

CSSファイルを読み込ませるには

AssetTagHelperを使います。AssetTagHelperには他にもimageやjavascriptを読み込ませるためのメソッドがあります。CSSファイルを読んで、linkタグを出力するにはstylesheet_link_tag()を用います。

で、Akelosではpublicディレクトリ中にデフォルトで

public/
    images/
    javascripts/
    stylesheets/

というディレクトリが作成されます。デフォルトのこれらディレクトリ中のCSSを使うか、それ以外の場所に置いたCSSファイルを指定するかで若干引数の指定方法が異なります。

public/stylesheets/以下のファイルを読み込ませる場合

単純に foo.css から ".css" を除去した分を引数に指定します。

<?php echo $asset_tag_helper->stylesheet_link_tag('scaffold'); ?>

<link href="/stylesheets/scaffold.css" media="screen" rel="Stylesheet" type="text/css" />

デフォルト以外の場所に置いたファイルを読み込ませる場合

絶対パスから".css"を除去した分を引数に指定します。

<?php echo $asset_tag_helper->stylesheet_link_tag('/css/foo'); ?>

<link href="/css/foo.css" media="screen" rel="Stylesheet" type="text/css" />

layoutを共通化してみる。

generate scaffold などすると、app/views/layouts/ 以下にコントローラと同じ名前のlayout用ファイルが作成されます。例えば、

$ ./script/generate scaffold Hoge

とやると、

app/views/layouts/hoge.tpl

というlayout用ファイルができあがります。

まぁこれはこれで良いのですが、やっぱり大概のモノについては共通のlayoutを使いたい場面が多いと思います。

そういうときは、app/application_controller.php を開き、ApplicationControllerに$layoutメンバ変数を追加するのが手っ取り早いです。

<?php
class ApplicationController extends AkActionController 
{
    var $layout = "layout"; // 追加
}

上の例では、app/views/layouts/layout.tpl というテンプレートがlayoutとして使われるようになります。

とはいえ、場合によってはレイアウトを「このコントローラでだけ」「このコントローラのこのアクションでだけ」切り替えたい、という要望も出てくると思います。
一番単純に、コントローラ内でレイアウトを切り替えるには setLayout()メソッドを呼べばよいようです。このメソッドはAkActionControllerクラスで定義済みです。
app/controllers/hoge_controller.php :

<?php
class HogeController extends ApplicationController
{
    function index()
    {
        $this->setLayout('hoge'); // app/views/layouts/hoge.tplを使うようになる。
    }
...

setLayoutには他にも、条件で切り替えられるようなオプションもあるようですがそこまで詳しく見る気力は無くなりました。
基本的には $layout メンバ変数を設定するか、setLayout()*1を呼べば良いので、コンストラクタに埋め込んだり、ActionControllerのbeforeFilter()/beforeActionなどに埋め込んだりしても良さそうです。

で、基本的にタイトルとかは手動設定になります。自分の例で言うとこんな感じにすると良いかもです。
app/application_controller.php :

<?php
class ApplicationController extends AkActionController 
{
    var $layout = "layout";
    var $title_for_layout = "Akelos Benchmark Dummy Shop Site";
}

"title_for_layout"という変数をコントローラの基底クラスで初期設定しておきます。ページ固有のタイトルは派生先の各コントローラで、"title_for_page"という変数に設定されるようにしておけば、共通のレイアウトでは次のように出来ます。
app/views/layouts/layout.tpl :

<title><?php if (!empty($title_for_page)) { echo $title_for_page . " : " ; } ?>
<?php echo $title_for_layout ?></title>

(実際は一行)

とりあえずこんな感じでも行けそうです。

*1:これも結局はcontrollerのlayout変数に引数を指定しているだけです。

レイアウト中でpartialを使う

こんな感じで。
app/views/layouts/hoge.tpl :

<?php echo $controller->render(array('controller' => 'common', 'partial' => 'accountheader')) ?>

これで、app/views/common/_accountheader.tpl を取り込めます。

普通にcontrollerのview内であれば、'controller'指定は省略できます。(そのcontroller内のpartialを使って入ればの話)
でもlayout内でpartialをとりこみたい場合は、適当なcontrollerのview内にpartialを置いておき、layout側からは'controller'を指定して取り込み、という感じになります。

どうでも良いですが、Akelosを始めるときは最低一つはscaffoldを作っておくと良いかもしれません(後で捨てても良いので)。なにぶんドキュメントなどがまだまだ全然未整備ですので、scaffoldのコードとかが参考になります。