Отправка данных вместе с перенаправлением в CodeIgniter
У меня есть простая функция C (CRUD), и я бы хотел отправить сообщение (ошибку или успех) вместе с моей переадресацией из функции "insert", которую я написал. Есть ли способ привязать поле POST с перенаправлением?
В псевдокоде есть:
function view_all{
//set up some initial variables
$this->load->view(viewing_page, $data)
}
function insert{
if ($this->db->insert(my_table, $_POST)){
$message = "All well";
}
else {
$message = "whoops!";
}
redirect(view_all);
}
Таким образом, в view_page в идеале будет что-то вроде
if (isset($message)){
echo $message
}
Итак, в первый раз, я не вижу никакого сообщения, а когда/если есть вставка, он выводит ту же страницу с сообщением. Спасибо!
Ответы
Ответ 1
Я считаю, что redirect
использует header()
. Если это так, я не верю, что вы можете отправлять данные вместе с заголовком местоположения. Вы можете сделать то же самое, используя сеансовые вары или (не так хорошо), добавляя строку запроса к URL-адресу местоположения.
Для "принятого" способа сделать это в CodeIgniter смотрите чуть больше половины страницы class > .
CodeIgniter поддерживает "flashdata" или данные сеанса, которые будут доступны только для следующего запроса сервера, и затем автоматически очищаются. Они могут быть очень полезными и обычно используются для информационных или статусных сообщений (например: "запись 2 удалена" ).
Это (теперь удалено - здесь архивная версия) post on flash сообщения охватывает как строку запроса, так и метод var var.
Обновить. Чтобы суммировать удаленную запись, она показывала как urlencoding сообщение, так и добавление в виде строки запроса (пример из сообщения):
header('Location: http://www.example.com/index.php?message='.urlencode($message));
И установка переменной "flash" с использованием двух фреймворков (пример из сообщения):
//Zend Framework
$flashMessenger = $this->_helper->FlashMessenger;
$flashMessenger->setNamespace('actionErrors');
$flashMessenger->addMessage($message);
//CakePHP
$this->Session->setFlash('Your post has been saved.');
$this->redirect('/news/index');
Конечно, вы можете сделать примерно то же самое, используя $_SESSION
напрямую (мой пример):
//first request
$_SESSION['flash'] = 'This is a simple flash message.';
//next request
$flash = $_SESSION['flash'];
unset($_SESSION['flash']); //flash is one time only
Ответ 2
Вы можете использовать Flashdata в CI классе сеанса. Вот что сказано в документе:
CodeIgniter поддерживает "flashdata" или данные сеанса, которые будут только доступны для следующего запроса сервера и затем автоматически очищено. Они могут быть очень полезными и обычно используются для информационные сообщения или сообщения о статусе (например: "запись 2 удалена" ).
Примечание. Переменные Flash предваряются "flash_", поэтому избегайте этого префикса в ваших собственных именах сеансов.
Чтобы добавить flashdata:
$this->session->set_flashdata('item', 'value');
Вы также можете передать массив в set_flashdata()
так же, как set_userdata()
.
Чтобы прочитать переменную flashdata:
$this->session->flashdata('item');
Если вы обнаружите, что вам нужно сохранить переменную flashdata с помощью дополнительного запроса, вы можете сделать это с помощью функции keep_flashdata()
.
$this->session->keep_flashdata('item');
Ответ 3
Я хотел бы указать, что CodeIgniter уничтожает текущий сеанс при выходе из системы. Это затрудняет передачу сообщения по строкам "вы вошли в систему", так как вы не можете использовать флеш-память или сеансовое хранилище. Если вам нужно передать сообщение при переходе между состояниями входа и выхода, я предлагаю использовать memcached. Другие варианты (упомянутые выше) с использованием строк запроса URL и настройка файлов cookie.