Работа с классами состояний Zend Framework FlashMessenger и jQuery UI
У меня есть приложение Zend Framework, которое использует jQuery UI.
В моих контроллерах я устанавливаю сообщения об ошибках / успехе с помощью помощника FlashMessenger следующим образом:
// ExampleController.php
$this->_helper->FlashMessenger('Sorry, could not complete your request.');
В моем макете я отображаю сообщения с помощью Noumenal FlashMessenger View Helper
// layout.phtml
<?php echo $this->flashMessenger(); ?>
Я хочу использовать стили CSS моей темы jQuery UI для стилизации моих сообщений об ошибках, например:
<div class="ui-state-error ui-corner-all">
<p><span class="ui-icon ui-icon-alert"></span>
<strong>Alert:</strong> Sample ui-state-error style.</p>
</div>
... но View Helper делает всю работу, поэтому я не могу изменить классы так, как я хочу. Поэтому, прежде чем идти по тупиковому пути, я подумала, что спрошу сообщество. Вот мои вопросы:
- Как я могу использовать Zend Framework FlashMessenger, чтобы я мог устанавливать разные сообщения в зависимости от состояния (ошибка / успех)?
- Как я могу получать сообщения из FlashMessenger и отображать их в одном месте, не создавая дублирующийся код на всех моих контроллерах?
- Как вывести отдельный класс для каждого из состояний сообщения? Например:
'error'=>'ui-state-error', 'info'=>'ui-state-highlight'
, так далее.
2 ответа
Написав Noumenal FlashMessenger View Helper, я должен быть в состоянии помочь.:-)
Чтобы ответить на ваш вопрос:
Добавление сообщений
Вы можете установить разные уровни сообщений, например error
, warning
и т. д., передав массив в помощник действий FlashMessenger, а не просто строку:
// ExampleController.php
$this->_helper->FlashMessenger(
array('error'=>'Sorry, could not complete your request.')
);
Помощник вида предназначен для распознавания этого.
Вывод сообщений
При выводе FlashMessages в макет имеются необязательные параметры, которые можно передать, чтобы указать уровень сообщения по умолчанию (который warning
по умолчанию) и шаблон для вашего сообщения.
Адаптируя свой фрагмент кода для учета различных уровней сообщений, вы можете достичь желаемого результата, сделав следующий вызов в макете:
// layout.phtml
$template = '<div class="ui-state-error ui-corner-all">
<p class="%s"><span class="ui-icon ui-icon-alert"></span>
<span class="flash-message">%s</span></p>
</div>';
echo $this->flashMessenger('error', $template);
(Возможно, вам будет удобнее установить шаблон в качестве переменной представления, скажем, в вашей начальной загрузке.)
Делая это, помощник вида создаст для вас должным образом отформатированные флеш-сообщения.
Некоторые простые стили
При использовании CSS было бы достаточно места для правильного оформления сообщений. Например:
.alert {
color: red;
}
.alert .flash-message:before {
content: "<strong>Alert</strong> ";
}
.notice {
color:yellow;
}
.notice .flash-message:before {
content: "<strong>Notice</strong> ";
}
Я оставляю вас импровизировать...
Я написал руководство по Zend Framework FlashMessenger и помощнику по просмотру в своем блоге. Возможно, прочитайте это. Также, пожалуйста, напишите мне, чтобы сообщить о ваших трудностях - это поможет мне узнать, что мне нужно улучшить.
Надеюсь, это поможет.
Я закончил тем, что изменил flashMessenger()
просмотреть помощник, чтобы использовать мои шаблоны JQuery. Он выводит правильный шаблон на основе ключа (ошибка, уведомление и т. Д.). Возможно, есть лучший способ сделать это, но он выполняет свою работу.
public function flashMessenger(...)
{
//...
//process messages
foreach ($messages as $message)
{
if (is_array($message)) {
list($key,$message) = each($message);
}
$template = $this->_getJqueryTemplate($key);
$output .= sprintf($template,$message);
}
return $output;
}
private function _getJqueryTemplate($messageLevel)
{
switch($messageLevel) {
case 'error':
$template = '
<div class="ui-state-error ui-corner-all" style="padding: 0pt 0.7em;">
<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: 0.3em;"></span>
%s</p>
</div>';
break;
default:
$template = '
<div class="ui-state-highlight ui-corner-all" style="padding: 0pt 0.7em;">
<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: 0.3em;"></span>
%s</p>
</div>';
}
return $template;
}
Затем в контроллере укажите тип сообщения, который вы хотите отправить, передав его в качестве ключа массива.
// ExampleController.php
$this->_helper->FlashMessenger(
array('error'=>'Sorry, could not complete your request.')
);