CakePHP настроить флэш-сообщение - PullRequest
5 голосов
/ 03 ноября 2011

Обычно $this->Session->setFlash(__('My message.'));

Будет выводить:

<div id="flashMessage" class="message">
    My message.
</div>

Как я могу это изменить, чтобы он вывел:

<p class="notification>
    My message.
</p>

вместо

Ответы [ 5 ]

19 голосов
/ 03 ноября 2011

Если вы посмотрите на исходный код, то увидите, что вторым параметром метода SessionComponent является имя элемента:

function setFlash($message, $element = 'default', $params = array(), $key = 'flash')

Вы можете создать файл в представлениях / элементах (или представлениях / элементах для Cake2), называемый, например, flash_notification.ctp *

со следующим содержанием:

<p class="notification">
  <?php echo $message; ?>
</p>

и используйте

$this->Session->setFlash(__('My message.'), 'flash_notification');
3 голосов
/ 20 мая 2014

Согласно флеш-сообщение cakephp нет необходимости обрабатывать id и класс в вашем представлении.Вы можете установить id и class, когда устанавливаете Flash как простой способ.

$this->Session->setFlash(__('My message.'), 'default', array('id' => 'flashMessage', 'class' => 'message'), 'message');

$this->Session->setFlash(__('My message.'), 'default', array('class' => 'notification'), 'notification');

На ваш взгляд.

echo $this->Session->flash('message');
echo $this->Session->flash('notification');

Вот и все.

0 голосов
/ 07 февраля 2018

Я нашел этот обходной путь, используя jquery.

У меня есть этот код в контроллере if($var1 == null) { $this->Flash->error(__('Error message')); }

В /app/View/Layouts/default.ctp я поместил этот код

$(document).ready(function() {  
    if($('#flashMessage').length) // Check if flashMessage exists
    {
       var message = $('#flashMessage').html(); // Copy text
       // if I send html tags in the flash message,I use this code to print html
       message = message.replace(/&lt;/g, '<'); 
       message = message.replace(/&gt;/g, '>');

        if( $('#flashMessage').hasClass("error") ) // Check if it has the error class
        {
            // Create a bootstrap alert warning and set the message
            $('#flashMessage').html("<div class='alert alert-warning' style='width:50%'>"+message+"</div>");
        }

        if( $('#flashMessage').hasClass("success") ) // Check if it has the sucess class
        {
            // Create a bootstrap alert sucess and set the message
            $('#flashMessage').html("<div class='alert alert-success' style='width:50%'>"+message+"</div>");
        }           
    }
});
0 голосов
/ 08 мая 2014

Я не думаю, что текущие ответы являются хорошим подходом к флеш-сообщениям в целом.

Все приложение должно просто иметь $this->setFlash('my message');, и родительское представление или макет должны решить, как его отобразить (даже если оно использует элемент).

Следующий код должен быть в макете, возможно, в разделе <head>.

<?php
        $flashMessage = $this->Session->flash();
        if ( $flashMessage !== false) {
            echo $this->element('my_custom_flash_element', array(
                'message' => $flashMessage
            ));
        }
?>

Компоновка захватывает его и передает флэш-сообщение как переменную в элемент 'my_custom_flash_element'.

Внутри элемента вы можете иметь любой причудливый рендеринг с помощью CSS и даже такие классные вещи, как toastr.js (который я лично люблю!)

Пример: (my_custom_flash_element.ctp)

<script>
    $(document).ready(function() {
         <?php echo "toastr.warning('" . $message . "');"; ?>
    });
</script>

Также ознакомьтесь с этой замечательной концепцией в переходных флеш-сообщениях от @dereuromark

0 голосов
/ 12 августа 2013

в приложении / элементе создайте файл .ctp (пример: flash.ctp)

<div class="alert alert-<?= (isset($alert)? $alert : 'info' ) ?>">
    <button type="button" class="close" data-dismiss="alert">×</button>
<center>    <?= (isset($message)? $message : 'Something went wrong' ) ?></center>
</div>

и используйте

$this->Session->setFlash($message,'flash',array('alert'=>'info'));

определение класса, введите свой CSS-файл, чтобы настроить свой FlashСообщение Я надеюсь, что это поможет

...