【freo】【freoTips】【プラグイン系TIPS】テンプレートを変えるだけでニュースをタグごとに表示する方法
- 2012/08/05 02:43
- ニュースプラグイン
- 73
当サイトで配布しているニュースリンクプラグインのリンクをタグごとに表示する方法です。
ニュースプラグインでは、タグをつけることができます。
これを使って、ニュースを分類表示することができます。
たとえば、ニュースを「ジャンルA」「ジャンルB」「ジャンルC」の3つに分類したいとします。
ニュース登録時に、タグ部分に「ジャンルA」または「ジャンルB」または「ジャンルC」と登録します。
デフォルトだと、ニュースは登録ID順(昇順か降順を選ぶことはできます)に表示されます。
このままだとジャンルがごちゃ混ぜで表示されてしまうので、ジャンルごとに表示してみます。
[freo/templates/plugins/news/default.html]をエディタで開きます。
28行目~71行目を変更します。
デフォルトではこうなってます↓
<table id="news">
<thead>
<tr>
<th>日時</th>
<th>カテゴリー</th>
<th>タイトル</th>
<th>コメント</th>
<th>ファイル</th>
<th>タグ</th>
</tr>
</thead>
<tfoot>
<tr>
<th>日時</th>
<th>カテゴリー</th>
<th>タイトル</th>
<th>コメント</th>
<th>ファイル</th>
<th>タグ</th>
</tr>
</tfoot>
<tbody>
<!--{foreach from=$plugin_newses|smarty:nodefaults item='plugin_news'}-->
<tr>
<td><a href="{$freo.core.http_file}/news/view/{$plugin_news.id}">{$plugin_news.datetime|date_format:'%Y/%m/%d'}</a></td>
<td><a href="{$freo.core.http_file}/news?category_id={$plugin_news.category_id}">{$plugin_news_categories[$plugin_news.category_id].name}</a></td>
<td><!--{if $plugin_news.url}--><a href="{$plugin_news.url}">{$plugin_news.title}</a><!--{else}-->{$plugin_news.title}<!--{/if}--></td>
<td>{$plugin_news.text|smarty:nodefaults|strip_tags|mb_truncate:30:'...'|escape}</td>
<td>
<!--{if $plugin_news_files[$plugin_news.id].file}-->
<img src="{$freo.core.http_url}{$smarty.const.FREO_FILE_DIR}plugins/news_files/{$plugin_news.id}/{$plugin_news_files[$plugin_news.id].file}" alt="{$plugin_news.title}" />
<!--{/if}-->
</td>
<td>
<!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}-->
<a href="{$freo.core.http_file}/news?tag={$plugin_news_tag|smarty:nodefaults|escape:'url'}">{$plugin_news_tag}</a><!--{if !$smarty.foreach.loop.last}-->, <!--{/if}-->
<!--{/foreach}-->
</td>
</tr>
<!--{/foreach}-->
</tbody>
</table>
これを、下記のように変更します。
<h2>ジャンルA</h2> <dl class="news"> <!--{foreach from=$plugin_newses|smarty:nodefaults item='plugin_news'}--> <!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}--> <!--{if $plugin_news_tag == 'ジャンルA'}--> <dt>{$plugin_news.datetime|date_format:'%Y/%m/%d'}</dt> <dd> <!--{if $plugin_news.url}--><a href="{$plugin_news.url}">{$plugin_news.title}</a><!--{else}-->{$plugin_news.title}<!--{/if}--> <!--{if $plugin_news.text}-->{$plugin_news.text}<!--{/if}--> <br /> 【タグ:<!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}--><a href="{$freo.core.http_file}/news?tag={$plugin_news_tag|smarty:nodefaults|escape:'url'}">{$plugin_news_tag}</a><!--{if !$smarty.foreach.loop.last}-->, <!--{/if}--><!--{/foreach}-->】 <!--{if $freo.user.authority == 'root' or $freo.user.authority == 'author'}--><a href="{$freo.core.http_file}/news/admin_form?id={$plugin_news.id}"><img src="{$freo.core.http_url}images/icons/edit.png" alt="編集" title="編集" width="16" height="16" /></a><!--{/if}--> </dd> <!--{/if}--> <!--{/foreach}--> <!--{/foreach}--> </dl> <h2>ジャンルB</h2> <dl class="news"> <!--{foreach from=$plugin_newses|smarty:nodefaults item='plugin_news'}--> <!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}--> <!--{if $plugin_news_tag == 'ジャンルA'}--> <dt>{$plugin_news.datetime|date_format:'%Y/%m/%d'}</dt> <dd> <!--{if $plugin_news.url}--><a href="{$plugin_news.url}">{$plugin_news.title}</a><!--{else}-->{$plugin_news.title}<!--{/if}--> <!--{if $plugin_news.text}-->{$plugin_news.text}<!--{/if}--> <br /> 【タグ:<!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}--><a href="{$freo.core.http_file}/news?tag={$plugin_news_tag|smarty:nodefaults|escape:'url'}">{$plugin_news_tag}</a><!--{if !$smarty.foreach.loop.last}-->, <!--{/if}--><!--{/foreach}-->】 <!--{if $freo.user.authority == 'root' or $freo.user.authority == 'author'}--><a href="{$freo.core.http_file}/news/admin_form?id={$plugin_news.id}"><img src="{$freo.core.http_url}images/icons/edit.png" alt="編集" title="編集" width="16" height="16" /></a><!--{/if}--> </dd> <!--{/if}--> <!--{/foreach}--> <!--{/foreach}--> </dl> <h2>ジャンルC</h2> <dl class="news"> <!--{foreach from=$plugin_newses|smarty:nodefaults item='plugin_news'}--> <!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}--> <!--{if $plugin_news_tag == 'ジャンルA'}--> <dt>{$plugin_news.datetime|date_format:'%Y/%m/%d'}</dt> <dd> <!--{if $plugin_news.url}--><a href="{$plugin_news.url}">{$plugin_news.title}</a><!--{else}-->{$plugin_news.title}<!--{/if}--> <!--{if $plugin_news.text}-->{$plugin_news.text}<!--{/if}--> <br /> 【タグ:<!--{foreach from=$plugin_news_tags[$plugin_news.id]|smarty:nodefaults item='plugin_news_tag' name='loop'}--><a href="{$freo.core.http_file}/news?tag={$plugin_news_tag|smarty:nodefaults|escape:'url'}">{$plugin_news_tag}</a><!--{if !$smarty.foreach.loop.last}-->, <!--{/if}--><!--{/foreach}-->】 <!--{if $freo.user.authority == 'root' or $freo.user.authority == 'author'}--><a href="{$freo.core.http_file}/news/admin_form?id={$plugin_news.id}"><img src="{$freo.core.http_url}images/icons/edit.png" alt="編集" title="編集" width="16" height="16" /></a><!--{/if}--> </dd> <!--{/if}--> <!--{/foreach}--> <!--{/foreach}--> </dl>
つまりはこんな感じです↓
<dl class="news">
<!--{plugin_newsesの配列の繰り返しここから}-->
<!--{個別ニュース記事に登録されているタグの配列の繰り返しここから}-->
<!--{もしタグに'ジャンルA'が登録されてたらここから}-->
~省略~
<!--{もしタグに「ジャンルA」が登録されてたらここまで}-->
<!--{個別ニュース記事に登録されているタグの配列の繰り返しここまで}-->
<!--{plugin_newsesの配列の繰り返しここまで}-->
</dl>
これが下線部に変更を加えた上で(ジャンルBとジャンルCに変更してます)3回繰り返されているというわけです。
ただし、タグが重複して登録されていた場合、複数のジャンルにダブって表示されてしまうので注意が必要です。
たとえば、一件のニュース記事に「ジャンルA」と「ジャンルB」のどちらのタグも登録されていた場合、「ジャンルA」の表示欄と「ジャンルB」の表示欄のどちらにもリンク記事が表示されてしまいます。
ですので、分類表示の条件として使用したいタグは重複しないように登録することをオススメします。
ちなみに、ページやデフォルト画面に表示したい場合も、↑のソースを利用できます。
2014/01/04 タグ部分の不具合を修正しました。大変失礼いたしました。
未花 月葉
お世話になっております。
現在、サイトをCMS構築するにあたり、色々と参考にさせて頂いていただいたり、プラグインを使わせて頂いています。
本当に有難うございます!
その際に少し気になったのですが、ご提示されているソースでバージョンの問題もあるのか、
終了宣言が足りなかったりと記述ミスがちらほらあるようなので、
大変失礼ながらも一応、ご連絡を申し上げたくコメントさせて頂いております。
上記のソースだと、5・30・55行目の<!--{foreach from=$plugin_newses|smarty:nodefaults item='plugin_news'}-->と
20・45・70行目の<!--{/foreach}-->があると、タグごとの表示にはならないのと、
21・46・71行目の<!--{/if}-->のあとに<!--{/foreach}-->と終了宣言がされていないため、エラーが出てしまいます。
前者はコピー&ペーストした時の消し忘れかと思われるのですが、後者の終了宣言等のエラーが他のソースでも見受けられることがあるので、一応、ご報告までに。
けれどミツさまのプラグインとソースのお陰で、理想通りの表示ができそうです。
重ね重ねお礼申し上げます。
これからもちょくちょく参考にサイトにお伺いさせて頂きたく思いますので、陰ながら応援しております。
本当に有難うございました!