【问题标题】:Add Pre default text in phalcon flash messages在 phalcon flash 消息中添加预默认文本
【发布时间】:2016-09-21 09:17:35
【问题描述】:

在 phalcon 默认的 flash 消息服务中只提供默认的错误 div。

<div class="alert alert-warning">Our message</div>

但我想在这样的 div 框中添加一些内容。

<div class="alert alert-warning"> <button class="close">x</button> Our Message </div>

但是,据我所知,phalcon 只允许设置每条消息的类别。

$di->set('flash', function () {
    return new FlashSession([
        'error'   => 'alert alert-danger alert-dismissible',
        'success' => 'alert alert-success alert-dismissible',
        'notice'  => 'alert alert-info alert-dismissible',
        'warning' => 'alert alert-warning alert-dismissible'
    ]);
});

是否有任何配置或任何其他方式可以在每条消息上添加关闭按钮。我想要类似的东西

message = '<button class="close-btn">x</button>'+message

但是我不想在每条 flash 消息上添加这个关闭按钮,因为将来我可能需要更改关闭按钮的类别,以便在这种情况下我需要从项目中进行全部更改。

【问题讨论】:

    标签: phalcon phalconeye


    【解决方案1】:

    您可以通过扩展 Phalcon\FlashSession 类并覆盖 outputMessage() 方法来完成此操作,或者通过创建自己的 flash 组件来输出所需的 HTML。下面是一个自定义flash组件的例子,我们用Falcon开发的时候使用了一个类似的类,这个组件假设DI中存在一个session组件。

    这是未经测试的,但原则上代码可以让您在输出 HTML 中添加关闭按钮,或者您可以在相关方法(错误、成功、警告、信息)中为每种消息类型设置特定的 HTML 内容.

    示例用法:

    // settings messages in your controllers / components
    // 2nd param defines a position
    $this->flashMessage->error('Something is bad!', 'form_top');
    $this->flashMessage->success('Something is right!');
    $this->flashMessage->info('Something is interesting!');
    $this->flashMessage->warning('Something is worrying!');
    
    // rendering messages in your views
    // 1st param will render messages for a specific position if a position was set
    $this->flashMessage->render();
    $this->flashMessage->render('form_top');
    

    示例类:

    class FlashMessage extends Phalcon\Mvc\User\Component
    {    
        /**
         * @var array
         **/
        public $classmap = array();
    
        /**
         * Sets defaults for the class map (optional)
         *
         * @param array $classmap
         **/
        public function __construct($classmap = array()) {
    
            // -- set the defaults 
            $this->classmap = array(
                'error'   => 'flash_message-error',
                'success' => 'flash_message-success',
                'info'  => 'flash_message-info',
                'warning' => 'flash_message-warning'
            );
    
            // -- set new class map options (also optional)
            if (!empty($classmap)) {
                foreach ($classmap as $key => $value) {
                    $this->classmap[$key] = $value;
                }
            }
        }
    
        /**
         * error(), success(), info(), warning()
         * Sets the flash messages
         *
         * @param  string message
         * @param  string position
         * @return string
         **/
        public function error($message, $position = '')
        {
            $this->session->flashMessage = array(
                'position' => $position, 
                'message' => '<div class="' . $this->classmap['error'] . '">
                     ' . $message . '
                 </div>
            ');
        }
    
        public function success($message, $position = '')
        {
            $this->session->flashMessage = array(
                'position' => $position, 
                'message' => '<div class="' . $this->classmap['success'] . '">
                     ' . $message . '
                 </div>
            ');
        }
    
        public function info($message, $position = '')
        {
            $this->session->flashMessage = array(
                'position' => $position, 
                'message' => '<div class="' . $this->classmap['info'] . '">
                     ' . $message . '
                 </div>
            ');
        }
    
        public function warning($message, $position = '')
        {
            $this->session->flashMessage = array(
                'position' => $position, 
                'message' => '<div class="' . $this->classmap['warning'] . '">
                     ' . $message . '
                 </div>
            ');
        }
    
        /**
         * Check if theres messages in the session to render 
         *
         * @param  string  $position
         * @return bool
         **/
        public function hasMessage($position = null)
        {
            if (isset($this->session->flashMessage) && !empty($position)) {
                return $this->session->flashMessage['position'] == $position ? true : false ;
            } else {
                return $this->session->flashMessage ? true : false ;
            }
        }
    
        /**
         * Renders the flash message
         * 
         * @param  string  $position
         * @return string
         **/
        public function render($position = null)
        {   
            // -- store the message locally
            $message = $this->session->flashMessage;
    
            // --  check if there is in fact a flashed message
            if (empty($message))
                return;
    
            // -- then remove from the session
            $this->session->remove('FlashMessage');
    
            // -- if no position the just return the message
            if (is_null($position)) {
    
                return $message['message'];
    
            // --  else return the requested position
            } elseif ($position == $message['position']) {
    
                return $message['message'];
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我正在使用这样的东西,你可以随意扩展它。但这只是其工作原理的要点:

      class Messenger extends Component
      {
          protected static $_messageCloseHtml = '<a href="#" class="close" data-dismiss="alert" aria-label="close" title="close">&times;</a>';
      
          /**
           * @param array|string $messages
           */
          public static function flashError($messages)
          {
              $messages = !is_array($messages) ? [$messages] : $messages;
      
              foreach ($messages as $message) {
                  \Phalcon\Di::getDefault()->get('flashSession')->error(self::_getBody($message));
              }
          }
      
          /**
           * @param string $message
           * @return string
           */
          protected static function _getBody($message)
          {
              return self::$_messageCloseHtml . $message;
          }
      }
      

      对于每条消息,您可以在消息中添加一些 HTML 代码。

      我的flashError 用于错误消息。您可以为warninginfosuccess 添加相同的方法代码。

      所以基本上你扩展(现有的)FlashSession 并在分配消息时调用一个全局方法,该方法会在你的消息中添加额外的文本或 html。

      【讨论】:

        猜你喜欢
        • 2018-10-05
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多