我使用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条消息排入队列。
答案 0 :(得分:1)
您可以在应用程序对象(即getMessageQueue()
)上使用$myApp = JFactory::getApplication()
来获取消息队列数组的副本。您可以通过将true
传递给getMessageQueue()`函数调用来清除消息队列。它仍将返回系统消息队列数组的副本。
然后,您可以使用正则表达式查找数组中的键并重新排序。我会在翻译文件中找到系统错误消息,并使用翻译.ini
文件中的错误消息密钥(而不是错误消息的实际文本)进行正则表达式搜索,这样它就不会中断如果错误消息更改。我也是在插件和后期生命周期钩子(也许是onBeforeRender
事件)中进行的。
您可以使用具有此签名的应用程序对象JApplication
方法将修改后的消息队列数组保存回enqueueMessage()
类实例:
enqueueMessage(string $msg, string $type = 'message') : void