picoとd3pipesの組み合わせで、更新された情報を「新着情報」として自動で表示する仕組みにしています。
このとき、投稿者がpicoのページの内容を変更した後、承認される前に、「新着情報」に反映されてしまいます。
これは、d3pipesがpicoの情報を吸い上げている部分(trust_path\modules\d3pipes\joints\block\D3pipesBlockPicolist.class.php)が、picoのblockの部分、「b_pico_list_show」を利用してデータを引っ張っているからです。(trust_path\modules\pico\blocks\list.php)
そのとき、「更新時間(modified_time)」順で並べられます。

また、picoのしくみでは投稿者が投稿した時点で、「更新時間(modified_time)」が更新されます。
また、その時間は投稿者によって変更することができません。

投稿者の投稿したデータが承認される前には、「新着情報」として表示されてほしくない。
二通り考えました。
「新着情報」で吸い上げるデータは「作成時間」に基づいてリスト化する。その場合、承認者が承認後に「作成時間」を変更することによって「新着情報」に反映されるというしくみになります。
もう1つは承認待ち中はリストに含めない。何らかの方法で「承認中」というフラグを立てます。

後者の方法で対応しました。(前者だと更新者側でいろいろとルール決めをしなくてはならなさそうだったので)

picoだけで解決する方法
trust_path\modules\pico\class\PicoModelContent.class.php の L.68あたり

function getContents4assign( $whr_append = ‘1’ , $order = ‘weight’ , $offset = 0 , $limit = 100 , $return_prohibited_also = false )
{
ツꀀ$db =& Database::getInstance() ;

ツꀀ$sql = “SELECT content_id FROM “.$db->prefix($this->mydirname.”_contents”).” o WHERE ($whr_append) AND approval ORDER BY $order” ;
ツꀀif( ! $ors = $db->query( $sql ) ) {
ツꀀツꀀif( $GLOBALS[‘xoopsUser’]->isAdmin() ) echo $db->logger->dumpQueries() ;
ツꀀツꀀexit ;
ツꀀ}

ツꀀ$ret = array() ;
ツꀀ$waiting = $offset ;
ツꀀwhile( list( $content_id ) = $db->fetchRow( $ors ) ) {
ツꀀツꀀif( sizeof( $ret ) >= $limit ) break ;
ツꀀツꀀ$objTemp = new PicoContent( $this->mydirname , $content_id ) ;
ツꀀツꀀif( $return_prohibited_also || $objTemp->data[‘can_read’] ) {
ツꀀツꀀツꀀif( — $waiting < 0 ) {
ツꀀツꀀツꀀツꀀ$ret[ $content_id ] = $objTemp->getData4html() ;
ツꀀツꀀツꀀ}
ツꀀツꀀ}
ツꀀツꀀunset( $objTemp ) ;
ツꀀ}

ツꀀreturn $ret ;
}

を追加。この、「getContents4assign」が使われている範囲が気になるところです。

picoとd3pipesのあわせ技

1.trust_path\modules\pico\blocks\list.php の L86あたり

ツꀀ// module config (not overridden yet)
ツꀀ$module_handler =& xoops_gethandler(‘module’);
ツꀀ$module =& $module_handler->getByDirname($mydirname);
ツꀀ$config_handler =& xoops_gethandler(‘config’);
ツꀀ$configs = $config_handler->getConfigList( $module->mid() ) ;

ツꀀ// constpref
ツꀀ$constpref = ‘_MB_’ . strtoupper( $mydirname ) ;

ツꀀ// make an array named ‘block’
ツꀀ$block = array(
ツꀀツꀀ’mytrustdirname’ => $mytrustdirname ,
ツꀀツꀀ’mydirname’ => $mydirname ,
ツꀀツꀀ’mod_url’ => XOOPS_URL.’/modules/’.$mydirname ,
ツꀀツꀀ’mod_imageurl’ => XOOPS_URL.’/modules/’.$mydirname.’/’.$configs[‘images_dir’] ,
ツꀀツꀀ’mod_config’ => $configs ,
ツꀀツꀀ’contents’ => $contents4assign ,
ツꀀツꀀ’display_body’ => $display_body ,
ツꀀツꀀ’lang_category’ => constant($constpref.’_CATEGORY’) ,
ツꀀツꀀ’lang_topcategory’ => constant($constpref.’_TOPCATEGORY’) ,
ツꀀツꀀ’subject_waiting’ => $subject_waiting ,
ツꀀ) ;

の1行を追加。本当は「1」とか「0」とか「true」とか入れるように書いて処理した方がスマートだと思うんだけど、とりあえず。

2.trust_path\modules\d3pipes\joints\block\D3pipesBlockPicolist.class.phpのL.49あたり

ツꀀfunction reassign( $data )
ツꀀ{
ツꀀツꀀ$entries = array() ;
ツꀀツꀀforeach( $data[‘contents’] as $content ) {
ツꀀツꀀツꀀ$entry = array(
ツꀀツꀀツꀀツꀀ’pubtime’ => $content[‘modified_time’] , // timestamp
ツꀀツꀀツꀀツꀀ’link’ => $data[‘mod_url’].’/’.$content[‘link’] ,
ツꀀツꀀツꀀツꀀ’headline’ => $content[‘subject_raw’] ,
ツꀀツꀀツꀀツꀀ’category’ => $this->unhtmlspecialchars( $content[‘cat_title’] ) ,
ツꀀツꀀツꀀツꀀ’description’ => $this->unhtmlspecialchars( $content[‘body’] ) ,
ツꀀツꀀツꀀツꀀ’content_encoded’ => $this->unhtmlspecialchars( $content[‘body’] ) ,
ツꀀツꀀツꀀツꀀ’ef’ => $content[‘ef’] ,
ツꀀツꀀツꀀツꀀ’tags’ => $content[‘tags’] ,
ツꀀツꀀツꀀツꀀ’subject_waiting’ => ‘subject=a’.$content[‘subject_waiting’].’a’ ,

ツꀀツꀀツꀀ) ;
ツꀀツꀀツꀀ$entry[‘fingerprint’] = $entry[‘link’] ;
ツꀀツꀀツꀀ$entries[] = $entry ;
ツꀀツꀀ}

ツꀀツꀀreturn $entries ;
ツꀀ}

ちょっとかっこ悪いけど・・・・・・。

3.d3pipesのパイプの処理で、「mbregexによるエントリ抽出」で、オプションに「subject=aa」と入れる。

つまり、承認待ちだったら、「subject_waiting」に何か入ってて、「subject=aa」じゃなくなるから、抽出されないという方法です。ちょっと強引。

1のときに、subject_waitingに何か入ってたら「true」とかにして、2のときに「waiting=true」とか書かせるほうがスマート?しかし、10件ともこの条件にヒットした場合、「新着」から情報がすべて消えてしまう・・・。

もっと他にやり方ありそうなんだけども、何かいい案があったら教えてください!