0

在 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>

但是,根据我的知识,我们只允许设置每个消息的类。

$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 消息上添加这个关闭按钮,因为将来我可能需要更改关闭按钮的类别,以便在这种情况下我需要从项目中全部更改。

4

2 回答 2

0

您可以通过扩展 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'];
        }
    }
}
于 2016-09-21T10:20:32.263 回答
0

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

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的是错误消息。warning您可以为和添加相同info的方法代码success

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

于 2016-09-21T17:11:16.890 回答