2012-06-14 12 views
11

he estado tratando con un problema por un tiempo. ¿Cómo puedo establecer los errores de validación usando el redireccionamiento en una función? Este es el código que tengo en mi controlador:¿Cómo se muestran los errores de validación usando la redirección en codeigniter?

function send() 
{ 
    $this->form_validation->set_rules('e-mail', 'Email', 'trim|required|valid_email'); 
    $this->form_validation->set_rules('cellphone', 'Cellphone Number', 'trim|required|is_natural'); 
    $this->form_validation->set_message('required', '%s is required.'); 
    $this->form_validation->set_message('valid_email', '%s is not a valid Email Address'); 
    $this->form_validation->set_message('is_natural', '%s can only contain numbers.'); 
    $this->form_validation->set_error_delimiters('<li>', '</li>'); 

    if($this->form_validation->run() == FALSE) 
    { 
     redirect ('/'); 
    } 
    else 
    { 
     echo '<pre>'; 
     print_r($_POST); 
     echo '<pre>'; 
    } 
} 

Y este es el código que utilizo en mi opinión archivo:

<? if (validation_errors()) 
{ 
echo '<div id="validation_errors" title="Error:">'; 
echo '<div class="response-msgs errors ui-corner-all"><span>Errors:</span><br /><ul>'; 
echo validation_errors(); 
echo '</ul></div>'; 
echo '</div>'; 
} 
?> 
+0

¿Hay alguna razón en particular por qué te gustaría volver a dirigir?Por lo general, cuando muestra errores, se muestran en la página en la que se ingresan para que puedan corregirse. Usted "podría" usar flashdata para almacenar el resultado de 'validation_errors()' que luego se puede acceder en la redirección a la página? – Gavin

+0

Sí, por supuesto que lo sé. Pero la razón que me llevó a redirigir es que el formulario está en la página principal del sitio web y debe enviar todos los datos a un método llamado "enviar". Después de recibir cualquier tipo de error, debe volver al método anterior "índice". – Afshin

+0

¿El método 'enviar' está siendo utilizado por cualquier otra cosa que no sea para la página' index'? – Gavin

Respuesta

16

he encontrado la manera de hacerlo. Redirigir no mantiene los datos para ser mostrados. He utilizado el código de abajo para resolver el problema:

if($this->form_validation->run() == FALSE) 
{ 
    $this->index(); 
} 
+0

Elaborar por favor. Obtengo el método indefinido "index()" en mi Controlador si lo uso. ¿Algún enlace a la documentación? –

+0

@AbhishekSaini primero tiene que crear un método index() en su controlador. entonces puedes incluir el método dentro de otro – Afshin

2

Según mi comentario:

function index() 
{ 
    $this->load->library('form_validation'); 
    $data = array 
    (
     'Param' => 'Value' 
    ); 
    if($this->input->post('cellphone', true) !== false) 
    { 
     if($this->form_validation->run() != FALSE) 
     { 
      echo '<pre>' . print_r($_POST, true) . '</pre>'; 
     } 
    } 
    $this->load->view('index', $data); 
} 

En primer lugar, necesita cambiar su forma para que apunte a la página actual, es decir, current_url() o site_url('controller/index').

Cuando vas a la index sin publicar, simplemente se va a omitir la validación. Al enviar su formulario, ejecutará la validación.

Puede utilizar los métodos integrados en form_error o validation_errors para mostrar los errores dentro de su vista index.

+0

Yo sabía sobre esto. Pero solo quería saber si hay una forma de hacerlo mediante el redireccionamiento – Afshin

+0

Sí, pero es más complicado. Debería almacenar los valores '$ _POST' y' validation_errors' en FlashData y luego mostrar el error, etc. a la vuelta. Esto significa que no puede usar las funciones incorporadas y está efectivamente reescribiendo el código sin ningún motivo. – Gavin

0

finalmente me dieron una solución para la redirección con validation_errors

Se trata de utilizar para pasar los validation_errors en los datos de la sesión, lo hago como esto

if ($this->form_validation->run()) { 
     $data = array(
      'email' => $this->input->post('email'), 
      'is_login' => true 
     ); 
     $this->session->set_userdata($data); 
     redirect($this->input->post('redirect')); 
    } 
    else 
    { 
     $data = array (
      'errors' => validation_errors(), 
      'is_login' => false 
     ); 
     $this->session->set_userdata($data); 
     redirect($this->input->post('redirect')); 
    } 

y en la página i utilizado

 $this->session->set_flashdata('redirectToCurrent', current_url()); 

    if ($this->session->userdata('is_login')) 
    { 
     echo "You are using this as : </br>" . $this->session->userdata('email'); 
     echo "</br><a href='/logout'>Logout</a>"; 
    } 
    else 
    { 
     echo form_open('login'); 
     echo "" . $this->session->userdata('errors'); 
     echo "email : " . form_input('email'); 
     echo "Password : " . form_password('password'); 
     echo form_submit('submit', 'Login'); 
     echo form_hidden('redirect',$this->uri->uri_string()); 
     echo form_close(); 
    } 

Deseo te gusta esta solución rápida

7

Sé que es un poco tarde, pero este método funciona de maravilla para mí.

Si está validando su formulario en una función diferente a la que el formulario se carga, puede enviar su validation_errors() a cualquier página que redirect() pasando el método validation_errors() a $this->session->set_flashdata() así:

if ($this->form_validation->run() == FALSE) { 

    $this->session->set_flashdata('error', validation_errors()); 

    redirect('/'); 
} 

En sus funciones de controlador, donde le gustaría que sus errores o mensajes que se recibirán a continuación, puede fijar a la matriz $data así:

if (!empty($this->session->flashdata('message'))) { 

    $data['message'] = $this->session->flashdata('message'); 
} elseif (!empty($this->session->flashdata('error'))) { 

    $data['error'] = $this->session->flashdata('error'); 
} 

En t que la parte superior de mis puntos de vista que por lo general incluyen:

<?php if (isset($message)) { 

    echo '<p class="alert alert-info">'.$message.'</p>'; 
} elseif (isset($error)) { 

    echo '<p class="alert alert-danger"><strong>Error: </strong>'.$error.'</p>'; 
}?> 

Utilización de clases de Twitter de arranque para dar formato a los mensajes de ayuda a diferenciarlos.

Incluí la flashdata message para que pueda ver cómo el tipo de mensaje o error que desea enviar, puede formatearlos de manera diferente para toda la información, advertencia, éxito y mensajes de error.

Cuestiones relacionadas