チャレンジ! Movable TypeをCMSとして使ってみよう!(第5回 head要素の中身を作る/グローバルナビゲーションを作る)

チャレンジ! Movable TypeをCMSとして使ってみよう!(第5回 head要素の中身を作る/グローバルナビゲーションを作る)

Posted at October 12,2008 12:03 AM
Tag:[MovableType]

またまた遅くなりましたが、フリーランスWebデザイナー・黒野明子さんgihyo.jp で Movable Type の連載第5回が公開されています。


チャレンジ! Movable TypeをCMSとして使ってみよう!- 第5回 head要素の中身を作る/グローバルナビゲーションを作る

チャレンジ! Movable TypeをCMSとして使ってみよう!

第5回は「head要素の中身を作る/グローバルナビゲーションを作る」です。

今回は、テンプレートモジュールを利用したキーワードの meta 要素の keywords への反映、カスタムフィールドを利用して「カテゴリ用キーワード」を作成し、入力した内容を meta 要素の description への反映、テンプレートモジュールを利用したグローバルナビゲーションの表示を行っています。

いつものように、「ほげ山くん」と「くれま先輩」が会話形式で進めます。

お詫び

今回の記事では、メインページを判定する変数 main_index と検索結果を判定する変数 search_results は予めシステムで設定されているという説明がありまして、私も気がついておりませんでした。この件については拙著「Movable Type 4.2 パーフェクトガイド」に反映されていませんでしたので、この場をお借りしてお詫び申し上げます。

で、ちょっと調べてみたところ、変数 search_results は 4.2 からシステム内部で設定されたのですが、変数 main_index については、厳密にはテンプレートセットで記述した値が利用されるようです。

「既定のブログ」であれば、lib/MT/DefaultTemplates.pm の設定(下記の青色)が反映されます。

...前略...
BEGIN {
    $templates = {
        'index' => {
            'main_index' => {
                label => 'Main Index',
                outfile => 'index.html',
                rebuild_me => 1,
                ...後略...

青色部分はテンプレートの「テンプレートの種類(identifier)」に該当するのですが、各インデックステンプレートの再構築時点でこの「テンプレートの種類」が、lib/MT/Template.pm の下記の青色の行で変数として設定されます。

sub build {
    my $tmpl = shift;
    my($ctx, $cond) = @_;
    $ctx ||= $tmpl->context;
 
    my $timer = MT->get_timer();
    local $timer->{elapsed} = 0 if $timer;
 
    local $ctx->{__stash}{template} = $tmpl;
    my $tokens = $tmpl->tokens
        or return;
    my $build = $ctx->{__stash}{builder} || MT::Builder->new;
    my $page_layout;
    if (my $blog_id = $tmpl->blog_id) {
        $ctx->stash('blog_id', $blog_id);
        my $blog = $ctx->stash('blog');
        unless ($blog) {
            $blog = MT::Blog->load($blog_id) or
                return $tmpl->error(MT->translate(
                    "Load of blog '[_1]' failed: [_2]", $blog_id, MT::Blog->errstr ));
            $ctx->stash('blog', $blog);
        } else {
            $ctx->stash('blog_id', $blog->id);
        }
        MT->config->TimeOffset($blog->server_offset);
        $page_layout = $blog->page_layout;
    }
    $page_layout = $tmpl->page_layout if $tmpl->page_layout;
    $ctx->var( 'page_layout', $page_layout )
        unless $ctx->var('page_layout');
    if (my $layout = $ctx->var('page_layout')) {
        my $columns = {
            'layout-wt'  => 2,
            'layout-tw'  => 2,
            'layout-wm'  => 2,
            'layout-mw'  => 2,
            'layout-wtt' => 3,
            'layout-twt' => 3,
        }->{$layout};
        $ctx->var( 'page_columns', $columns ) if $columns;
    }
    $ctx->var( $tmpl->identifier, 1 ) if defined $tmpl->identifier;
 
    $timer->pause_partial if $timer;
 
    my $res = $build->build($ctx, $tokens, $cond);
 
    if ($timer) {
        $timer->mark("MT::Template::build[" . ($tmpl->name || $tmpl->{__file} || "?").']');
    }
 
    unless (defined($res)) {
        return $tmpl->error(MT->translate(
            "Publish error in template '[_1]': [_2]",
            $tmpl->name || $tmpl->{__file}, $build->errstr));
    }
    $res =~ s/^\s*//;
    return $res;
}

つまり外部のテンプレートセットに入れ替えて利用する場合は、外部テンプレートセットの identifier の設定に依存するので、次のような config.xml であれば、メインページで設定される変数が main_index でない可能性もあります。

...前略...
        'index' => {
            'top_page' => {
                label => 'Main Index',
                outfile => 'index.html',
                rebuild_me => 1,
                ...後略...

ということで、指摘をされた方への指摘ですが、デフォルトテンプレートをカスタマイズするのであれば、変数 main_index が利用でき、そうでない場合は、テンプレートセットの設定(またはテンプレート編集画面の「テンプレートの種類」)から利用可能な変数を確認する、というのが正しい解釈です。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)