sfTwigPluginのサンプルコード書いた

夜21時くらいからはじめてこんな時間までかかってしまったが、sfTwigPluginをこういう風に使いたいなーってサンプルコードを書いてみた。

http://github.com/cocoiti/cocowiki/

眠いのであとでちゃんと書くが、要約すると、デザインにかかわるテンプレートファイルは通常symfonyのレイアウトファイルを配置するディレクトリに配置する。
module側にはアプリケーションにかかわる部分(主にフォーム関係やエラーメッセージ)を入れる。

ということがやりたかった。

そして、それを実装するためには現在のsfTwigPluginは機能がたりなかったのでsfTwigPluginをforkしてEventListenerを追加した。

http://github.com/cocoiti/sfTwigPlugin/

下記のようなコードでEventを追加してやれば、継承や本体の書き換えを使うことなく設定の範囲で、好きなパスを、Twigのテンプレート読み取り先のディレクトリとして登録できる。

<?php
 
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins('sfDoctrinePlugin');
    $this->enablePlugins('sfTwigPlugin');
    $this->dispatcher->connect('template.twig_template_paths', array($this, 'getTwigTemplatePaths'));
    $this->dispatcher->connect('template.twig_get_extensions', array($this, 'getTwigExtensions'));
  }
 
  public function getTwigTemplatePaths(sfEvent $event, $params)
  {
    $layout = array_filter(sfContext::getInstance()->getConfiguration()
                                            ->getDecoratorDirs(), 'file_exists');
    return array_merge($layout, $params);
  }
 
  public function getTwigExtensions(sfEvent $event, $params)
  {
    $escaper = new Twig_Extension_Escaper(true);
    return array_merge($params, array($escaper));
  }
 
}

ちなみに、cocowiki、gitで管理できるwikiみたいな実装をしてみた。

最初、外国の人にもわかるようにmarkdownシンタックスに対応しようとおもったけど、使ってみたいライブラリが見つからなかったので、id:anatooHatenaSyntaxを使わせていただいた。(すげー楽に使えました。)

あとgitの管理については、最近、PEPrにあがった、VersionControl_Gitを使わせていただいている。

もちろん、そういう用途で使う分にはちゃんとしたサービスとして作られてるid:sotarokwikihubを使うべきななのはいうまでもない。

思考実験と、最終的にsfTwigPluginの作者への説明のためにつくったアプリなので更新するつもりはあまりないし、パソコン破壊するとか、公開以外のディレクトリが全部みえちゃうかもしれないレベルで激しくちゃんと動く自身がないが、Twigや各ライブラリを使う参考にはなるんじゃないだろうかとおもうのでさらしておきます。

英語勉強してpullリクエストおくらないと。