「Mediawiki 擴展標籤/Categorytree」修訂間的差異
跳至導覽
跳至搜尋
(→(一)資料表) |
|||
| (未顯示同一使用者於中間所作的 7 次修訂) | |||
| 第3行: | 第3行: | ||
Mediawiki 的分類樹狀結構藏在以下兩個資料表中:wiki_categorylinks,wiki_page 。 | Mediawiki 的分類樹狀結構藏在以下兩個資料表中:wiki_categorylinks,wiki_page 。 | ||
以「福留子孫」 wiki 為例,其根部目錄有一個分類「教育」。 | 以「福留子孫」 wiki 為例,其根部目錄有一個分類「教育」。 | ||
| − | select cl_to,cl_type, | + | 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='教育' | + | 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 mode='pages'>某分類</categorytree> |
| − | + | 即可得到以「某分類」之下的完整分類樹,並以 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 頁中寫下:
找不到分類某分類
即可得到以「某分類」之下的完整分類樹,並以 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;}
}