如何使用 Joomla! 检测错误的 URL!系统插件?

Posted

技术标签:

【中文标题】如何使用 Joomla! 检测错误的 URL!系统插件?【英文标题】:How to detect wrong URL using Joomla! System Plugin? 【发布时间】:2012-12-21 07:02:26 【问题描述】:

我开发了一个 Joomla!系统插件。 我想在执行该插件时检测错误的 URL。

例如

如果我输入一个 URL “http://localhost/wrong-url”,我想在系统插件中捕获该错误。

我怎么知道系统会显示错误页面(404)?

【问题讨论】:

你的意思是在前端吗? 【参考方案1】:

您可以使用以下技术做到这一点

查看网址功能

function checkURL($URL)
    $ch = curl_init($URL);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($httpcode != 200) 
        return false;
    else
        return true;
    

CheckURL 函数的使用

/*URL May be a Joomla OR Non Joomla Site*/

if(checkURL("http://adidac.github.com/jmm/index.html"))
echo "URL Exist";
else
echo "URL NOT Exist";
//JError::raiseWarning(500,$URL. " is not exists");



if(checkURL("http://adidac.github.com/jmm/indexsdadssdasaasdaas.html"))
echo "URL Exist";
else
echo "URL NOT Exist";
//JError::raiseWarning(500,$URL. " is not exists");

注意:检查您是否安装了 PHP curl 库

【讨论】:

我想他是在问关于在 Joomla! 时赶上 404 的问题!应用决定不处理 URL...【参考方案2】:

在捕获 404 的系统插件中,您必须从插件中添加一个函数作为对 JError 错误处理程序数组的回调。

我会看看com_redirect 是如何使用它的系统插件的。例如

function __construct(&$subject, $config)

    parent::__construct($subject, $config);

    // Set the error handler for E_ERROR to be the class handleError method.
    JError::setErrorHandling(E_ERROR, 'callback', array('plgSystemRedirect', 'handleError'));



static function handleError(&$error)

    // Get the application object.
    $app = JFactory::getApplication();

    // Make sure we are not in the administrator and it's a 404.
    if (!$app->isAdmin() and ($error->getCode() == 404))
    
        // Do cool stuff here
    

唯一的问题是 JError 已贬值,所以我不确定这会在何时中断,例如在 3.0、3.1、3.2 和 3.5 中应该没问题,但之后谁知道呢?

【讨论】:

感谢您的回复。如果有多个相同级别的错误(E_ERROR),最后一个处理程序将覆盖其他处理程序。因此,系统将使用最新执行的插件的处理程序。如果我的插件是最后一个,plg_redirect 将不起作用。这很糟糕,因为所有 404 错误都是 E_ERROR 级别。【参考方案3】:

我知道这是一个老问题,但我今天需要一个解决方案并找到了这个问题,所以将我的解决方案留在下面,以帮助其他人将来搜索。

在插件文件中:

/**
 * The global exception handler registered before the plugin was instantiated
 *
 * @var    callable
 * @since  3.6
 */
private static $previousExceptionHandler;

/**
 * Constructor.
 *
 * @param   object  &$subject  The object to observe
 * @param   array   $config    An optional associative array of configuration settings.
 *
 * @since   1.6
 */
public function __construct(&$subject, $config) 
    parent::__construct($subject, $config);
    
    // Register the previously defined exception handler so we can forward errors to it
    self::$previousExceptionHandler = set_exception_handler(array('PlgSystemVmsreporting', 'handleException'));


public static function handleException($exception) 
    // Wrap in try/catch to prevent any further exceptions being raised
    try 
        // Do whatever you need with the error
     catch (Exception $e) 
        //Don't make a fuss - fail silently
    
    
    // Proxy to the previous exception handler if available, otherwise use the default Joomla handler
    if (self::$previousExceptionHandler) 
        call_user_func_array(self::$previousExceptionHandler, array($exception));
     else 
        ExceptionHandler::render($exception);
    
    

【讨论】:

我们什么时候可以在Joomla Stack Exchange 上享受您的出色贡献? (0 个问题,0 个答案):(

以上是关于如何使用 Joomla! 检测错误的 URL!系统插件?的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 2.5 从多语言系统上的 url 调用组件

如何在 Joomla 中生成友好的 url?

了解jdoc:包含在Joomla中

如果 Joomla K2 项目或 Joomla 文章在模板索引文件上检测

从 url 中删除 joomla 视图名称和组件名称

在文章中提交 PHP 表单时出现 Joomla 2.5 404 错误