我的 wiki 文章包含指向特定数据集的链接。我想强制这些链接是唯一的(因为没有人可以使用另一个页面中存在的链接创建一个新页面。)我已经为这个扩展编写了大部分代码。我创建了一个表“unique_external_links”,将 url 存储为索引和 URL 所在的页面 id。
这是我写的部分代码:
$wgHooks['ParserFirstCallInit'][] = 'UniqueURLSetupParserFunction';
$wgHooks['LoadExtensionSchemaUpdates'][] = 'fnExternalLinksDBHook';
// Allow translation of the parser function name
$wgExtensionMessagesFiles['UniqueUrl'] = dirname( __FILE__ ) . '/UniqueUrl.i18n.php';
// Tell MediaWiki that the parser function exists.
function UniqueURLSetupParserFunction( &$parser ) {
$parser->setFunctionHook( 'example', 'UniqueURLParserFunction' );
return true;
}
function UniqueURLParserFunction( $parser, $param1 = '', $param2 = '' ) {
// The input parameters are wikitext with templates expanded.
// The output should be wikitext too.
global $wgRequest, $wgOut;
$return_url = $wgRequest->getRequestURL();
$pid = $param2;
$param1 = trim($param1);
$url_pattern = '/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/';
$match = preg_match($url_pattern, $param1);
if (!$match) {
// return ERROR not a valid URL!
}
$patterns = array('/^(https?:\/\/)/', '/\/$/');
$replace = array('','');
$url = preg_replace($patterns, $replace, $param1);
if (empty($param2)) { // creating a new page
try {
$dbw = wfGetDB( DB_MASTER );
$res = $dbw->insert('unique_external_links',
array('link_url' => $url , 'page_id' => $pid));
} catch(Exception $e) {
// return ERROR page with this link already exists!
}
} else { //Trying to edit existing page
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select(
'unique_external_links',
array( 'link_url' ),
'link_url = "' .$url.'" AND page_id = "' .$pid.'"'
);
if ($dbr->numRows($res) == 0) {
try {
$dbw = wfGetDB( DB_MASTER );
$res = $dbw->insert('unique_external_links',
array('link_url' => $url , 'page_id' => $pid));
} catch(Exception $e) {
//return ERROR Dataset Already Exists
$response = $wgRequest -> response();
$response -> header('Location: '.$return_url);
return $return_url;
}
}else {
//just editing page, not changing link, all is good
return $param1;
}
}
return $param1;
}
首先,我为草率的代码道歉,真的只是在没有任何扩展经验的情况下很快就将其拍打在一起......正如你所看到的那样,我在某些地方有评论 //return ERROR 我想阻止媒体 wiki 保存如果这些条件之一为真,则页面。我不想保存,而是想将用户返回到编辑页面,并显示一条消息,告诉他们他们提供的链接有问题。
有任何想法吗?我环顾四周,但找不到任何类似的东西,我认为这是因为我真的不知道要问什么问题。我知道有像“ArticleSave”这样的钩子,但我不知道如何将它与解析器结合使用。
任何帮助都会很棒!即使它告诉我要完全重新做我所做的,因为它完全错了哈哈。
编辑:我通过在我想返回错误的地方抛出 MWExceptions 来解决这个问题。然后我转到 Exceptions.php 并更新 MWExceptionhandler 以在它看到异常消息与我从该扩展中抛出的消息匹配时采取不同的操作。我承认这是 hacky.. 但有时你能做什么..