メニュー

Home >freo講座>初心者の為のfreoテンプレート編集講座> 【基本編(11)】freoでのforeach使用例

【freo講座】【初心者の為のfreoテンプレート編集講座】【基本編(11)】freoでのforeach使用例

2012/09/20 13:01|タグ:条件分岐smartyforeach多次元配列子ページ表示プラグインsmarty:nodefaultsグッジョブ表示 30

前回解説したforeachがfreoでどのように使用されているのかを解説します。

freoでのforeachの使用例

子ページを一覧で表示する(多次元連想配列をforeachで繰り返す)

freoに初期装備されているプラグインで、子ページ表示プラグインというプラグインがあります。
あるページを表示したとき、そのページの子ページの情報を取得するプラグインです。
このプラグイン情報を取得する部分のテンプレートで、foreachが使われています。

[freo/templates/internals/page/default.html]の57~64行目を見てください。

<!--{if $plugin_page_childs|smarty:nodefaults}-->
<h3>目次</h3>
<ul>
    <!--{foreach from=$plugin_page_childs|smarty:nodefaults item='plugin_page_child'}-->
    <li><a href="{$freo.core.http_file}/page/{$plugin_page_child.id}">{$plugin_page_child.title}</a></li>
    <!--{/foreach}-->
</ul>
<!--{/if}-->

このように書かれています。
これまでのおさらいもかねて、少しずつ説明します。

<!--{if $plugin_page_childs|smarty:nodefaults}-->は、<!--{if 変数}-->なので、「もし変数があったら」という意味になります。
そして、「$plugin_page_childs」とは、名前を見ればある程度わかると思うのであえて説明は省きますが、そのページの子ページが格納されている配列の変数です。
「$plugin_page_childs」は配列の変数なので、【基本編(7)】修飾子についてでちょっと触れたように、escapeを取り除くために、smarty:nodefaultsという修飾子をつける必要があります。

つまり、<!--{if $plugin_page_childs|smarty:nodefaults}-->は、「もし子ページがあったら」という意味になります。
さて、$plugin_page_childs配列の中身がどうなっているのかを簡単に表してみたので、ご覧ください。

子ページ $plugin_page_childs
child1 id child1
title 子ページ1のタイトル
child2 id child2
title 子ページ1のタイトル
child3 id child3
title 子ページ1のタイトル

$plugin_page_childsは多次元連想配列です。
子ページのIDが、まんま一次元目のキーになっています。
あるページの子ページに関する情報が$plugin_page_childsという多次元連想配列に入っていて、その子ページのIDがキーになって、更にその子ページの情報の分類名がキーになって、子ページに関する様々な情報=値が呼び出されます。
({$plugin_page_childs.子ページID}にはidやtitle以外のキーもあるのですが、今回はこれしか使わないのでこれだけで説明を続けます。)

では、$plugin_page_childsから値を取り出し、子ページの一覧を作ってみます。
そこで、foreachが使われています。
今回は仮に、child1ページとchild2ページとchild3ページのidとタイトルを取り出して、リストにして表示します。

一行ずつ説明します。

<!--{foreach from=$plugin_page_childs|smarty:nodefaults item='plugin_page_child'}-->

foreachのfromには、配列の変数を記入します。ここでも、「|smarty:nodefaults」をつけるのを忘れないでください。
itemには、わかりやすくするため、「plugin_page_child」と書いてあります。

次に、繰り返したい処理を書くのですが、ここで忘れてはならないのが、「$plugin_page_childs」は多次元配列であるということです。
多次元配列なので、ただ単純に{$plugin_page_child}と記述しても、IDやタイトルなどの欲しい値を取り出せません。
{$plugin_page_child}に、更にキーをつけてやる必要があります。

よって、

<li><a href="{$freo.core.http_file}/page/{$plugin_page_child.id}">{$plugin_page_child.title}</a></li>

このように記載します。
IDを取り出したい箇所には{$plugin_page_child.id}、タイトルを取り出したい箇所には{$plugin_page_child.title}と、それぞれキーをつけて記述しています。

ワンポイント

さっきちょろっと説明しましたが、{$plugin_page_childs}の一次元目のキーは子ページのIDになっているので、例えば
<!--{foreach from=$plugin_page_childs|smarty:nodefaults item='plugin_page_child' key='plugin_page_child_key'}-->
と書けば、foreachの中で{$plugin_page_child_key}と書いた時に子ページのIDを取り出すことができます。
その場合、繰り返したい表示としては、
<li><a href="{$freo.core.http_file}/page/{$plugin_page_child_key}">{$plugin_page_child.title}</a></li>
と書けばOKです。
ただ、わかりにくいのでデフォルトのままでOKな気がします。ただの余談です。

と まあこんな風に書くと、<li><a href="{$freo.core.http_file}/page/{$plugin_page_child.id}"> {$plugin_page_child.title}</a></li>がchild1ページとchild2ページと child3ページ用に書き換わった上で3回繰り返して表示されます。
これで子ページの一覧ができました。

