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内に独自テーブルを作成するのとか、そこからの呼び出し及び無害化だとか、今の私には考えられません。次の次のステップでしょうか。「誰か作って欲しいな」な~んて、他力本願になってきている私です。

2009年11月07日:H_プラグインephemera

Comments

コメント (0)

Add coments

このアイテムは閲覧専用です。コメントの投稿、投票はできません。