XUGJ_blockを使って、Weblinks登録リンクから Myブックマークを作成してみました。

1、目的・概要

ココログからMT形式データでd3blogにインポートしたブログに、 良くあるブログのサイドメニューのような 「Myブックマーク」を付けたかったのだけれど、 Weblinksへ登録されたリンクデータから「category」抽出するブロックが見あたらず、ネット検索でも出て来ませんでした。
それならXUGJ_blockを使って、自分でphpソースを編集して作るしかないと考えたワケです。

しかし、picoも使い始めて間もないし、XUGJ_blockを使うのも始めてです。 ここに書いた方法は、Weblinksオリジナルの「weblinks_top.php」を改造した冗長すぎるロジックで、 「とりあえずやってみました」 と という稚拙なレベルに過ぎませんが、、どうぞご勘弁を。 もし、もっと簡単・スマートな方法などありましたら、ぜひご教示下さい。

2、ソースコード

 weblinks_top2.php

以下のコードを、「/xoops_url/modules/weblinks/blocks/weblinks_top2.php」 として保存します。 ファイル名と関数名をオリジナルのものから変更した理由は、モジュールアップデートの際などにおいても上書きされる危険性を避けること等です。

2008/7/17修正版:リンク取得sql文の変更
<?php
// $Id: weblinks_top2.php,v 1.4 2008-06-28 naao Exp $

// 2008-06-28 naao
// for XUGJ_BLOCK , added $option1[7] : catergory id

// 2005-05-20 K.OHWADA
// unlimited when $options[2] = 0 

// 2005-01-20 K.OHWADA
// add $options 3:new days 4:popular 5:max width 6:default width
// add $url, $votes, $comments

// 2004-12-05 K.OHWADA
// write fair, delete unnecessary comments

// 2004-10-20 K.OHWADA
// newred.gif -> new.gif
// add update_image

// 2004/08/10 K.OHWADA
// enable to install this module two or more. 
// not use class weblinksLink
// add block rating 
// add new mark, popular mark

// ***************************************************************************
// * Function: b_weblinks_top_show
// * Input   : $options[0] = date for the most recent links
// *                    hits for the most popular links
// *           $block['content'] = The optional above content
// *           $options[1]   = How many reviews are displayes
// * Output  : Returns the desired most recent or most popular links
// ***************************************************************************

//=========================================================
// block top
// use class weblinksLink
// 2004/01/14 K.OHWADA
//=========================================================

//---------------------------------------------------------
// $options
// [0] order (time_update/hits/rating)
// [1] number of display links (10)
// [2] max length of title (30)
//       when 0, unlimited
// [3] days to show new icon (7)
// [4] hits to show popular icon (0)
// [5] max width of banner image (50)
//       when 0, not show
// [6] default width of banner image (50)
//       when 0, use original size
// [7] category id (0)
//---------------------------------------------------------

