在HTML元素中包装Phalcon flash消息

时间:2014-06-10 14:09:52

标签: phalcon

是否有可能将Flash消息包装在元素中?我希望在没有消息的情况下根本没有html元素,并且如果有任何消息,还有一个包含所有消息的额外div。

如果我至少可以获取信息是否有任何闪存消息然后自己编码就足够了,但在我看来,Phalcon \ Flash \ Direct和Phalcon \ Flash \ Session都不允许您访问当前消息在你自己的html元素中计算或包装消息。

4 个答案:

答案 0 :(得分:2)

只需配置您的Flash服务即可输出消息:

$this->flash->setAutomaticHtml(false);

此外,在输出消息时,它会自动回显。 如果您只想返回一个字符串而不将其回显到输出缓冲区,请使用:

$this->flash->setImplicitFlush(false);

这些方法不在main documentation page中,但您也应该始终查看class reference,您可能会在那里找到非常有用的信息:)

修改

要返回仅消息,您使用setAutomaticHtml为false,setImplicitFlush与此无关。另外要知道消息是否存在,请使用以下内容:

$this->flashSession->has('error');

答案 1 :(得分:1)

我已经结束了以下代码。我基本上必须自己生成输出。

<?php
    $messages = $this->flashSession->getMessages();
    if ( count($messages) > 0) {
?>
    <div class="basic-bg">
        <div class="main-column">
            <div class="flash-messages">
                <?php 
                foreach ($messages as $messageType => $messageArray) {
                    foreach ($messageArray as $message) {
                        echo "<div class=\"flash-$messageType\">$message</div>";
                    }
                }
                ?>
            </div>
        </div>
    </div>
<?php } ?>

答案 2 :(得分:1)

我知道这是一个旧线程,但是如何实现扩展类以确保您的消息字符串仍然正确转义?

这是我用来实现Bootstrap 3可忽略消息的类:

<?php
namespace Ext;
/**
 * Extension to Phalcon Framework to implement Bootstrap 3 dismissable messages.
 * Pass mappings of phalcon to bootstrap classes to construct
 * @link https://docs.phalconphp.com/uk/latest/reference/flash.html Phalcon flash docs
 * @author Kevin Andrews <kevin@zvps.uk>
 */
class FlashBootstrap extends \Phalcon\Flash\Session
{
    /**
     * Correctly escapes the message while building a Bootstrap 3
     * compatible dismissable message with surrounding html.
     * @param string $type
     * @param string $message
     * @return void
     */
    public function message($type, $message)
    {
        $bootstrapCssClass = $this->_cssClasses[$type];
        $errorType = ucfirst($type);
        $bootstrapMessage = "<div class=\"alert alert-{$bootstrapCssClass} alert-dismissible\" role=\"alert\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button><strong>{$errorType}:</strong> {$this->getEscaperService()->escapeHtml($message)}</div>";
        parent::message($type, $bootstrapMessage);
    }
}

同样为了完整性DI的初始化:

 <?php
        $di->set('flash', function() {
            $bootstrapFlash = new Ext\FlashBootstrap(array(
                'error' => 'alert alert-danger alert-dismissible',
                'success' => 'alert alert-success alert-dismissible',
                'notice' => 'alert alert-info alert-dismissible',
                'warning' => 'alert alert-dismissible',
            ));
            $bootstrapFlash->setAutoescape(false);
            $bootstrapFlash->setAutomaticHtml(false);
            return $bootstrapFlash;
        });

这样做的另一个好处是 - &gt; success() - &gt; error() - &gt; notice()和 - &gt; warning()辅助方法都将通过此代码并生成包含在内的格式良好的消息所需的HTML。

答案 3 :(得分:0)

{% if flash.has('notice')==true OR flash.has('success') %}
    {% for notif in flash.getMessages('success') %}
        <div class="notif_global success">
            <div class="notif_global-title">Успешно</div>
            <div class="notif_global-content">{{ notif }}</div>
            <div class="notif_global-close ico_close"></div>
        </div>
    {% endfor %}
    {% for notif in flash.getMessages('notice') %}
        <div class="notif_global success">
            <div class="notif_global-title">Сообщение</div>
            <div class="notif_global-content">{{ notif }}</div>
            <div class="notif_global-close ico_close"></div>
        </div>
    {% endfor %}
{% endif %}
{% if flash.has('warning')==true OR flash.has('error') %}
    {% for notif in flash.getMessages('warning') %}
        <div class="notif_global error">
            <div class="notif_global-title">Предупреждение</div>
            <div class="notif_global-content">{{ notif }}</div>
            <div class="notif_global-close ico_close"></div>
        </div>
    {% endfor %}
    {% for notif in flash.getMessages('error') %}
        <div class="notif_global error">
            <div class="notif_global-title">Ошибка</div>
            <div class="notif_global-content">{{ notif }}</div>
            <div class="notif_global-close ico_close"></div>
        </div>
    {% endfor %}
{% endif %}