在phalcon flash消息中添加Pre默认文本

时间:2016-09-21 09:17:36

标签: phalcon phalconeye

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

2 个答案:

答案 0 :(得分:0)

您可以通过扩展Phalcon \ FlashSession类并覆盖outputMessage()方法,或者通过创建自己的Flash组件来输出所需的HTML来实现此目的。下面是自定义flash组件的示例,当我们使用Falcon开发时,我们使用类似的类,该组件假定DI中存在会话组件。

这是未经测试的,但原则上代码可以让您能够为输出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'];
        }
    }
}

答案 1 :(得分: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用于显示错误消息。您可以为warninginfosuccess添加相同的方法代码。

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