NP_znMCListのHTML出力を自由にしたい
「1ブログに複数、例えばカテゴリがABCの3種あったとして、Bのカテゴリに属するサブカテゴリのみをリスト表示したい」というのが、今回の私の希望です。
そして、サブカテゴリをリスト表示する3大プラグインは次のみっつで良かったと思います。
- NP_ContentsList
- NP_BlogMenu
- NP_znMCList
けれど、このいずれも私の希望をかなえる機能は持ち合わせていません。全てのカテゴリを展開してしまいます。
となると、後は自分でどげんかせんといかん訳です。どぎゃんかせにゃならんのは判っとうばってん、わたしがそぎゃん能力ば持っとう訳、無かじゃなかねっ。
あ~う~。
上段2つは、リスト表示する際のHTMLを自身でカスタマイズできる処が魅力です。けれど、ソースを眺めている内に私のキャパシティを軽くオーバーしてしまいました。Functionが複数phpファイルにまたがってるぅ(>_<);;
ま、機能が多いのだから、ソースが多くなるのも当然ですね。
そこで、比較的コード量の少なめな「NP_znMCList」を利用させて戴く事にしたのでした。
またPHPとNucleusのお勉強タイムです。
そして、何とか形になってきたのが以下のソースです。ポイントは、
- マルチサブカテゴリに対応しつつ、カテゴリを指定(複数も可)できる
- HTML記載部分を一Functionにまとめ、HTML編集が容易になる様試みた
- 親カテゴリ(標準)、子カテゴリ(サブ)、孫カテゴリ(サブ)でCSS変更可能
NP_znMCListが標準で搭載していたアイコン表示機能は削っちゃいました。作者さんすみません。私の少ないキャパシティでソースを理解する為に、やりたい事のみに機能を絞った結果です。
■使い方
<%znMCList(dispCatid, itemCount, tagType)%>
- dispCatid // Null or Catid:表示するカテゴリID(「/」で区切る)
- itemCount // Null or 0:件数表示なし, (a or b:件数表示モード quantityMode) / (0 or 1:零件表示 emptyDispFlag)
- tempType // リストタイプを選択する(ul,dl,ol,div)
ex.) <%znMCList(62/64,,)%>
→ カテゴリidが62/64のカテゴリ・サブカテゴリを、<ul>でリスト表示する
ex.) <%znMCList(,b/1,div)%>
→ そのブログのカテゴリ・サブカテゴリを、bタイプのリンク表示方法で/0件でもお構い無しに、<hn>でリスト表示する
<?php
class NP_znMCList extends NucleusPlugin
{
function getName() { return 'znMCList'; }
function getURL() { return 'http://wa.otesei.com/NP_znMCList'; }
function getVersion() { return '0.05'; }
function getDescription() { return 'NP_MultipleCategories '._ZNMCLIST1.''; }
function supportsFeature($w) { return ($w == 'SqlTablePrefix') ? 1 : 0; }
function getAuthor()
{
$this->languageInclude();
return ''._ZNMCLIST2.'';
}
function languageInclude()
{
// include language file for this plugin
$language = ereg_replace( '[\\|/]', '', getLanguageName());
$incFile = (file_exists($this->getDirectory().$language.'.php')) ? $language : 'english';
include_once($this->getDirectory().$incFile.'.php');
$this->language = $incFile;
}
//
//
//
function doSKinVar()
{
global $blog, $CONF, $manager, $archive, $archivelist, $DIR_SKINS;
list($skintype, $dispCatid, $itemCount, $tagType) = func_get_args();
/*
$dispCatid // Null or Catid:表示するカテゴリID(「/」で区切る)
$itemCount // Null or 0:件数表示なし, (a or b:件数表示モード quantityMode) / (0 or 1:零件表示 emptyDispFlag)
$tempType // リストタイプを選択する(ul,dl,ol,div)
*/
if ($blog) $b =& $blog; else $b =& $manager->getBlog($CONF['DefaultBlog']);
$this->timestamp = mysqldate($b->getCorrectTime());
$blogid = $b->getID();
switch ($skinType)
{
case 'archivelist':
$this->extra = array(($CONF['URLMode'] == 'pathinfo') ? $CONF['ArchivesKey'] : 'archivelist' => $blogid);
break;
case 'archive':
$this->extra = array(($CONF['URLMode'] == 'pathinfo') ? $CONF['ArchiveKey'] : 'archive' => $archive);
break;
default:
}
if ($dispCatid)
{
$dispCategory = str_replace('/',',',$dispCatid);
$dispCategory = preg_replace('/[^0-9,]*\,?$/','',$dispCategory);
$dispCategory = " And catid IN (".$dispCategory.")";
}
$this->emptyDispFlag = 0;
if ($itemCount)
{
list($this->quantityMode, $this->emptyDispFlag) = explode('/',$itemCount,2);
}
$sql_str = "SELECT * FROM ".sql_table('category')." WHERE cblog=". $blogid . $dispCategory ." ORDER BY cname";
$qid_cat = sql_query($sql_str);
echo $this->dispHTMLcode($qid_cat, 0, $tagType);
}
function childSubCat($parentid, $level, $tagType)
{
global $CONF;
$sql_str = "SELECT * FROM ".sql_table('plug_multiple_categories_sub')." WHERE " ;
$sql_str .= ( ($level == 0) ? "catid=".$parentid." AND parentid=0" : "parentid=".$parentid )." ORDER BY ordid";
$qid_scat = sql_query($sql_str);
$level++;
return $this->dispHTMLcode($qid_scat, $level, $tagType);
}
function getCatNumberOfBelonging($catid)
{
$sql_str = 'SELECT * FROM '.sql_table("item").' i LEFT JOIN '.
sql_table("plug_multiple_categories").' m ON i.inumber=m.item_id WHERE '.
'(i.icat = '.$catid.' OR m.categories REGEXP "(^|,)'.intval($catid).'(,|$)") AND i.idraft=0 AND itime<'.$this->timestamp;
$qid_cat = sql_query($sql_str);
return mysql_num_rows($qid_cat);
}
function getSubCatNumberOfBelonging($scatid)
{
$sql_str = 'SELECT * FROM '.sql_table("item").' i, '.sql_table("plug_multiple_categories").' m WHERE '.
'm.subcategories REGEXP "(^|,)'.intval($scatid).'(,|$)" AND m.item_id=i.inumber AND i.idraft=0 AND itime<'.$this->timestamp;
$qid_scat = sql_query($sql_str);
return mysql_num_rows($qid_scat);
}
function dispHTMLcode($data, $level, $tagType)
{
$str_parent = "";
$str_child = "";
$tagList = $this->getHTMLtags($tagType);
if ($level == 0) $str_parent .= $tagList["header"][$level];
while ($row_ = mysql_fetch_object($data))
{
$extra = $this->extra;
if (($lvl = $level) > 2) $lvl = 2;
if ($level == 0)
{
$rowid = $row_->catid;
$titlename = $row_->cname;
$quantity = $this->getCatNumberOfBelonging($rowid);
}
else
{
$rowid = $row_->scatid;
$titlename = $row_->sname;
$quantity = $this->getSubCatNumberOfBelonging($rowid);
$extra['subcatid'] = $rowid;
}
$link_url = createCategoryLink($row_->catid, $extra);
if ($this->quantityMode == a)
{
$quantity = '<a href="<%link_url%>"> ('.$quantity.')</a>';
}
elseif ($this->quantityMode == b)
{
$quantity = ' ('.$quantity.')';
}
$tagList = $this->getHTMLtags($tagType);
$codeList = array('rowid'=>$rowid, 'titlename'=>$titlename, 'quantity'=>$quantity, 'link_url'=>$link_url, 'level'=>$level);
foreach ($codeList as $key=>$value)
{
$tagList["list1"][$lvl] = str_replace("<%$key%>",$codeList[$key],$tagList["list1"][$lvl]);
}
if ($this->emptyDispFlag || $quantity)
{
$str_parent .= $tagList["list1"][$lvl] . $tagList["option"];
$str_child = $this->childSubCat($rowid, $level, $tagType);
if ($str_child) $str_parent .= $tagList["header"][$lvl] . $str_child . $tagList["footer"][$lvl];
$str_parent .= $tagList["list2"][$lvl];
}
}
if ($level == 0) $str_parent .= $tagList["footer"][$level];
return $str_parent;
}
function getHTMLtags ($tagType)
{
switch (str_replace('"','',$tagType))
{
case "dl":
$tagType = array (
'header' => array
(
'<dl class="znmcl>', // [0]main
'<dt class="znmcl>', // [1]cat
'<dt class="znmcl>' // [2]sub
),
'list1' => array
(
'<dd class="level_<%level%> subid<%rowid%>"><a href="<%link_url%>" title="<%titlename%>"><%titlename%>',
'<dd>,
'<dd>'
),
'list2' => array
(
'</dd>',
'</dd>',
'</dd>'
),
'footer' => array
(
'</dl>',
'</dt>',
'</dt>'
),
'original' => ''
);
break;
case "ol":
break;
case "div":
$tagType = array (
'header' => array
(
'<div>',
'<div>',
'<div>'
),
'list1' => array
(
'<h3 class="level_<%level%>">■<a href="<%link_url%>" title="<%titlename%>"><%titlename%></a></h3>',
'<h4 class="level_<%level%>">▲<a href="<%link_url%>" title="<%titlename%>"><%titlename%></a></h4>',
'<h5 class="level_<%level%>">●<a href="<%link_url%>" title="<%titlename%>"><%titlename%></a></h5>'
),
'list2' => array
(
'',
'',
''
),
'footer' => array
(
'</div>',
'</div>',
'</div>'
),
'original' => ''
);
break;
default:// include "ul":
$tagType = array (
'header' => array
(
'<ul class="znmcl_0">', // [0]main
'<ul class="znmcl_1">', // [1]cat
'<ul class="znmcl_2">' // [2]sub
),
'list1' => array
(
'<li class="level_<%level%>"><a href="<%link_url%>" title="<%titlename%>">■<%titlename%>',
'<li class="level_<%level%>"><a href="<%link_url%>" title="<%titlename%>">▲<%titlename%>',
'<li class="level_<%level%>"><a href="<%link_url%>" title="<%titlename%>">●<%titlename%>'
),
'list2' => array
(
'</li>',
'</li>',
'</li>'
),
'footer' => array
(
'</ul>',
'</ul>',
'</ul>'
),
'original' => ''
);
break;
}
return $tagType;
}
}
HTMLの部分は、作り込みが適当です。本当はここをContentsListやBlogMenuの様に管理画面の<form>で編集できる様にしたいのだけど・・。
MySQL内に独自テーブルを作成するのとか、そこからの呼び出し及び無害化だとか、今の私には考えられません。次の次のステップでしょうか。「誰か作って欲しいな」な~んて、他力本願になってきている私です。

Comments
コメント (0)
Add coments