Mediawiki 擴展標籤/Categorytree:修訂版本之間的差異

出自六年制學程
跳轉到: 導覽搜尋
(一)資料表
 
(未顯示同用戶所作出之7次版本)
第 3 行: 第 3 行:
 
Mediawiki 的分類樹狀結構藏在以下兩個資料表中:wiki_categorylinks,wiki_page 。
 
Mediawiki 的分類樹狀結構藏在以下兩個資料表中:wiki_categorylinks,wiki_page 。
 
以「福留子孫」 wiki 為例,其根部目錄有一個分類「教育」。
 
以「福留子孫」 wiki 為例,其根部目錄有一個分類「教育」。
  select cl_to,cl_type,b.page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育'
+
  select cl_to,cl_type,page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育' order by cl_type desc
  
 
會得到「教育」分類下的所有子分類和所有共筆頁。
 
會得到「教育」分類下的所有子分類和所有共筆頁。
  
  select cl_to,cl_type,b.page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育' && cl_type='subcat'
+
  select cl_to,cl_type,b.page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育' && cl_type='subcat'
  
 
會得到「教育」分類下的所有子分類。計有:教師、教育財政、終身學習等三個子分類。
 
會得到「教育」分類下的所有子分類。計有:教師、教育財政、終身學習等三個子分類。
第 18 行: 第 18 行:
 
====(二)外掛目標====
 
====(二)外掛目標====
 
在 wiki 頁中寫下:
 
在 wiki 頁中寫下:
  <categorytree mode='pages'>某目錄</categorytree>
+
  <categorytree mode='pages'>某分類</categorytree>
  
即可得到以「某目錄」之下的完整分類樹,並以 details 和 summary 組織起來。
+
即可得到以「某分類」之下的完整分類樹,並以 details 和 summary 組織起來。
 +
 
 +
====(三)由 categorytree 標籤到輸出 details 結構====
 +
<pre>$wgExtensionFunctions[] = 'wfCategorytree';
 +
function categorytree(){
 +
global $wgParser;
 +
$wgParser->setHook('categorytree','renderCategorytree');
 +
}
 +
function renderCategorytree($input,$args){
 +
// 因為常數是全域的,不能在函式內定義,所以不能載入 constantWiki.php
 +
global $wgDBserver,$wgDBuser,$wgDBpassword,$wgDBname;
 +
$connect=mysqli_connect($wgDBserver,$wgDBuser,$wgDBpassword,$wgDBname);
 +
if(mysqli_connect_errno($connect)){echo "Failed to connect to MySQL:".mysqli_connect_error();}
 +
mysqli_query($connect,"set names utf8");
 +
用 $input 去得知根部分類是哪一個
 +
用 (isset($args['mode'])?$args['mode']:'預設值') 去偵知 mode 屬性設了什麼
 +
 +
$sql="select 查詢";
 +
$result=mysqli_query($connect,$sql);
 +
while($row=mysqli_fetch_assoc($result)){
 +
 +
}
 +
 +
return "以 details 和 summary 組成的長字串";
 +
}
 +
// 以下函式在本外掛中用不上
 +
function getOption(&$input,$name){ // /mi為多行不分大小寫,找到第一個$name=
 +
if(preg_match("/^\s*$name\s*=\s*(.*)/mi",$input,$matches)) {
 +
return $matches[1];
 +
}else{return false;}
 +
}</pre>

2025年2月6日 (四) 23:45的最新修訂版本

(一)資料表

Mediawiki 的分類樹狀結構藏在以下兩個資料表中:wiki_categorylinks,wiki_page 。 以「福留子孫」 wiki 為例,其根部目錄有一個分類「教育」。

select cl_to,cl_type,page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育'  order by cl_type desc

會得到「教育」分類下的所有子分類和所有共筆頁。

select cl_to,cl_type,b.page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育' && cl_type='subcat'

會得到「教育」分類下的所有子分類。計有:教師、教育財政、終身學習等三個子分類。

select cl_to,cl_type,b.page_title from wiki_categorylinks a left join wiki_page b on a.cl_from=b.page_id where cl_to='教育' && cl_type='page'

會得到「教育」分類下的所有共筆頁。

再對「教育」分類下的「教育財政」再進行遞迴處理,一層層處理下去即可得到整個分類樹。

(二)外掛目標

在 wiki 頁中寫下:

<categorytree mode='pages'>某分類</categorytree>

即可得到以「某分類」之下的完整分類樹,並以 details 和 summary 組織起來。

(三)由 categorytree 標籤到輸出 details 結構

$wgExtensionFunctions[] = 'wfCategorytree';
function categorytree(){
	global $wgParser;
	$wgParser->setHook('categorytree','renderCategorytree');
}
function renderCategorytree($input,$args){
	// 因為常數是全域的,不能在函式內定義,所以不能載入 constantWiki.php
	global $wgDBserver,$wgDBuser,$wgDBpassword,$wgDBname;
	$connect=mysqli_connect($wgDBserver,$wgDBuser,$wgDBpassword,$wgDBname);
	if(mysqli_connect_errno($connect)){echo "Failed to connect to MySQL:".mysqli_connect_error();}
	mysqli_query($connect,"set names utf8");
	用 $input 去得知根部分類是哪一個
	用 (isset($args['mode'])?$args['mode']:'預設值') 去偵知 mode 屬性設了什麼
	…
	$sql="select 查詢";
	$result=mysqli_query($connect,$sql);
	while($row=mysqli_fetch_assoc($result)){
		…
	}
	…
	return "以 details 和 summary 組成的長字串";
}
// 以下函式在本外掛中用不上
function getOption(&$input,$name){	// /mi為多行不分大小寫,找到第一個$name=
	if(preg_match("/^\s*$name\s*=\s*(.*)/mi",$input,$matches)) {
		return $matches[1];
	}else{return false;}
}