私の wiki 記事には、特定のデータセットへのリンクが含まれています。これらのリンクが一意であることを強制したい (別のページに存在するリンクを使用して新しいページを作成することはできないため)。この拡張機能のほとんどのコードは既に作成しています。URLをインデックスとして格納するテーブル「unique_external_links」と、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 I would like to stop media wiki from Saving がある場所があります。これらの条件のいずれかが true の場合、そのページ。保存する代わりに、ユーザーが提供しているリンクに問題があることを伝えるメッセージを編集ページに戻したいと思います。
何か案は?私はたくさん見回しましたが、似たようなものを見つけることができませんでした. 「ArticleSave」のようなフックがあることは知っていますが、それをパーサーと組み合わせて使用する方法がわかりませんでした。
どんな助けでも素晴らしいでしょう!たとえそれが私がしたことを完全にやり直すように私に言ったとしても、それはすべて間違っているので.
編集:エラーを返したい場所で MWExceptions をスローすることで、この問題を修正しました。次に、Exceptions.php に移動し、MWExceptionhandler を更新して、例外メッセージがこの拡張機能からスローしたものと一致することを確認したときに別のアクションを実行するようにしました。これは私が認めるハッキーです..しかし、時々何ができるでしょうか..