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コンテンツ
- まず、xugj_blockを呼び、phpソースファイルと関数・引数を宣言して指定することで、Template変数にアサインします。
下記タグの引数指定: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
- 続いて、アサインされた変数を参照して表示する部分のタグを、次のように書きます。
本文も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)