Mediawiki阻止页面保存并重定向回编辑页面并显示错误消息

时间:2013-03-28 02:19:37

标签: php mediawiki

我的维基文章包含指向特定数据集的链接。我想强制这些链接是唯一的(因为没有人可以创建一个新页面,其中包含另一个页面中的链接。)我已经为此扩展编写了大部分代码。我创建了一个表'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;

}

首先,我为这些草率的代码道歉,真的只是很快就把它拼凑在一起,没有任何先前的扩展经验...... 正如你所看到的那样,我有评论的地方//返回ERROR如果其中一个条件成立,我想阻止媒体wiki保存页面。而不是保存,我想将用户返回到编辑页面,并显示一条消息,告诉他们他们提供的链接存在问题。

有什么想法吗?我环顾四周但找不到类似的东西,我认为这是因为我不知道究竟要问什么问题。我知道有像'ArticleSave'这样的钩子,但我不知道如何将它与解析器一起使用。

任何帮助都会很棒!即使它告诉我完全重新做我做的事,因为它全是错的哈哈。

编辑:我通过在我想要返回错误的地方抛出MWExceptions来修复此问题。然后我转到Exceptions.php并更新了MWExceptionhandler,当它看到异常消息与我从此扩展中抛出的异常消息匹配时,采取不同的操作。这是我承认的hacky ..但你有时可以做些什么..

1 个答案:

答案 0 :(得分:0)

将此扩展名编写为解析器函数可能是错误的方向。如果要拒绝编辑,请使用EditFilter挂钩。您可能需要查看SpamBlacklist扩展名作为模型,因为它还会查看链接以决定是否拒绝编辑。

此外,我在您的扩展程序中看到的一个问题是,一旦使用其中一个唯一链接保存了一个页面,即使链接(或整个页面!)是,也没有任何内容可以从unique_external_links中删除行删除,有时无法重新插入已删除的链接。你可能想要解决这个问题。