2009-12-03 20 views
26

Tengo una función simple C (de CRUD), y me gustaría enviar un mensaje (error o éxito) junto con mi redirección desde la función "insertar" que he escrito . ¿Hay alguna forma de adherir un campo POST con una redirección?Enviando datos junto con una redirección en CodeIgniter

En pseudocódigo tengo:

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); 
} 

Así que la viewing_page lo ideal sería tener algo como

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

Así que en el primer tiempo a través, no veo ningún mensaje, y cuando/si hay una inserción, aparece la misma página con el mensaje. ¡Gracias!

Respuesta

32

Creo que redirect utiliza header(). Si es así, no creo que pueda enviar datos junto con un encabezado de ubicación. Usted podría lograr lo mismo usando los valores de sesión o (no tan buenos) añadiendo una cadena de consulta a la URL de ubicación.

Para una forma 'aceptada' de hacer esto en CodeIgniter, mire un poco más que la mitad de la página de documentación session class.

CodeIgniter admite "flashdata", o datos de sesión que solo estarán disponibles para la próxima solicitud del servidor, y luego se borran automáticamente. Estos pueden ser muy útiles y, por lo general, se utilizan para mensajes informativos o de estado (por ejemplo, "registro 2 eliminado").

Este (ahora eliminada - He aquí un archived version) post on flash messages cubre tanto la cadena de consulta y el método sesión var.

actualización: Para resumir el mensaje ahora eliminado, se mostró tanto URLEncoding un mensaje y añadiendo como una cadena de consulta (ejemplo de correos):

header('Location: http://www.example.com/index.php?message='.urlencode($message)); 

Y el establecimiento de un 'flash' variable utilizando dos marcos (ejemplo de correos):

//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'); 

por supuesto se puede hacer más o menos lo mismo usando $_SESSION directamente (mi ejemplo):

//first request 
$_SESSION['flash'] = 'This is a simple flash message.'; 
//next request 
$flash = $_SESSION['flash']; 
unset($_SESSION['flash']); //flash is one time only 
+1

Aah, buena información, gracias. Sus documentos son realmente geniales, pero tan largos ... –

+0

La sesión es la única forma de lograr esto a menos que use cadenas de consulta que se vuelven complicadas con el enrutamiento URI que tiene CI. +1 para esta respuesta. – Jessedc

+1

Como dijo Jessedc, las sesiones son la única forma. Uso datos flash para este tipo de aplicación. Normalmente, configuro los datos flash, el redireccionamiento. También ayuda a evitar que los usuarios reenvíen datos. –

26

Puede usar Flashdata en el CI Session Class. Esto es lo que se dice en el documento:

CodeIgniter soporta "flashdata" o los datos de sesión que sólo habrá disponible para la siguiente petición del servidor, y son entonces automáticamente aclaró. Estos pueden ser muy útiles y, por lo general, se usan para los mensajes informativos o de estado (por ejemplo, "registro 2 eliminado").

Nota: Las variables del flash vienen precedidas de "flash_", así que evite este prefijo en sus propios nombres de sesión.

Para añadir flashdata:

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

También puede pasar una matriz a set_flashdata(), de la misma manera que set_userdata().

para leer una variable flashdata:

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

Si usted encuentra que necesita conservar una variable flashdata través de una solicitud adicional, puede hacerlo a través de la función keep_flashdata().

$this->session->keep_flashdata('item'); 
0

Me gustaría señalar que CodeIgniter destruye la sesión actual al cerrar la sesión. Esto hace que sea más difícil transmitir un mensaje como "has iniciado sesión/cerrado" ya que no puedes usar el almacenamiento flash o de sesión. Si necesita pasar un mensaje al hacer la transición entre los estados de entrada y salida, sugiero usar memcached. Otras opciones (mencionadas anteriormente) son using URL query strings y setting cookies.

Cuestiones relacionadas