Yii その1


【中断】YII本を買う

ううむ、率直に言って本家ドキュメントサイトが読みにくい。

加えて結構サイトが止まるみたいだ(今日の朝も止まってる・・・)。

というわけでYII本を買ってしまった。Kindleで17ドルぐらい。まずこれを眺める。

Yii 1.1 Application Development Cookbook 1849515484

Yii 1.1 Application Development Cookbook
Author:Alexander MakarovManufacturer: :Packt Publishing :
PublicationDate: :2011-08-25 :
Publisher: :Packt Publishing :

1,2章を読んでなんとか動作がわかった

magic method _get _set

セッターゲッター利用基本。Object->プロパティ。

http://www.yiiframework.com/doc/api/1.1/CComponentにももちろん書いてあるが。

Definitive GuideにないYii core collectionsの紹介

配列系のAPIがいくつもある

  • Lists: Clist,CTypeList
  • Maps: CMap,CAttributeCollection
  • Queue: CQueue
  • Stack: Cstack

ルーターの詳細説明

ルーターという名前がちゃんと出ていたので嬉しい。Definitive GuideではurlManagerの説明に対応するのだが、同ガイドではルータという言葉が埋もれているのだ(*1)。本でも、Router rules description is scatterd over the official Yii guide and API docs.とここらへんの部分のドキュメント類が分散(散漫)してる点を冒頭で指摘している。

本では正規表現の書き方が、成功・失敗例付で載っているのでわかりやすい。

個別に役立つ情報としては

コントローラ(WebsiteController名)で

function actionPage($alias) {}としておいて

ルーター(main.phpのurlManager)の方で

'<alias:about>'=>'website/page',

'page/<alias>'=>'website/page'

とすれば、$aliasに左辺で指定した変数名がfuncitonの変数になるのだね。うむこれはすばらしい。

作業再開

behaviorの使い方

http://takaakl.blog107.fc2.com/blog-entry-11.htmlを読んでちょっとわかった気になった。

ControllerのAction前動作メソッド

public function beforeAction()

メソッド内にreturn TRUEがないとそこで処理が終わるので注意。

なお元は、public function beforeAction($action)なのだが、この$actionに何が入っていくのか不明。

SESSION

http://www.yiiframework.com/doc/api/1.1/CHttpSession

viewとlayout

View

コントローラから render() メソッド。

render第一引数は(views/コントローラ名/)ファイル名。デフォルトはindex.php

第二引数は配列のcontent。

layout

コントローラのlayoutプロパティでlayout名を設定。デフォルトはmain(protected/views/layouts/main.php)。

Viewからlayoutに渡るのでView内の$this->プロパティ設定が可能。

renderPartialsなど

partials render

ようするにViewに再利用可能な部分viewを作って変数を書いておく。

別のviewからそのviewを呼び出す。

protected/views/common/test.php

<a href="<?php echo $url;?>" title=<?php echo $alias-name;?>"><?php echo $title;?>"</a>

protected/views/site/index.php内

なんたらなんたら

<?php $this->renderPartial('////common/test',array('url'=>'http://foo.bar.com','title'=>'foo.bar.com','alias-name'=>'drink bar'));?>;

なんたらなんたら

clips

一種の文字列バッファである。ソースを見てないけどob_bufferを使っているのだろう。

コントローラのインスタンス(もちろんそのオブジェクトを継承してるviewでも同じ)で、

$this->beginClip('footer');

なにか書く

$this->endClip();

としておけばlayoutなどで

echo $this->clips['footer'];

とできる。

decorators

バッファ付きのpartials renderみたいなもの。

複数レイアウト

これは後にちょっと詳しく書く。

サイトの画面レイアウトブロックを簡単に変更するのに多用するだろうから。

widgetを理解する

bootstrap extensionの導入とless

パン屑リンクbreadcrumbsやナビリンクなどの生成のために、

http://www.yiiframework.com/doc/api/1.1/CBreadcrumbs

などのウイジェットを弄っていて、extensionにあるbootstrapに行き着いた。

bootstrapはtwitterコミュニティで開発されてきたページデザインのためのツールキットである。これにYii対応extensionがあるのだ。

bootstrapの本家はhttp://twitter.github.com/bootstrap/

全容はヨクワカランが、便利なことはこの上なさそうである。Yiiのbootstrap extensionは、lessで作成されたbootstrapのデフォルトcssが付いてくる。

というわけで、lessを勉強する。lessの本家 =http://lesscss.org/

bootstrap extensionにはそのlessのMakefileが同梱されている。

cd yiiルート/protected/extensions/bootstrap/vendors/bootstrap/
ls -1
LICENSE
Makefile
README.md
bootstrap.css
bootstrap.min.css
docs
examples
js
lib

makeするにはlesscが必要でlesscにはnodeが必要。

というわけで昨年末のLess & Sass Advent calendarの記事、LESSのインストールでハマった点まとめ、を参照してインストール。

あとは

yiiルート/protected/extensions/bootstrap/vendors/bootstrap/lib

にある*.lessファイルを弄って(*2)、makeするとbootstrap.min.cssとbootstrap.cssが出来る。

この*cssファイルを

yiiルート/protected/extensions/bootstrap/assets/css

にコピーしてやる。

ビューのヘッダなどで

<?php echo Yii::app()->bootstrap->registerCoreCss();>

とすると上記assets/css/は、doc rootのassets/css/(*3)/に複写されたのち、link要素のhref属性でHTML化されてresponseされる仕組み。

<link rel="stylesheet" type="text/css" href="/assets/273f83f6/css/bootstrap.min.css" />

こんな感じ

registerCoreCssメソッドはハードコーディングでbootstrap.min.cssが使われている。

他のcss指定はclassをextendsする必要があるようだ。

他方javascriptは

Yii::app()->bootstrap->registerScriptFile("bootstrap-scrollspy.js");

などとする。この場合はbootstrap extensionのassets/jsにjsを入れておけば自動コピーしてくれる。

と、知った風のことを書いたがlessの記法を学んだわけではない。しかしyiiを弄り始めてlessを知ったのが今のところ一番デカイ。今後使うと思う。

nginxでYII

Apacheを使うのをやめた。

Yiiでの.htaccessの代わりにnginxで各種設定。nginxのインストール、設定は/dev/yii/install.html参照。

nginx.confの関連部分

    location ~ \.php {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    #let yii catch the calls to unexising PHP files
    set $fsn /$yii_bootstrap;
    if (-f $document_root$fastcgi_script_name){
    set $fsn $fastcgi_script_name;
    }
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fsn;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fsn;
    }

簡易記述

HatenaSyntaxを基本に、若干の独自マークアップを付加してHTML文を記述。

このページの例=>SOURCE(popup)

冒頭の#記号の三行でタイトル、メニューリンク(パン屑リンク用ファイル一覧と自分の所属グループのファイル一覧)の設定。

残りは本文。

*1: しかもDefinitive Guideでは最初にcreateUrlの説明が入っていてルーティングの説明は最後の方にちょこっと

*2: bootstrap.lessが他のlessファイルを@importしている。

*3: YiiのassetManager->publishメソッドで得られる一意の文字列

this file --> last modified:2012-03-31 13:57:52