ここまでは、とりあえず規模のちっちゃいforeachを説明しましたが、今度はちょっと規模のでっかいforeachを説明しようと思います。

エントリー記事の一覧を表示する(多次元連想配列をforeachで繰り返す)

エントリー記事の一覧表示画面でも、foerachが使われています。
やっていることは子ページの一覧と同様ですが、エントリーに関する情報ということで、配列に格納されている情報量がドドンと増えました。

まず、[freo/templates/internals/default/default.html]を開いて、79行目を見てください。

<!--{foreach from=$entries|smarty:nodefaults item='entry'}-->

ここから、エントリー記事を一覧表示するためのforeachが始まります。
このforeachの閉じ部分は、150行目にあります。
79行目~150行目までの間に、一件のエントリー記事をどのように表示するかがずららーっと書いてあるわけです。

また、79行目~150行目までの間で、様々な条件分岐だったり、また別のforeachが使われているので、パッと見ただけで頭が痛くなってきます。
でも大丈夫。ここまで読んで下さった方なら、一つ一つ見ていけば、きっと内容が理解できます、多分。

これだけだと不親切な気がするので、答え合わせだけ書いておきます。

<div class="entry">
    <h3><a href="{$freo設置URL+index.php}/view/{もしエントリーコードがあったらここから}{$エントリーコード}{そうじゃなければ}{$エントリーID}{/もしエントリーコードがあったらここまで}">{$エントリータイトル}</a></h3>
    <ul class="information">
        <li>{$エントリーの日時|日時整形するこんなふうに:'%Y/%m/%d %H:%M'}</li>
        <!--{もしこのエントリーIDのエントリーにカテゴリーがあったら}-->
        <li>カテゴリー:<!--{このエントリーのカテゴリーの繰り返しここから key='entry_category' item='entry_category' name='loop'}--><a href="{$freo設置URL+index.php}/category/{$エントリーのカテゴリーID}">{$カテゴリー名}</a><!--{もしこの繰り返しの最後のターンじゃなかったらここから}-->,&nbsp;<!--{もしこの繰り返しの最後のターンじゃなかったらここまで}--><!--{このエントリーのカテゴリーの繰り返しここまで}--></li>
        <!--{/if}-->
        <!--{もしこのエントリーIDのエントリーにタグがあったら}-->
        <li>タグ:<!--{このエントリーのタグの繰り返しここから item='entry_tag' name='loop'}--><a href="{$freo設置URL+index.php}/entry?tag={$このエントリーのタグをテキストで表示}">{$このエントリーのタグ}</a><!--{if もしこの繰り返しの最後のターンじゃなかったらここから}-->,&nbsp;<!--{もしこの繰り返しの最後のターンじゃなかったらここまで}--><!--{このエントリーのタグの繰り返しここまで}--></li>
        <!--{/if}-->
    </ul>
    <div class="content">
        <!--{もしこのエントリーの制限がユーザー限定かつ閲覧状況が記事を見られない状態だったらここから}-->
            <p class="attention">このエントリーは、登録ユーザーのみに公開されています。</p>
        <!--{またはこのエントリーの制限がグループ限定かつ閲覧状況が記事を見られない状態だったら}-->
            <p class="attention">このエントリーは、一部のグループのみに公開されています。</p>
        <!--{またはこのエントリーの制限がパスワード制限かつ閲覧状況が記事を見られない状態だったら}-->
            <p class="attention">このエントリーは、パスワードで認証した人のみに公開されています。</p>
        <!--{もしこのエントリーの制限がユーザー限定かつ閲覧状況が記事を見られない状態だったらここまで}-->
        <!--{もしエントリーに添付ファイルがあるかつエントリーイメージがあったらここから}-->
            <p><a href="{$freo設置URL}{$ファイル・ディレクトリ}entry_files/{$エントリーID}/{$エントリー添付ファイル名}"><img src="{$freo設置URL}{$ファイルディレクトリ}entry_images/{$エントリーID}/{$エントリーイメージ名}" alt="{$ファイルの説明|初期表示はエントリー添付ファイル名}" title="{$ファイルの説明|初期表示はエントリー添付ファイル名}" width="{$エントリーイメージの横幅}" height="{$エントリーイメージの高さ}" /></a></p>
        <!--{またはエントリーサムネイルがあったら}-->
            <p><a href="{$freo設置URL}{$ファイル・ディレクトリ}entry_files/{$エントリーID}/{$エントリー添付ファイル名}"><img src="{$freo設置URL}{$ファイルディレクトリ}entry_thumbnails/{$エントリーID}/{$エントリータイトル}" alt="{$ファイルの説明|初期表示はエントリー添付ファイル名}" title="{$ファイルの説明|初期表示はエントリー添付ファイル名}" width="{$エントリーサムネイルの横幅}" height="{$エントリーサムネイルの高さ}" /></a></p>
        <!--{またはエントリー添付ファイルがあって横幅と高さがあったら}-->
            <p><img src="{$freo設置URL}{$ファイルディレクトリ}entry_files/{$エントリーID}/{$エントリー添付ファイル名}" alt="{$ファイルの説明|初期表示はエントリー添付ファイル名}" title="{$ファイルの説明|初期表示はエントリー添付ファイル名}" width="{$エントリー添付ファイルの横幅}" height="{$エントリー添付ファイルの高さ}" /></p>
        <!--{またはエントリー添付ファイルがあったら}-->
            <p><a href="{$freo設置URL}{$ファイルディレクトリ}entry_files/{$エントリーID}/{$エントリー添付ファイル}">{$ファイルの説明|初期表示はエントリー添付ファイル名}</a></p>
        <!--{もしエントリーに添付ファイルがあるかつエントリーイメージがあったらここまで}-->
        <!--{もしエントリー本文の改ページされていない箇所があったらここから}-->
            {$エントリー本文の改ページされていない箇所}
        <!--{もしエントリー本文の改ページされていない箇所があったらここまで}-->
        <!--{もしエントリー本文の改ページされた部分があったらここから}-->
            <p><a href="{$freo設置URL+index.php}/view/{もしエントリーコードがあったらここから}{$エントリーコード}{そうじゃなければ}{$エントリーID}{もしエントリーコードがあったらここまで}?continue=1#continue" title="No.{$エントリーID}の続き">続きを読む</a></p>
        <!--{/if}-->
        <!--{もしエントリーの制限がパスワード制限かつパスワード認証をしていない状態かつログイン状況が管理者でないかつログイン状況が投稿者でなければ}-->
            <form action="{$freo設置URL+index.php}/view/{もしエントリーコードがあったらここから}{$エントリーコード}{そうじゃなければ}{$エントリーID}{もしエントリーコードがあったらここまで}" method="post">
                <fieldset>
                    <legend>認証フォーム</legend>
                    <dl>
                        <dt>パスワード</dt>
                            <dd><input type="text" name="entry[password]" size="30" value="" /></dd>
                    </dl>
                    <p><input type="submit" value="認証する" /></p>
                </fieldset>
            </form>
        <!--{/if}-->
        <!--{もしエントリーにオプションがついていれば}-->
        <dl>
            <!--{エントリーのオプションの繰り返しここから item='option'}-->
            <!--{もしエントリーのオプションIDが空欄じゃなければここから}-->
            <dt>{オプションの名前}</dt>
                <dd><!--{もしオプションのタイプが添付ファイルじゃなければここから}--><a href="{$freo.core.http_url}{$ファイルディレクトリ}entry_options/{$エントリーID}/{$オプションID}/{$エントリーのオプションIDが[$option.id]に登録されたファイル名}">{$エントリーのオプションIDが[$option.id]に登録されたファイル名}</a><!--{else}-->{$エントリーのオプションIDが[$option.id]に登録された情報を改行は改行として表示}<!--{/if}--></dd>
            <!--{もしエントリーのオプションIDが空欄じゃなければここまで}-->
            <!--{エントリーのオプションの繰り返しここまで}-->
        </dl>
        <!--{/if}-->
    </div>
    <ul class="link">
        <li><a href="{$freo設置URL+index.php}/view/{もしエントリーコードがあったらここから}{$エントリーコード}{そうじゃなければ}{$エントリーID}" title="No.{$エントリーID}の固定URL">この記事のURL</a></li>
        <!--{もしエントリーのコメントが受け付けないじゃなければここから}-->
        <li><a href="{$freo設置URL+index.php}/view/{もしエントリーコードがあったらここから}{$エントリーコード}{そうじゃなければ}{$エントリーID}#comment" title="No.{$エントリーID}のコメント">コメント({$このエントリーのコメント数})</a></li>
        <!--{もしエントリーのコメントが受け付けないじゃなければここまで}-->
        <!--{もしエントリーのトラックバックがうけつけないじゃなければここから}-->
        <li><a href="{$freo設置URL+index.php}/view/{if $entry.code}{$entry.code}{else}{$エントリーID}{/if}#trackback" title="No.{$エントリーID}のトラックバック">トラックバック({$plugin_trackback_counts[$entry.id]})</a></li>
        <!--{もしエントリーのトラックバックがうけつけないじゃなければここまで}-->
        <!--{もしログイン状況が管理者であるまたはログインしているユーザーIDエントリーの投稿ユーザーIDだったらここから}-->
        <li><a href="{$freo設置URL+index.php}/admin/entry_form?id={$エントリーID}"><img src="{$freo設置URL}images/icons/edit.png" alt="編集" title="編集" width="16" height="16" /></a></li>
        <!--{もしログイン状況が管理者であるまたはログインしているユーザーIDエントリーの投稿ユーザーIDだったらここまで}-->
    </ul>
</div>

ページ移動

関連エントリー

コメント

  • コメントはまだありません。

コメント登録

登録フォーム
名前
メールアドレス
URL
コメント
投稿キー(スパム対策に、投稿キー を半角で入力してください。)

ユーティリティ

新着コメント

Twitter

サイト内検索

ページ上部へ