picoのカテゴリ内の記事を新しい順に並べる

文書IDを使って疑似的に作成日の降順に並べる

picoモジュールでカテゴリ内の記事を一覧すると、表示順(weightフィールド)の小さい順に並びます。並び順をコントロールするのはweightフィールドのみであり、投稿の新しい/古い順などで並べようと思うと、ソースコードに手を入れざるを得ません。

当サイトでは、ほとんどのカテゴリで「投稿日の新しい順」に並べたいというニーズがあります。これをweightで実現しようと思うと、新しい、つまり後から投稿するコンテンツにより小さい番号を割り当てる必要があります。

どうしたものか……とテーブル定義を眺めていたら、weightフィールドは負の値を受け入れることに気づきました。

CREATE TABLE contents (
  ......
  weight smallint(5) NOT NULL default 0,

weightは表示順を制御するフィールドなので、符号なし(unsigned)で定義されていると思い込んでいましたが、weightには-32768から32767までの整数が入ります。ということは、-1という表示順もオーケーで、かつ0よりも先に表示されるということ。試してみるとその通りに動きます。

最初は作成日フィールドの値を-100000くらいの大きな数で割って、新しい文書ほど大きな負の数をweightに割り当てることを考えましたが、同じ日にアップした複数の記事が同じ数字になってしまい、うまくありません。そこで、文書ごとに割り当てられるcontent_idに-1を掛けてweightに格納することにしました。これであれば新しい文書ほど大きなマイナスが、つまり小さなweightが割り当てられます。

ワンファイル・ハック
この変更もプリロードとデリゲートを利用したワンファイル・ハックで可能です。 まず、文書の挿入・更新に割り込むためにデリゲートを追加します。

class Docs_TagsPreload extends XCube_ActionFilter
{
    function 
preBlockFilter()
    {
        
$this->mRoot->mDelegateManager->add'ModuleClass.Pico.Contentman.InsertSuccess' , array( &$this 'hook' ) ) ;
        
$this->mRoot->mDelegateManager->add'ModuleClass.Pico.Contentman.UpdateSuccess' , array( &$this 'hook' ) ) ;
    }

続けてコールバック関数を定義します。初期値つまりゼロのままであればcontent_idの符号を反転させた数字をweightにセットします。ゼロ以外であれば何もしません。テーブルハンドラを拡張して云々するのが面倒だったのでSQL文を直接発行しています。


    
function hook$mydirname $content_id $cat_data $ret_uri4html )
    {
        
$contentObj = new PicoContent$mydirname $content_id ) ;

        
// Set weight = -(context_id) to list newest first.
        
if( '0' == $contentObj->data['weight'] ) {
            
$db $this->mController->mDB;
            
$sql 'UPDATE '.$db->prefix($mydirname.'_contents').' SET weight = '.$content_id.' * -1 WHERE content_id = '.$content_id;
            if( !
$ret $db->queryF$sql ) ) {
                
$errInfo __FILE__." \n".__LINE__." \n".$db->logger->dumpAll();
                
error_log$errInfo $this->mRoot->mContext->getXoopsConfig('adminmail') );
            }
        }


友達に伝える
作成: 2013/9/16 by:webmaster
更新: 2013/9/16 by:webmaster


picoで、サブカテゴリーを含めた最新文書を表示する

Tech

ユーザーの新規登録画面に初期値をセットする

新規ユーザー登録(無料)

  • メールニュース[週刊起-動線]の購読
  • コメントなどの投稿
  • ココロミの利用
  • 一部コンテンツの購読

ログイン

コメント

タグ(キーワード)