YIIをつかう:その2

config/main.php設定をYAMLで行う。

基本発想

config/main.phpの視認性が今一つなので、全面的にYAMLファイルで行うことにした。

まずyamlファイルの置き場所を決める。今回は

config/yaml.d/

つぎに、yamlファイルの名称を決める。main.phpはハッシュ配列で

'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

'name'=>'My Web Application',

'preload'=>array('log'),

'import'=>array(

'application.models.*',

'application.components.*',

),

'modules'=>array(

となっているので、それぞれの添字を使って

  1. bashPath.yml
  2. name.yml
  3. import.yml
  4. preload.yml
  5. module.yml
  6. components.yml
  7. params.yml

とする。現バージョンでは添字は合計7つなのだ。全部設定は必要はないだろう(特にbasePathはmain.phpそのままで変更しないだろう)。

paramsに次いで、もっとも弄りそうなcomponents.ymlを例にとれば

bootstrap:
 class: 'application.extensions.bootstrap.components.Bootstrap'
file:
 class: 'application.extensions.file.CFile'
user:
略
htmlparse:
 'class': 'application.extensions.htmlparse.RadioHtmlParser'
urlManager:
 urlFormat: path
 showScriptName: FALSE
 rules:
  略
  '': 'site/index'
  '.+': 'site/index'
db:
 connectionString: <?php echo 'sqlite:'.dirname(__FILE__).'/../../data/radio-age.db';?>

意外と、最後の行の

connectionString: <?php echo 'sqlite:'.dirname(__FILE__).'/../../data/radio-age.db';?>

がミソ。yamlファイルをPHP式として評価した上でYAML解析にかければPHPの変数なども利用出来る。

ハッシュ(配列)マージ用のコード

次にこれらyaml.d/*ymlファイルを読み込むphpファイルを作る。今回は

config/mainYamlParser.php

とした。冒頭の$mainは後述するようにconfig/main.phpで初期設定されているハッシュの変数。

つまりは

config/main.php

から

config/mainYamlParser.php

を読み込み、

config/yaml.d/*.yml

から得られたハッシュをmain.phpの初期ハッシュとマージするということである。

<?php
$check=$main;
foreach($check as $k=>$v) //main.phpの添字名でループ
{
  $yamlFile = dirname(__FILE__).DIRECTORY_SEPARATOR.'yaml.d'.DIRECTORY_SEPARATOR.$k.'.yml';
  if(file_exists($yamlFile))
  {
    ob_start();
    include($yamlFile);
    $eval = ob_get_contents();
    ob_end_clean();
    $main = CMap::mergeArray(
         $main,
          array($k=>yaml_parse($eval))
    );
  }
}
return $main;

yaml関数はpecl bundle YAMLでyaml.soを作るか、それがメンドウな人はspycのような外部ライブラリを使えばいい。

最後にconfig/main.phpを一部書き換える。変更箇所は2カ所。

//return array( <==冒頭のreturn arrayをコメントアウトして

$main = array( <==$main変数に入れる。

main.phpの末尾に

return include('mainYamlParser.php');

なおinclude_onceだとダメなのはご想像ください。

以上でyamlだけで設定が出来るようになる。視認性が格段に向上した。

YAML記法で嵌ったこと

同一レベルでは、ハッシュと配列を並記出来ない。

something:
 -
  - abc
  - efg
  foo: bar

はだめ。

something:
 -
  0: abc
  1: efg
  foo: bar

と書くしかなさそうなのだが、勘違いなのかなあ。

HatenaSyntaxを使う

以前「はてな」ブログを使っていたことがあって、簡易マークアップとしてはとても使いやすかった。PHP用にhttp://nimpad.jp/hatenasyntax/がある。

一つ困ったのが、無処理行、たとえば単純にhtmlを書きたい部分をどうするかという問題。

結論的には、レンダリング時の設定でsuperprehandlerでコールバック関数を書いてやれば処理出来る。

マニュアルでは

スーパーpre記法

コードなどを色付して表示するための記法。

実際に色付け表示するには別にコードハイライトするライブラリを利用する

となっているが、それに限らず記法で囲ったブロックの行を独自に処理できる。


>|処理方法名|
あれこれ
あれこれ
||<

の場合、

function superprehandlerのコールバック関数名(処理方法名,Array $lines)

{

条件分岐で$linesを処理

}

ということらしいから、それらの行に関してはなんでも出来る。

superprehandlerをつかって無加工行出力

superprehandlerコールバック名をrawOutputという名前にして、なにもしないで出力させたいばあい、HatenaSyntaxのrenderオプションを次のようにしてやればいい。

$hatena = new HatenaSyntax();

$hatena -> render($contents,array('supserprehandler'=>'rawOutput');

render前に、あらかじめrawOutput関数を読み込んでおく。たとえば

function rawOutput($type,Array $lines)
{
    if($type =='raw')
      return implode("\n",$lines);

    if($type =='html') {
        foreach($lines as $k=>$v)
        {
            $line[] = htmlspecialchars($v);
        }
        return implode("\n",$lines);
    }
}

これで

>|処理方法名|
あれこれ
あれこれ
||<

ならば、その記法で囲んだ部分についてHatenaSyntaxはなにも処理せずそのまま出力を返してくれるのであった。

独自簡易記法を使う

HatenaSyntaxが対象としていない簡易記法を使いたい場合がある。単純な例としてはhtmlタグ用記号や特殊記号の簡単なエスケープ。<pre></pre>とか&みたいなもの。

あるいは空白行を幅をもたせて挿入したい場合。<br />を沢山使いたく無い。

---

こんな感じ。

ちょっと凝った?ところでは,AmazonのECS。

情熱の真空管アンプ&nbsp;4534037406

情熱の真空管アンプ
Author:木村 哲Manufacturer: :日本実業出版社 :
PublicationDate: :2004-04-15 :
Publisher: :日本実業出版社 :

あるいは独自すぎるけれど、自サイトの別のページのリンクとタイトル自動生成。たとえば、ファイル名を指定するだけで

Yii その1

とリンク表示したい。

次のページYiiをつかう:その3では、独自簡易記法についてメモしたい。


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