2011-01-27 12 views
21

Después de la publicación de una forma que tiene dos campos denominados 'id' y 'url' Tengo el siguiente código:CodeIgniter pasar 2 argumentos para devolver la llamada

$this->load->library('form_validation'); 
$this->form_validation->set_rules('id', 'id', 'trim|xss_clean'); 
$this->form_validation->set_rules('url', 'url|id', 'trim|xss_clean|callback_url_check'); 

Una consulta db necesita ambos campos.

El url_check función ($ cadena, $ id) se llama pero en este caso 'id' siempre tiene el valor 0.

Si acabo de hacer:

$this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check'); 

Y llamo trabajo url_check($str) de todo como se supone que debe hacer.

La pregunta es ¿cómo paso dos valores al url_check($str, $id)?

+0

no puedes simplemente concat '$ str. $ Id;' y pasarlo de esa manera por el bien de la validación. – Ross

Respuesta

35

Puede usar $ this-> input-> mensaje directamente:

function check_url() { 
    $url = $this->input->post('url'); 
    $id = $this->input->post('id'); 

    // do some database things you need to do e.g. 
    if ($url_check = $this->user_model->check_url($url, $id) { 
     return TRUE; 
    } 
    $this->form_validation->set_message('Url check is invalid'); 
    return FALSE; 
} 
+1

Thorpe, eso es genio. Gran sugerencia, esto funcionará totalmente. –

+0

Lo hice sin ver este hilo, y ahora estoy buscando cómo hacerlo sin la función de devolución de llamada dentro porque esto no es lo suficientemente general (al menos en mi función) – Limon

2

Si entiendo form_validation correctamente, cada regla (set_rules) es para un campo del formulario y su devolución de llamada solo revisará el campo. En su caso, parece que 'id' está fuera del alcance. En cambio, uno puede pasar una matriz a la función set_rules y hacer la devolución de llamada. Todavía no he intentado esto. http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray

+0

+1 esto es correcto, las reglas de conjunto de CI son solo para un campo por regla. Puede usar una función auxiliar o similar (o como se sugiere en su modelo) _, que no es ideal, pero es el caso aquí. – Ross

+0

¡Gracias! Has validado lo que estaba pensando. – pigfox

8

Esto parece funcionar también.

$id = 1; 

$this->form_validation->set_rules('username', 'Human Username', 'callback_username_check['.$id.']'); 

function username_check($str, $id) { 
    echo $id; 
    if ($str == 'test') { 
     $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"'); 
     return FALSE; 
    } 
    else { 
    return TRUE; 
    } 
} 
+0

No funciona para mí –

+0

Jatin, parámetros de devolución de llamada requieren al menos CI 2.1.0. –

28

Eso sí, de la manera correcta (al menos para CI 2.1+) tal como se describe in the docs:

$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']'); 
// Later: 
function check_uri($field, $id){ 
    // your callback code here 
} 
+1

Los parámetros de devolución de llamada requieren al menos CI 2.1.0. –

+3

Esa sería la razón por la que lo mencioné en mi publicación;) – Philipp

+0

Lo siento, lo extrañé :) –

1

Sólo una nota sobre el uso de los parámetros de devolución de llamada como se sugiere en las otras respuestas. Si está utilizando app/config/form_validation.php para crear sus reglas de validación, la sintaxis $this->input->post('parameter') no funcionará dado que ese objeto no está disponible en el cargador de CI en el punto en la ejecución donde lee los contenidos de ese archivo. Debería hacer la llamada en su rutina de devolución de llamada, p. :

public function _validate_user_signup($username, $password) { 
    $var = $this->input->post('password'); 

En este caso, el segundo parámetro pasado al método no contendría la contraseña, pero $ var lo haría después de la llamada.

Espero que esté claro. Matt

+0

Puede usar 'get_instance()' para acceder al objeto principal de CI fuera de sus controladores, sus modelos o sus vistas, por ejemplo: '$ CI = & get_instance();', ver más [Crear clases auxiliares] (https://www.codeigniter.com/user_guide/general/ancillary_classes.html) –

0

Es mejor usar la biblioteca de Validación de formularios para obtener los datos que se están validando.

No siempre sus datos estarán en $ _GET o $ _POST (vea https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post).

La mejor manera que puede acceder a sus datos dentro de una devolución de llamada de validación es la siguiente:

$this->form_validation->validation_data 

"validation_data" es una propiedad pública en la clase CI_Form_validation.

Cuestiones relacionadas