CodeIgniter 4 — Как отобразить Flashdata внутри представления?

#php #codeigniter #codeigniter-4

#php #codeigniter #codeigniter-4

Вопрос:

Я обновляю свой проект с CodeIgniter 3 до CodeIgniter 4, я пытаюсь отобразить сообщение flashdata внутри представления, но, к сожалению, я получаю разные ошибки для каждого метода, который я пытаюсь.

В CodeIgniter 3 я обычно вызывал что-то вроде:

 <?php if ($this->session->flashdata('message')) : ?>
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        <?php echo $this->session->flashdata('message'); ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">amp;times;</span></button>
    </div>
<?php endif; ?>
  

Я пробую то же самое в CodeIgniter 4, но получаю эту ошибку:

 ErrorException
Undefined property: CodeIgniterViewView::$session
  

Может ли кто-нибудь показать мне, как этого добиться?
Заранее спасибо.

Комментарии:

1. Я думаю, это может быть вам полезно: codeigniter4.github.io/userguide/libraries/sessions.html

Ответ №1:

Вы можете использовать функцию session() напрямую:

 <?php if (session()->getFlashdata('message') !== NULL) : ?>
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        <?php echo session()->getFlashdata('message'); ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">amp;times;</span></button>
    </div>
<?php endif; ?>
  

Ответ №2:

Контекст ($this) является экземпляром класса View -> у вас нет прямого доступа к экземпляру сеанса

Вы можете создать новый экземпляр ниже

 $session = ConfigServices::session();
  

Комментарии:

1. Я сделал это в контроллере, чтобы установить flashdata ( $session->setFlashdata('item', 'value'); ) теперь я ищу способ отображения данных, хранящихся во Flashdata, из представления.

2. вы можете получить из $data = $session-> flashdata («ключ»)

3. а также, пожалуйста, отметьте как ответ, если вы решили, спасибо

Ответ №3:

В CodeIgniter 4 появился новый способ установки флэш-данных $session->setFlashdata('item', 'value'); и просмотра $session->getFlashdata('item');

Вы можете проверить это здесь: установите флэш-данные в сеансе в CodeIgniter

Ответ №4:

Я просто использую другой способ отображения flashdata, и он отлично работает.

В моем контроллере я добавил новый индекс к данным, передаваемым в представление:

 $data['message'] = "Sorry, you must login first";
return view('login', $data);
  

Затем в представлении login.php я называю это так:

 <?php if (isset($message)) : ?>
    <div class="alert alert-warning alert-dismissible fade show" role="alert">
        <?php echo $message; ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">amp;times;</span></button>
    </div>
<?php endif; ?>
  

Обновить:

Я просто использую markAsFlashdata() метод, и он работает отлично. Вот что я сделал в контроллере непосредственно перед return методом:

 $_SESSION['error'] = 'Sorry, you must login first';
$session = session();
$session->markAsFlashdata('error');
  

Затем в представлении я получаю доступ к flashdata с помощью $_SESSION['error'] :

 <?php if (isset($_SESSION['error'])): ?>
    <div class="alert alert-warning" role="alert">
        <?= $_SESSION['error']; ?>
    </div>
<?php endif;?>
  

Ответ №5:

Добавьте эту строку сразу после echo $this->section('content');

 $session = ConfigServices::session(); 

<?php if (isset($message)) : ?>
    <div class="alert alert-warning alert-dismissible fade show" role="alert">
        <?php echo $message; ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">amp;times;</span></button>
    </div>
<?php endif; ?>
  

Ответ №6:

На данный момент моим решением было создать метод представления в BaseController.php . Идея состоит в том, чтобы добавить больше «общей» информации в массив $data .

     /* In BaseController.php */

    /**
     * view function replaced 
     */
    public function view(string $name, array $data = [], array $options = []): string
    {
        // Inject global data        
        $data = array_merge($data,["controller" => $this]);        
        return view($name,$data,$options);
    }

    /**
     * Temporary message
     */
    public function flash($message, $type = 'info') {
        $this->session->setFlashdata('flash_message', 
            ["message" => $message, "type" => $type]);        
    }

    public function getFlash() {
        return $this->session->getFlashdata('flash_message');
    }

   /* In the descendant controller */
   return $this->view('products/list',['products' => $products]);

   /* In the view */
   <div id="messages">
      <?php if($flash = $controller->getFlash()) : ?>
          <?= view_cell('Base::alert', $flash); ?>
      <?php endif ?>
   </div>