レイアウトごとにデフォルト属性を設定

この記事を修正翻訳したものをagaviのuser-MLにpostしました。そちらもあわせてご覧ください。
Agaviにはoutput_type.xmlで設定するレイアウトというのがある。これをViewで$this->loadLayout($name);するとテンプレートやらスロットやらを読み込んでくれる。
今回はProjectBaseViewに手を加えてレイアウトごとにテンプレートから$template['hoge']としてアクセスできる値のデフォルト値を設定できるようにしてみた。

<?php
class ProjectBaseView extends AgaviView
{
  public function loadLayout($layoutName = null)
  {
    $parameters = parent::loadLayout($layoutName);
    $assigns = array_key_exists('default_assigns', $parameters) ? (array)$parameters['default_assigns'] : array();
    foreach( $assigns as $key=>$value) {
      $this->setAttribute($key, $value);
    }
    return $parameters;
  }

  /**
    some codes here....
  **/
}
?>

こうすると設定ファイルで次のような設定ができる

        <layouts default="default">
          <layout name="default">
            <layers>
              <layer name="content" />
              <layer name="decorator">
                <parameter name="template">%core.template_dir%/Master</parameter>
                <slots>
                  <slot name="user_menu" module="Default" action="UserMenu"/>
                </slots>
              </layer>
            </layers>

            <!-- This is the point !!! -->
            <parameter name="default_assigns">
              <parameter name="displayUserMenu">true</parameter>
              <parameter name="style_sheets">
                <parameter>css/base.css</parameter>
                <parameter>css/default.css</parameter>
                <parameter>js/theme/jquery-ui-themeroller.css</parameter>
              </parameter>
              <parameter name="client_scripts">
                <parameter>js/jquery-1.2.6.min.js</parameter>
                <parameter>js/jquery-ui-personalized.min.js</parameter>
              </parameter>
            </parameter>
          </layout>

ついでにここで設定したstyle_sheetsとclient_scriptsは次のように利用している*1

{if isset($template.style_sheets)}
{foreach from=$template.style_sheets item='css'}
{if is_array($css)}
  <link rel="stylesheet" href="{$css.file|escape:'quotes'}" type="{$css.type|default:'text/css'|escape:'quotes'}">
{else}
  <link rel="stylesheet" href="{$css|escape:'quotes'}" type="text/css">
{/if}
{/foreach}{/if}
{if isset($template.client_scripts)}
{foreach from=$template.client_scripts item='script'}
{if is_array($script)}
  <script type="{$script.type|default:'text/javascript'|escape:'quotes'}" src="{$script.file|escape:'quotes'}"></script>
{else}
  <script src="{$script|escape:'quotes'}" type="text/javascript"></script>
{/if}
{/foreach}{/if}

*1:smartyですけど