Отправка данных вместе с перенаправлением в CodeIgniter - PullRequest
27 голосов
/ 03 декабря 2009

У меня есть простая функция 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's well";
    }
    else {
        $message = "whoops!";
    }
    redirect(view_all);
}

Так что страница просмотра в идеале должна иметь что-то вроде

if (isset($message)){
    echo $message
}

Так что в первый раз я не вижу ни одного сообщения, и когда / если есть вставка, оно выскакивает на той же странице с сообщением. Спасибо!

Ответы [ 3 ]

33 голосов
/ 03 декабря 2009

Я считаю, redirect использует header(). Если это так, я не верю, что вы можете отправить данные вместе с заголовком местоположения. Вы можете сделать то же самое, используя переменные сеанса или (не так хорошо) добавив строку запроса к URL-адресу местоположения.

Чтобы получить «принятый» способ сделать это в CodeIgniter, посмотрите чуть больше, чем на полпути вниз по странице документации class class .

CodeIgniter поддерживает «флэш-данные» или данные сеанса, которые будут доступны только для следующего запроса к серверу, а затем автоматически очищаются. Они могут быть очень полезны и обычно используются для информационных сообщений или сообщений о состоянии (например: «запись 2 удалена»).

Эта (теперь удаленная - вот архивная версия ) запись во флэш-сообщениях охватывает как строку запроса, так и метод 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
27 голосов
/ 09 сентября 2012

Вы можете использовать Flashdata в CI Session Class . Вот что сказано в документе:

CodeIgniter поддерживает "flashdata" или данные сеанса, которые будут только доступны для следующего запроса к серверу, а затем автоматически очищено. Они могут быть очень полезны и обычно используются для информационные сообщения или сообщения о состоянии (например, «запись 2 удалена»).

Примечание. Переменным Flash предшествует "flash_", поэтому избегайте использования этого префикса в именах своих сеансов.

Чтобы добавить флэш-данные:

$this->session->set_flashdata('item', 'value');

Вы также можете передать массив в set_flashdata() таким же образом, как set_userdata().

Чтобы прочитать переменную flashdata:

$this->session->flashdata('item');

Если вы обнаружите, что вам необходимо сохранить переменную flashdata с помощью дополнительного запроса, вы можете сделать это, используя функцию keep_flashdata().

$this->session->keep_flashdata('item');
0 голосов
/ 12 сентября 2013

Я хотел бы отметить, что CodeIgniter уничтожает текущий сеанс при выходе из системы. Это усложняет передачу сообщения вдоль строк «вы вошли / вышли», поскольку вы не можете использовать флэш-память или хранилище сеансов. Если вам нужно передать сообщение при переходе между состояниями входа и выхода, я предлагаю использовать memcached . Другие параметры (упомянутые выше): с использованием строк URL-запроса и , настройка файлов cookie .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...