// --- change function name ---
function b_weblinks_top_show2($options) 
{
	global $xoopsDB;

// --- change function name ---    
    $MODULE_DIRNAME = 'weblinks';

	$weblinks_url = XOOPS_URL."/modules/".$MODULE_DIRNAME;
	$table_link   = $xoopsDB->prefix("{$MODULE_DIRNAME}_link");
	$tbl_category = $xoopsDB->prefix("{$MODULE_DIRNAME}_category");
	$tbl_catlink  = $xoopsDB->prefix("{$MODULE_DIRNAME}_catlink");

	$myts =& MyTextSanitizer::getInstance();

	$block = array();
	$block['module_url']    = $weblinks_url;
	$block['lang_hits']     = _MB_WEBLINKS_HITS;
	$block['lang_rating']   = _MB_WEBLINKS_RATING;
	$block['lang_votes']    = _MB_WEBLINKS_VOTES;
	$block['lang_comments'] = _MB_WEBLINKS_COMMENTS;

	$order     = $options[0];
	$limit     = $options[1];
	$max_title = $options[2];
	$newdays   = $options[3];
	$popular   = $options[4];
	$max_width = $options[5];
	$width_default = $options[6];
	$cid = empty( $options[7] ) ? 0 : $options[7] ;

	// cidのタイトル
		$sql = "SELECT title FROM $tbl_category WHERE cid = $cid";
		$re = $xoopsDB->query($sql);
			$category_row = $xoopsDB->fetchArray($re);
			$cname = $category_row[title];
		$block['cname'] = $cname;
		$block['cid'] = $cid;
		
	// DBからcidの合致するlid読み込み
		$sql = "SELECT * FROM $tbl_catlink WHERE cid = $cid";
		$result_cats = $xoopsDB->query($sql);
		while( $row_cat = $xoopsDB->fetchArray($result_cats) )
		{
			$cat_lids[] = $row_cat['lid'];
		}

	$cat_lids = array_map( 'intval' , $cat_lids ) ;
	$whr_lids= empty( $cat_lids ) ? '1' : 'lid IN ('.implode(',',$cat_lids).')' ;

	$sql    = "SELECT * FROM $table_link WHERE $whr_lids ORDER BY $order DESC";
	$result = $xoopsDB->query($sql, $limit, 0);
	
	$count = 0;
    while( $row = $xoopsDB->fetchArray($result) )
    {
		$link = array();

		$show_banner  = 0;
		$show_new     = 0;
		$show_update  = 0;
		$show_popular = 0;

		$lid    = $row['lid'];
		$title  = $row['title'];
		$url    = $row['url'];
		$banner = $row['banner'];
		$width  = $row['width'];
		$height = $row['height'];
		$hits   = $row['hits'];
		$rating = $row['rating'];
		$votes  = $row['votes'];
		$comments = $row['comments'];
		$time_create = $row['time_create'];
		$time_update = $row['time_update'];
		$description = $row['description'];

// unlimited when $options[2] = 0 
		if ( ($max_title > 0) && (strlen( $title ) > $max_title) )
		{
			$title = strip_tags( $title );

// for multibyte environment
			if (function_exists('mb_strimwidth'))
			{
				$title = mb_strimwidth( $title, 0, $max_title, " ..." );
			}
			else
			{
				$title = substr( $title, 0, $max_title )." ...";
			}
		}

// banner image
		if ( ($max_width > 0) && $banner )
		{
			$show_banner = 1;

			if ($width > $max_width)
			{
				$width = $max_width;
			}

			if (($width == 0) && ($width_default > 0))
			{
				$width = $width_default;
			}
		}

// new & update image

		if ( $newdays > 0)
		{
			$startdate = (time()-(86400 * $newdays));

			if ( $startdate < $time_create ) 
			{
				$show_new = 1;
			}
			elseif ( $startdate < $time_update )
			{
				$show_update = 1;
			}
		}

// popular image
		if ($popular > 0)
		{
			if ( $row['hits'] >= $popular )
			{
				$show_popular = 1;
			}
		}

		$link['show_banner'] = $show_banner;
		$link['show_new']    = $show_new;
		$link['show_update'] = $show_update;
		$link['show_pop']    = $show_popular;
		$link['width']       = $width;

		$link['id']       = $lid;
		$link['hits']     = $hits;
		$link['votes']    = $votes;
		$link['comments'] = $comments;
		$link['url']      = htmlspecialchars($url,    ENT_QUOTES);
		$link['banner']   = htmlspecialchars($banner, ENT_QUOTES);
		$link['date']     = formatTimestamp($time_update,'s');
		$link['rates']    = sprintf("%.1f",$rating);
		$link['title']    = $myts->makeTboxData4Show( $title );
		$link['description']    = $description;

// old style
		if ($order == "rating")
		{
			$link['hits']  = $link['rates'];
		}

		$block['links'][] = $link;
    }
	return $block;
}

?>


3、表示用picoコンテンツ

  1. まず、xugj_blockを呼び、phpソースファイルと関数・引数を宣言して指定することで、Template変数にアサインします。

  2.  下記タグの引数指定:opt=の、最後の「2」は、抽出するカテゴリ番号です。 ここで指定したカテゴリのデータが抽出されます。
<{xugj_block file="modules/weblinks/blocks/weblinks_top2.php" func="b_weblinks_top_show2" opt="hits,20,50,20,0,50,50,2" item="block"}>

なお、引数を念のため解説しておきますと・・
// [0] order (time_update/hits/rating) : 表示優先順位: 更新順/ヒット数順/評価値順 
// [1] number of display links (10) : 表示するリンク数。
// [2] max length of title (30) : タイトルの最大文字数。「0」なら無制限
// [3] days to show new icon (7) : 「New」アイコンの表示日数
// [4] hits to show popular icon (0) : 「Popular」アイコンを表示すすヒット数
// [5] max width of banner image (50) : バナーイメージ最大幅。 「0」なら非表示
// [6] default width of banner image (50) : バナーイメージ標準幅。 「0」なら元サイズ表示
// [7] category id (0) : 抽出するカテゴリ番号 ←今回追加したOption

  1. 続いて、アサインされた変数を参照して表示する部分のタグを、次のように書きます。
 本文もTemplate変数に載せましたので、 表示部で下記のように書くと、「title」属性でマウスを近づけると本文概要が表示されます。
 (080630:リンクのクリックで、WeblinksのHit数カウントされるように修正しました。)
<H3>*<a href="<{$xoops_url}>/modules/weblinks/viewcat.php?cid=<{$block.cid}>"><{$block.cname}></a>*</H3>
<{foreach item=entry from=$block.links}>
    <a href="<{$xoops_url}>/modules/weblinks/visit.php?lid=<{$entry.id}>" title="<{$entry.description}>" target="_blank"><{$entry.title}></a><br />
<{/foreach}>
これだけでは1つのカテゴリ分しか表示されませんが、 上記2つのセットを必要数並べれば、カテゴリ毎に仕分けされたブックマークリストになります。
これで、picoの「本文フィルター」 の 「Smarty(Xoops Tpl)」 にチェックを入れて保存すると、 例えば次のようの表示されます。



4、ブロックへの表示

この後は、picoのブロックでこのコンテンツを指定して好きな場所に表示したり、 picoの他のページにタグを貼ったりして、ご自由にどうぞ。

5、XUGJ_block参考サイト


xugj_blockプラグインの活用法(Wander Wonder xFiled)