Entry

Tag: freo

【覚書】【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_recentlyの改造 (07/04追記)

(久しぶりのネタがこんなんであれですけど)

思いついた時に思いついたようにせっせとfreoのカスタマイズ準備(だけ)を進めているのですが、新着ページ表示にね、やっぱり親の情報とかつけてやりたいなと。カテゴリ的な意味合いで。
しかしfreoのページ構造として、自分の直接の親はわかっても、2世代以上手前のところは再帰して行かないとわからないわけです。というか、裏ワザとかあるのかなとか思ったらなかったんです(topic_pathプラグインを眺めてため息)。

というわけで、こりゃ諦めてプラグイン作成だなや…というつぶやきでした。それだけです。備忘録です。

その前にfreoのバージョン上げもしななー

17:49追記
舌の根もかわかぬうちにあっさりできました。ありがとうtopic_path。
荒削りの状態ですけど、とりあえずこれで $割り当てられたやつ.parent に、親ページのタイトルが配列で返ってきます。
ぶっこむのは、diplay.page_recentlyうんちゃらのsmarty変数割り当て直前くらいが、わかりやすくていいかと。

  //■追加■ページの親共を配列で取得
  foreach ($page_keys as $page) {
    $page_parents = array();
    if (!$pages[$page]['pid']) { continue; }
    $p['pid']=$pages[$page]['pid'];

    //以下、topicpathからのパクリ
    while ($p['pid']) {
      //ページ取得
      $stmt = $freo->pdo->prepare('SELECT id, pid, title FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE id = :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2)');
      $stmt->bindValue(':id',   $p['pid']);
      $stmt->bindValue(':now1', date('Y-m-d H:i:s'));
      $stmt->bindValue(':now2', date('Y-m-d H:i:s'));
      $flag = $stmt->execute();
      if (!$flag) { freo_error($stmt->errorInfo()); }

      if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $p = $data;
      } else {
        return;
      }

      //ページフィルター取得
      $fs = freo_filter_page('user', array($p['id']));    $f  = $fs[$p['id']];
      if ($f) $p['title'] = str_replace('[$title]', $p['title'], $freo->config['page']['filter_title']);

      //ページ保護データ取得
      $ss = freo_security_page('user', array($p['id']));  $s  = $ss[$p['id']];
      if ($s) $p['title'] = str_replace('[$title]', $page['title'], $freo->config['page']['restriction_title']);

      array_unshift($page_parents, $p['title']);
    }
    $pages[$page]['parent'] = $page_parents;
  
  }//foreach

07/04追記
元の方では、こんなかんじで拾ってます。

<!--{if false} ↓親カテを3つ目まで表示 {/if}{if $plugin_page_recently.parent}{foreach from=$plugin_page_recently.parent|smarty:nodefaults item=prnt name=prn}{if $smarty.foreach.prn.index < 3 }-->
<span class="page_name">{$prnt}</span>
<!--{/if}{/foreach}{else}-->

【freo】page_all で、続きを読むと本文分離

まさかfreoネタが人様のお役に立っていたとは
こんにちは。放置しすぎの私です。

放置ついでに、久しぶりにfreoいじって手を入れた箇所をメモ。
page_allプラグイン(これ名前なんて云いましたっけ)で、本文と続きを読むーの部分を本体のpage同様分けようという話。

    $pages = array();
    while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $pages[$data['id']] = $data;
    //本文と続きを読む を分けたい    ↓page/default.phpでやってることそのまま。
      list($excerpt, $more) = freo_divide($data['text']);
        $pages[$data['id']]['excerpt']   = $excerpt;
        $pages[$data['id']]['more']      = $more;
    //ここまで

    }

ぶっこむ場所は、最初にpageに値拾ってくるところ。30行目くらい。
当たり前といえば当たり前の処理なんですけど、なんでこれデフォでやってくれてないのかなー…。

フィルタとか閲覧制限のことは何一つ考えてないので、後半部分でなんとかしないとダメかも。

【freo】兄妹ページプラグインの改造

兄妹ページ表示プラグインで、えー親子関係でいうところのすぐ上とすぐ下のおじおばの情報を連れてきたかったので。

【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なしの方が、勿論ちいさく処理は軽いはず。

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

【freo】必要な内部情報をどうやって探すのかのメモ

freoしか書くことねぇのかよ、とか云われそうな感じですが、今いじってる最中なので備忘録としての側面が非常に強いのです。
以降、ほんとに大したこと書いてないです。

Pagination

  • Newer
  • Older
  • Page
  • 1

Utility

Calendar

03 2024.04 05
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 - - - -

Tag Crouds