Entry

Tag: smarty

【覚書】【Smarty】修飾子を用いて後演算しassignする

こつこつとfreoのテンプレートを作成しておりまして、page_allの分岐のために↑のようなのを使いたかったのでメモ。

コード

{math equation="x - 1" x=$page.id|explode:'/'|@count assign=lv}

経緯

ページIDをベースに階層レベルを取りたくて、スラでexplodeして配列数取ればいいじゃん!てなってから先が長かった。
以下、「絶対にプラグインは作らないぞ」という意志の元による格闘の履歴である。

  • {php}でエントリやページの変数を使用したくてもそれらはassignされてるヤツだから実行タイミングが異なるよHAHAHAがわかるまでが長かった
  • smartyでexplode出来ねえのかよクソがまでも長かった(マニュアル見てた)
  • freoでexplode準備されてるじゃん!
  • (Smartyマニュアルに戻る)countねえのかよクソが
  • replaceで/を半角スペースに置換して単語数にするか…精度落ちるけど…
  • ところで最初は0にしたいんだけどおいこれ演算どうすりゃいいんだエラーになるぞ
  • (ぐぐりまくる)
  • あっ @count でcount関数互換てえっなにその例外処理みたいな@なにこれえっ
  • とりあえずexplodeにもどす
  • あっ同じようなことQ&Aサイトに投げてる人がいる!
  • math…だと…
  • ていうかこれでassignてどうすりゃええねん
  • あっ引数ついてるまじかやった!!!

1時間くらいやってましたが、最初の数を妥協して1にすりゃよかったんじゃんね…

【freo】ページ一括表示プラグインにて、階層レベルで自動的に表示を1ファイルで振り分ける( 11/27修正)

なにがなんにゃらって感じのタイトルですが、自分メモがてら

11/27追記:ちょいちょい変えました。

呼び出し元 ページ。

<!--{if false} ■ページ一括表示プラグイン {/if}{if $page_alls|smarty:nodefaults}-->
  <!--{assign var="pid" value=$page.id}-->
  {include file='plugins/page_all/【ファイル名】.html'}
<!--{/if}{if false} □ページ一括表示プラグイン {/if}-->

呼び出し先 plugins/page_all/【ファイル名】.html

<!--{if false}
■page_allプラグイン用テンプレート
  ・階層レベルごとに、表示内容を分岐する
{/if}-->

<!--{math equation="x - 1" x=$pid|explode:'/'|@count assign='lv'}-->
<!--{foreach from=$page_alls|smarty:nodefaults item='page_all' }{if $page_all.pid == $pid}-->

  <!--{if $lv == 0}{if false}◆分岐0:h4{/if}-->
    <h4><a href="{$freo.core.http_file}/page/{$page_all.id}">{$page_all.title}</a></h4>

  <!--{elseif $lv == 1}{if false}◆分岐1:h5{/if}-->
    <h5><a href="{$freo.core.http_file}/page/{$page_all.id}">{$page_all.title}</a></h5>
      <div><p>{$page_all.text|smarty:nodefaults}</p></div>

  <!--{elseif $lv == 2}{if false}◆分岐2:dt {/if}-->
    <!--{php}if (!$flag):{/php}--><dl><!--{php}endif; $flag=1;{/php}-->
    <dt>{$page_all.title}</dt>

  <!--{elseif $lv == 3}{if false}◆分岐3:li インデックス番号で{/if}-->
    <!--{php}if (!$flag):{/php}--><dd><ul><!--{php}endif; $flag=1; $idx+=1;{/php}-->
    <li><a href="{$freo.core.http_file}/page/{$page_all.id}">{php}echo sprintf('%02d',$idx);{/php}</a></li>

  <!--{/if}--><!--{if false}◇分岐終了{/if}-->

  <!--{if false}■分岐後処理 ――――――{/if}-->
    <!--{assign var="pid" value=$page_all.id}-->{include file='plugins/page_all/【ファイル名】.html'}<!--{assign var="pid" value=$page_all.pid}-->
  <!--{if false}□分岐後処理 ――――――{/if}-->

<!--{/if}{/foreach}-->

<!--{if false}■後始末(レベルが戻ってきたあとのタグとじ) ――――――――{/if}-->
<!--{    if $lv ==3}{php}if ($flag) :{/php}--></ul></dd><!--{php}endif;{/php}-->
<!--{elseif $lv ==2}{php}if ($flag) :{/php}--></dl><!--{php}endif;{/php}-->
<!--{/if}-->

で、何がしたかったのよ

だって再帰処理じゃん。
Smartyにselect caseがあればよかったのにね…。

使用用途はえーと、わたしの場合はTRPGのリプレイの章立てなんで、小説とかみたいなののドリルダウン?
あとは本文のチラ見せ機能。このへんは実運用時には「続きを読む(pagebreak)」を最大限活用して、実ページではデフォルト続きを読ませるも一緒表示にしてーとかナントカになる予定。事によったらtrancateも視野に入れるけど、あの手のは検索後にはいいけどそうじゃないときは個人的無駄機能なのでなー。

基本方針は元のpage_allプラグインの書き方に準じて、階層スタックとして lv てsmarty用変数を設けた程度。
タグ閉じでelseしてませんね。していいと思います。こんどやろう。

仰々しくzip配布とかするつもりはないので、使ってみたい場合はどうぞご自由に。
サポートはおそらくありませんが。

追記

…foreachの前に都度mathで階層取ったほうがシンプルな気がしてきた…

というわけで色々手を入れました。インデックスを自動で取ったりもしたので(foreachのindex使って「ですよね!」ってなったりしながら)、割と修正先の見える形でパターンが取れたかな、と。

【freo】page_associatesに入ってくる情報

ついて回ってくる割に、全然情報ないですよねこのassign。
値引っ張るときに小さくハマったので備忘録。

[page_id]
 ├ [group][group_id] = true  ← あれば
 ├ [filter][filter_id] = true     ←┘
 ├ [option][option_id] = text

こうなってるところは固定テキスト。それ以外はDBの値。

smarty側でオプションID固定で引っ張るときはこういう塩梅(page_allが入ってるのは、丁度こいつから出そうとしててハマったからです)。

<!--{if $page_all_associates[$page_all.id].option.出すオプションID}-->
{$page_all_associates[$page_all.id].option.出すオプションID}
<!--{/if}-->

ifは必要に応じて。予め値を便利な状態に設定しといてifなしの方が、勿論ちいさく処理は軽いはず。

ハッシュのキーって配列ぽく[]でやってくのとクラスぽく . でつなげるのとどっちがいんですかね。
変数使うときは [] じゃないとダメだけど、その辺を見た目上の切り分けっぽく使ってていいのかなー。

Pagination

  • Newer
  • Older
  • Page
  • 1

Utility

Calendar

11 2024.12 01
SMTWTFS
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

Tag Crouds