Работа с классами состояний Zend Framework FlashMessenger и jQuery UI - PullRequest
4 голосов
/ 16 ноября 2009

У меня есть приложение Zend Framework, использующее пользовательский интерфейс jQuery.

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

  1. Как я могу использовать Zend Framework FlashMessenger, чтобы я мог устанавливать разные сообщения в зависимости от состояния (ошибка / успех)?
  2. Как я могу получать сообщения из FlashMessenger и отображать их в одном месте, не создавая дублирующийся код на всех моих контроллерах?
  3. Как вывести отдельный класс для каждого из состояний сообщения? Например: 'error'=>'ui-state-error', 'info'=>'ui-state-highlight' и т. Д.

Ответы [ 2 ]

9 голосов
/ 26 ноября 2009

Написав 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 и помощник по просмотру в моем блоге . Возможно, прочитайте это. Также, пожалуйста, сделайте напишите мне, чтобы сообщить о ваших трудностях - это поможет мне узнать, что мне нужно улучшить.

Надеюсь, это поможет.

1 голос
/ 01 декабря 2009

В итоге я изменил помощник вида 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.')
);
...