Могу ли я заказать сообщения об ошибках 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

Это возможно? (без языкового перевода или переопределений?)

После получения справки из ответов я мог сделать инверсию: 1-е сообщение — это заполнитель, который нужно искать с помощью 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

Решение

Ты можешь использовать getMessageQueue() на объекте приложения (т.е. $myApp = JFactory::getApplication()) получить копию массива очереди сообщений. Вы можете очистить очередь сообщений, передав true на вызов функции getMessageQueue () `. Он по-прежнему будет возвращать копию массива очереди системных сообщений.

Затем вы можете использовать регулярные выражения, чтобы найти ключи в массиве и изменить их порядок. Я нашел бы системное сообщение об ошибке в файле перевода и использовал ключ сообщения об ошибке из перевода .ini файл (вместо фактического текста сообщения об ошибке) для поиска регулярных выражений, чтобы он не ломался, если сообщение об ошибке изменяется. Я также сделал бы это в плагине и в конце крюка жизненного цикла (возможно, onBeforeRender событие).

Вы можете сохранить измененный массив очереди сообщений обратно в JApplication экземпляр класса с использованием объекта приложения enqueueMessage() метод, который имеет эту подпись:

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

источник

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector