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