我可以订购Joomla错误消息吗?

时间:2017-11-01 19:05:22

标签: php error-handling joomla

我使用JFactory::getApplication()->enqueueMessage('Message goes here', 'error')向用户显示无法处理的请求,它可以正常工作,但Joomla按照它们发生的顺序对消息进行排序。因为我的消息在捕获Joomla保存错误之前发生,所以用户看到此消息:

you cannot do this operation           //my message
Save failed with the following error:  //Joomla message

我想反转顺序并按原样使用Joomla消息,然后是我的消息,这样才有意义:

Save failed with the following error:    // Joomla message
you cannot do this operation            // my message

这可能吗? (没有语言翻译或覆盖?)

在得到答案的帮助后,我可以进行反演:第一条消息是使用getMessageQueue()搜索的占位符。虽然您可以删除J.2.5中的消息,但J.3 +(https://developer.joomla.org/joomlacode-archive/issue-33270.html)不再可能。解决方案是反映类以取消保护队列并替换它。

public static function reorderMessages()
{
    //error messages
    $err01 = JText::_('COM_COMPONENT_MESSAGE1');
    //you can adapt and add other messages here

    $app = JFactory::getApplication();  
    $new_messages = array();
    $replacement_found = null;
    //mirror protected $_messageQueue
    $appReflection = new ReflectionClass(get_class($app));
    $_messageQueue = $appReflection->getProperty('_messageQueue');
    $_messageQueue->setAccessible(true);
    //get messages
    $messages = $app->getMessageQueue();

    foreach($messages as $key=>$message) 
    {  
        if($messages[$key]['message'] == 'MESSAGE_TO_REPLACE' && $messages[$key]['type'] ==  'error' ) 
        {
            $replacement_found = 1;
            continue;
        }
        $new_messages[] = $message;
    }           
    if($replacement_found)
    { 
      //save all messages
      $_messageQueue->setValue($app, $new_messages);
      //add replacement message to the end of the queue       
      $app->enqueueMessage(JText::_($err01, 'error'); 
    }

    return true;
}

要小心调用函数的位置,如果消息队列为空,Joomla将返回错误并破坏您的代码。在调用函数之前,请确保已将第1条消息排入队列。

1 个答案:

答案 0 :(得分:1)

您可以在应用程序对象(即getMessageQueue())上使用$myApp = JFactory::getApplication()来获取消息队列数组的副本。您可以通过将true传递给getMessageQueue()`函数调用来清除消息队列。它仍将返回系统消息队列数组的副本。

然后,您可以使用正则表达式查找数组中的键并重新排序。我会在翻译文件中找到系统错误消息,并使用翻译.ini文件中的错误消息密钥(而不是错误消息的实际文本)进行正则表达式搜索,这样它就不会中断如果错误消息更改。我也是在插件和后期生命周期钩子(也许是onBeforeRender事件)中进行的。

您可以使用具有此签名的应用程序对象JApplication方法将修改后的消息队列数组保存回enqueueMessage()类实例:

enqueueMessage(string $msg, string $type = 'message') : void

source