【freo】兄妹ページプラグインの改造
兄妹ページ表示プラグインで、えー親子関係でいうところのすぐ上とすぐ下のおじおばの情報を連れてきたかったので。
想定ページ構造
- 祖父母
- おじ1
- おじ2
- 親
- 兄
- 俺
- 妹
- おじ3
※名称はてきとう
表示例
<ul>
<li><a href="おじ2URL">おじタイトル</a></li>
<li><a href="兄URL">兄タイトル</a></li>
<li>俺</li>
<li><a href="妹URL">妹</a></li>
<li><a href="おじ3URL">おじタイトル</a></li>
</ul>
追加するコード
データ取得部
- 拾ってくるのは、sort順で表示ページの
前後数値でプラマイ1の位置にあるおじおばのid, title
- 表示順が0 1 3とかで1を表示したら3はスルーする、中途半端に残念な仕様
- それ以外を拾う場合は、SELECT id,title のところを適当に変更
- 突っ込む箇所はassign直前でおk
- 例によって、フィルタと閲覧制限を基本的には無視(但しconditionはそのまま使用しているのである程度入るはず)
- 自分の環境で必要ないためにテストするつもりがないです
//■親の前後ページの情報を取得する
$ppages = array();
//親ページのidとsort番号取得
$stmt = $freo->pdo->prepare('SELECT pid, sort FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE id = :id AND approved = \'yes\' ORDER BY sort, id');
$stmt->bindValue(':id', $pid);
$flag = $stmt->execute();
if (!$flag) { freo_error($stmt->errorInfo()); }
if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$p = $data;
$sn = $p['sort'];
$pid = $p['pid'];
//ひとつ手前
$stmt = $freo->pdo->prepare('SELECT id,title FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE pid = :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' and ( sort = :sn ) ORDER BY sort, id');
$stmt->bindValue(':id', $pid);
$stmt->bindValue(':now1', date('Y-m-d H:i:s'));
$stmt->bindValue(':now2', date('Y-m-d H:i:s'));
$stmt->bindValue(':sn', $sn*1-1);
$flag = $stmt->execute();
if (!$flag) { freo_error($stmt->errorInfo()); }
if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$ppage['prev'] = $data;
}
//ひとつ後
$stmt = $freo->pdo->prepare('SELECT id,title FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE pid = :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' and ( sort = :sn ) ORDER BY sort, id');
$stmt->bindValue(':id', $pid);
$stmt->bindValue(':now1', date('Y-m-d H:i:s'));
$stmt->bindValue(':now2', date('Y-m-d H:i:s'));
$stmt->bindValue(':sn', $sn*1+1);
$flag = $stmt->execute();
if (!$flag) { freo_error($stmt->errorInfo()); }
if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$ppage['next'] = $data;
}
}
データ割り当て部
<ul>
<li><a href="おじ2URL">おじタイトル</a></li>
<li><a href="兄URL">兄タイトル</a></li>
<li>俺</li>
<li><a href="妹URL">妹</a></li>
<li><a href="おじ3URL">おじタイトル</a></li>
</ul>
追加するコード
データ取得部
- 拾ってくるのは、sort順で表示ページの
前後数値でプラマイ1の位置にあるおじおばのid, title- 表示順が0 1 3とかで1を表示したら3はスルーする、中途半端に残念な仕様
- それ以外を拾う場合は、SELECT id,title のところを適当に変更
- 突っ込む箇所はassign直前でおk
- 例によって、フィルタと閲覧制限を基本的には無視(但しconditionはそのまま使用しているのである程度入るはず)
- 自分の環境で必要ないためにテストするつもりがないです
//■親の前後ページの情報を取得する
$ppages = array();
//親ページのidとsort番号取得
$stmt = $freo->pdo->prepare('SELECT pid, sort FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE id = :id AND approved = \'yes\' ORDER BY sort, id');
$stmt->bindValue(':id', $pid);
$flag = $stmt->execute();
if (!$flag) { freo_error($stmt->errorInfo()); }
if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$p = $data;
$sn = $p['sort'];
$pid = $p['pid'];
//ひとつ手前
$stmt = $freo->pdo->prepare('SELECT id,title FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE pid = :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' and ( sort = :sn ) ORDER BY sort, id');
$stmt->bindValue(':id', $pid);
$stmt->bindValue(':now1', date('Y-m-d H:i:s'));
$stmt->bindValue(':now2', date('Y-m-d H:i:s'));
$stmt->bindValue(':sn', $sn*1-1);
$flag = $stmt->execute();
if (!$flag) { freo_error($stmt->errorInfo()); }
if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$ppage['prev'] = $data;
}
//ひとつ後
$stmt = $freo->pdo->prepare('SELECT id,title FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE pid = :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' and ( sort = :sn ) ORDER BY sort, id');
$stmt->bindValue(':id', $pid);
$stmt->bindValue(':now1', date('Y-m-d H:i:s'));
$stmt->bindValue(':now2', date('Y-m-d H:i:s'));
$stmt->bindValue(':sn', $sn*1+1);
$flag = $stmt->execute();
if (!$flag) { freo_error($stmt->errorInfo()); }
if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$ppage['next'] = $data;
}
}
データ割り当て部
assignの中に(前行への区切りカンマを忘れずに)。
'plugin_page_sibling_parent' => $ppage
呼び出し元テンプレート側
- $plugin_page_sibling_parent云々てのが追加部分。
- 以下のサンプルは、「前後の章立て分を釣れてくる」的なイメージでアンカーを貼るタイプのもの。
- なので、前後移動として決め打ちで「伯父のパス/01」を付与しています。
- 01とかじゃなくてソートのケツよこせよって場合はSQLの充足が必要
- unionてつかえたっけ? 使えなかったら純粋にorder by sort descでデータセットの再発行して云々
<!--{if false} ■兄妹ページ表示プラグイン {/if}{if $plugin_page_siblings2|smarty:nodefaults}-->
<div id="pagination"><ul>
<!--{if $plugin_page_sibling_parent.prev}--><li><a href="{$freo.core.http_file}/page/{$plugin_page_sibling_parent.prev.id}/01">{$plugin_page_sibling_parent.prev.title}≪</a></li><!--{/if} -->
<!--{foreach from=$plugin_page_siblings2|smarty:nodefaults item='plugin_page_sibling' name='page_sib'}-->
<li><!--{if $page.id != $plugin_page_sibling.id}--><a href="{$freo.core.http_file}/page/{$plugin_page_sibling.id}">{$smarty.foreach.page_sib.iteration|string_format:'%02d'}</a><!--{else}--><span>{$smarty.foreach.page_sib.iteration|string_format:'%02d'}</span><!--{/if}--></li>
<!--{/foreach}-->
<!--{if $plugin_page_sibling_parent.next}--><li><a href="{$freo.core.http_file}/page/{$plugin_page_sibling_parent.next.id}/01">≫{$plugin_page_sibling_parent.next.title}</a></li><!--{/if}-->
</ul></div>
<!--{/if}{if false} □兄妹ページ表示プラグイン {/if}-->