LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Wiki

Smarty小ネタ

テンプレートに他のテンプレートをインクルードしているときの処理分け anchor.png

たとえば XCL で、legacy_search_form.html は、検索ブロックの「高度な検索」を押しても表示されますが、検索結果ページ(legacy_search_results.html)の検索結果一覧の下にも表示されます。つまり、legacy_search_form.html が主役の場合と、そうでない場合が想定されます。
ここで、legacy_search_form.html が主役のときは、<{$smarty.const._SEARCH}>(「検索」のテキスト定数です) を h1 に。そうでないときは、h2 扱いにしたいとしたとします。
こういうときは、legacy_search_results.html 側に少し細工をします。legacy_search_form.html をインクルードしている部分を探して、caller という属性値をセットします。

<{include file=db:legacy_search_form.html caller="legacy_search_results"}>

で、legacy_search_form.html 側には caller という判定材料が渡されるので、単純には下記のように条件を割り振れます。

<{if $caller == 'legacy_search_results'}>
  <h2><{$smarty.const._SEARCH}></h2>
<{else}>
  <h1><{$smarty.const._SEARCH}></h1>
<{/if}>

基本的には上記で終わりなんですが、もうちょと凝ってみると以下のようなことができます。

Page Top

呼び出し側(legacy_search_results.html) anchor.png

 <{capture name="searchResultshtml"}>
 <{foreach item=module from=$searchResults}>
   <h3><{$module.name}></h3>
   <!-- start results item loop -->
   <table class="outer" summary="search results">
   <{foreach item=result from=$module.results}>
     <tr class="<{cycle values='odd,even'}>">
       <th style="width:21px;"><img src="<{$result.image}>" alt="<{$module.name}>" title="<{$module.name}>" /></th>
       <td><a href="<{$result.link}>"><{$result.title}></a><br />
         <small>
         <{if $result.uid > 0}>
           <a href="<{$smarty.const.XOOPS_URL}>/userinfo.php?uid=<{$result.uid|xoops_escape}>"><{$result.uid|xoops_user:uname}></a>
         <{/if}>
         (<{$result.time|xoops_formattimestampGMT:l}>)
         </small>
       </td>
     </tr>
   <{/foreach}>
   </table>
   <!-- end results item loop -->
 
   <{if $module.has_more}>
     <p><a href="<{$smarty.const.XOOPS_URL}>/search.php?action=showall&amp;query=<{$actionForm->get('query')|xoops_escape:link}>&amp;mid=<{$module.mid}>&amp;andor=<{$actionForm->get('andor')|xoops_escape}>"><{$smarty.const._MD_LEGACY_LANG_SHOW_ALL}></a></p>
   <{/if}>
 <{/foreach}>
 <{/capture}>
 
 <{if trim($smarty.capture.searchResultshtml)}>
   <h1><{$smarty.const._SR_SEARCHRESULTS}></h1>
   <h2><{$smarty.const._SR_SEARCHRESULTS_BY_MODULES}></h2>
   <{$smarty.capture.searchResultshtml}>
   <{include file=db:legacy_search_form.html caller="legacy_search_results"}>
 <{else}>
   <{include file=db:legacy_search_form.html caller="legacy_search_results_no_match"}>
 <{/if}>
Page Top

呼び出され側(legacy_search_form.html) anchor.png

 <{capture name="searchHasError"}>
   <{if $actionForm->hasError()}>
   <ul class="errorMsg">
     <{foreach item=message from=$actionForm->getErrorMessages()}>
       <li><{$message|xoops_escape}></li>
     <{/foreach}>
   </ul>
   <{/if}>
 <{/capture}>
 
 <{if $caller == 'legacy_search_results'}>
   <{$smarty.capture.searchHasError}>
   <h2><{$smarty.const._SEARCH}></h2>
 <{elseif $caller == 'legacy_search_results_no_match'}>
   <h1><{$smarty.const._SR_SEARCHRESULTS}></h1>
   <{$smarty.capture.searchHasError}>
   <p><strong><{$smarty.const._SR_NOMATCH}></strong></p>
   <h2><{$smarty.const._SEARCH}></h2>
 <{else}>
   <h1><{$smarty.const._SEARCH}></h1>
 <{/if}>
 
 <form action="<{$smarty.const.XOOPS_URL}>/search.php" method="get">
   <{xoops_input type=hidden name=action value=results}>
   <table class="outer" cellspacing="1" width="100%">
     <tr>
       <th class="head"><label for="legacy_xoopsform_query"><{$smarty.const._SR_KEYWORDS}></label></th>
       <td class="<{cycle values="odd,even"}>">
         <{xoops_input type=text name=query size=30 maxlength=255 value=$actionForm->get('query')}>
       </td>
     </tr>
     <tr>
       <th class="head"><label for="legacy_xoopsform_srtype"><{$smarty.const._SR_TYPE}></label></th>
       <td class="<{cycle values="odd,even"}>">
         <select name="andor" id="legacy_xoopsform_srtype">
           <option id="andor_AND" value="AND" <{if $actionForm->get('andor') == 'AND'}>selected="selected"<{/if}>><{$smarty.const._SR_ALL}></option>
           <option id="andor_OR" value="OR" <{if $actionForm->get('andor') == 'OR'}>selected="selected"<{/if}>><{$smarty.const._SR_ANY}></option>
           <option id="andor_exact" value="exact" <{if $actionForm->get('andor') == 'exact'}>selected="selected"<{/if}>><{$smarty.const._SR_EXACT}></option>
         </select>
       </td>
     </tr>
     <tr>
       <th class="head"><{$smarty.const._SR_SEARCHIN}></th>
       <td class="<{cycle values="odd,even"}>">
         <{foreach item=module from=$moduleArr}>
           <label><input type="checkbox" name="mids[]" value="<{$module.mid|xoops_escape:plain}>" <{if in_array($module.mid, $selectedMidArr)}>checked<{/if}>><{$module.name|xoops_escape}></label>
         <{/foreach}>
       </td>
     </tr>
     <tr>
       <th class="head"><{$smarty.const._SR_SEARCHRULE}></th>
       <td class="<{cycle values="odd,even"}>"><{$searchRuleMessage}></td>
     </tr>
     <tr>
       <td class="head"></td>
       <td class="<{cycle values="odd,even"}>">
         <input type="submit" value="<{$smarty.const._SR_SEARCH}>" />
       </td>
     </tr>
   </table>
 </form>

ポイントは $smarty.get でここが検索結果画面なのかどうかを判定しているところと、 caller を2種類作っているところですが、 主役のときは $smarty.const._SEARCH が、h1 です。でも、検索結果がなかった場合、「該当なし」を表示して、かつ、h1 をあてがいます。検索結果がある場合は、legacy_search_results.html が主役になるので、h1 記述はそちらのテンプレートに任せて、こちらは h2 だけかえします。


トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 6602, today: 1, yesterday: 2
初版日時: 2008-01-08 (火) 02:23:25
最終更新: 2014-01-13 (月) 22:06:02 (JST) (1261d) by jidaikobo
Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities