2016-06-22 11 views
1

Hallo ich hoffe du kannst mir dabei helfen. Ich habe viele der gleichen Fragen zu diesem Thema gesehen und keiner von ihnen funktioniert für mich.Codeigniter Formvalidierung Rückruf im Modell

Ich benutze Codeigniter 2.2.2 und versuche, Formular-Validierung im Modell zu erstellen, so dass es von mehreren Controllern zugänglich sein kann. Die Formularüberprüfung konnte bei benutzerdefinierten Callbacks, die im Modell deklariert wurden, nicht korrekt zurückgegeben werden.

// in Model 
function validateErrors() { 
    $rules = array(
     array('field'=>'username', 'label'=>'User', 'rules'=>'trim|required|callback_userPrefix'), 
     array('field'=>'password', 'label'=>'Password', 'rules'=>'trim|required|callback_passwordNotEmpty'), 
    ); 

    $this->load->library('form_validation'); 
    $this->form_validation->set_rules($rules); 
    if ($this->form_validation->run() == FALSE) { 
     $errors = array(); 
     foreach ($rules as $r) 
      $errors[$r['field']] = $this->form_validation->error($r['field']); 
     return $errors; 
    } 
    return false; 
} 

public function userPrefix() { 
    $find = 'user_'; 
    if (strpos($this->input->post('username'), $find) != 0) { 
     $this->form_validation->set_message('userPrefix', 'Username not allowed.'); 
     return false; 
    } 
    return true; 
} 

public function passwordNotEmpty() { 
    // not the actual callback just an example 
    if (empty($this->input->post('password'))) { 
     $this->form_validation->set_message('passwordNotEmpty', 'Password cannot be blank.'); 
     return false; 
    } 
    return true; 
} 

so kann es in Controller gesteuert werden mag:

// in Controller 
if ($this->input->post()) { 
    $this->load->model('ModelName','model1', true); 
    $validation_errors = $this->model1->validateErrors(); 
    if ($validation_errors === false) { 
     // continue saving record 
    } else { 
     print_r($validation_errors); exit; 
    } 
} 

Ich wollte Formularvalidierung jeden Benutzer-Login erstellen. Aber da mehrere Controller die gleiche Validierung verwenden, habe ich die Validierung und ihre benutzerdefinierten Rückrufe im Modell deklariert, um die Codierungslänge in den Controllern zu minimieren (hoffentlich zu minimieren).

Auch this answer sagt, Sie können die Formularüberprüfung in dem Modell tun (auch Callbacks in Modell erklärt angeblich funktioniert). Ich habe das versucht, würde aber nicht für mich arbeiten.

Kann mir jemand dabei helfen? Vielen Dank!

+2

Vielleicht ist dies ein Grund, auf Codeigniter 3 zu aktualisieren? Es gibt große Vorteile beim Upgrade und es gibt nicht so viele brechende Änderungen. Dann könnten Sie aufrufbar in Ihren Modellen wie: http://www.codeigniter.com/user_guide/libraries/form_validation.html#callable-use-anything-as-a-rule – cartalot

+0

@cartalot bedeutet das, es kann nicht getan werden? Ich kann nicht auf v3 upgraden, weil ich nur auf bestimmte Module auf dem System meiner aktuellen Firma zugreifen kann – JNY

+0

teilen Sie Ihre HTML mit uns, dann wird es einfacher sein, herauszufinden, was vor sich geht. – Jobayer

Antwort

1

Ich habe einen Workaround gemacht, dank den Vorschlägen von @cartalot und @ marcoFSN. Ich musste die Form_validation-Klasse ändern (Danke @marcoFSN) und ich kann wirklich nicht benutzerdefinierte Callbacks im Modell über set_rules Methode aufgerufen, so musste ich jeden benutzerdefinierten Callbacks separat aufrufen (danke @cartalot).

Hier ist mein Code:

// in Model 
function validationErrors() { 
    $rules = array(
     array('field'=>'username', 'label'=>'User', 'rules'=>'trim|required'), 
     array('field'=>'password', 'label'=>'Password', 'rules'=>'trim|required'), 
    ); 
    $this->load->library('form_validation'); 
    $this->form_validation->set_rules($rules); 

    $errors = array(); 
    if ($this->form_validation->run() == FALSE) 
     foreach ($rules as $r) 
     $errors[$r['field']] = $this->form_validation->error($r['field']); 
    if (!$errors['username']) 
     if ($this->userPrefix($this->input->post('username'), 'username')) 
     $errors['username'] = $this->form_validation->error('username'); 
    if (!$errors['password']) 
     if ($this->passwordNotEmpty($this->input->post('password'), 'password')) 
     $errors['password'] = $this->form_validation->error('password'); 

    if (!empty($errors)) return $errors; 
    else return false; 
} 

function userPrefix($value, $field) { 
    $find = 'user_'; 
    if (strpos($value, $find) != 0) { 
     $this->form_validation->set_field_error($field, sprintf('Username not allowed.')); 
    } 
    return (strpos($value, $find) != 0); 
} 

function passwordNotEmpty($value, $field) { 
    if (empty($value)) { 
     $this->form_validation->set_field_error($field, sprintf('Password cannot be blank.')); 
    } 
    return (empty($value)); 
} 

ich auch die Funktion set_field_error zum Form_validation Klasse hinzugefügt zu können, legen Sie benutzerdefinierte Fehlermeldungen: Die

public function set_field_error($field, $value) 
{ 
    if (isset($this->_field_data[$field])) 
     $this->_field_data[$field]['error'] = $value; 
    return; 
} 

Damit kann ich jetzt nutzen Modellfunktion validationErrors in der Steuerung wie:

Nochmals vielen Dank an die Leute, die mir bei dieser Problemumgehung geholfen haben. Ich hoffe, dass dies anderen helfen kann, das gleiche Problem wie ich zu haben. Diese

+1

Ich bin froh, dass du das geschafft hast. Ermutigen Sie Ihr Unternehmen definitiv dazu, auf Version 3 zu aktualisieren - es ist relativ einfach zu machen und neben der zusätzlichen Sicherheit - seine viel schnellere Leistung. – cartalot

2

Rufen Sie die zusätzlichen Methoden separat mag:

// in Model 
function validateErrors() { 
    $rules = array(
     array('field'=>'username', 'label'=>'User', 'rules'=>'trim|required'), 
     array('field'=>'password', 'label'=>'Password', 'rules'=>'trim|required'), 
    ); 

    $this->load->library('form_validation'); 
    $this->form_validation->set_rules($rules); 

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

     // something something 
    } 
    // 
    elseif($this->userPrefix() == false) 
    { 
     // something 
    } 
    elseif($this->passwordNotEmpty() == false) 
    { 
     // something 
    } 
    else{ return true; } 

} 

Rückrufe sind sehr schön, wenn Sie eine Reihe von Daten - wie wenn Sie eine Gruppe von Benutzernamen Validierung wurden, wo das Feld Benutzername ist []. Aber ich habe gerade einige Fragen über Callbacks gestellt, die es tun können und was nicht, und ich denke, dass der obige Code tatsächlich klarer ist. Auch fyi - $ this-> input-> post ('fieldname') - ist immer in Ihrem Modell verfügbar. Mit anderen Worten, es hängt nicht davon ab, Teil der Validierung des Codeigniters zu sein.

0

basiert auf Idee @ cartalot, wäre es besser, dies zu tun, weil diese alle Methoden benutzerdefinierte Validierung überprüfen, wenn die Validierung fehlschlägt:

if ($this->form_validation->run() == FALSE) { 
     $standard_error = form_error($field) 
     if($model_object->model_method($post_value['some]) == FALSE) 
     { 
      //here manually fill error for display on form 
     } 
     if($model_object->model_method2($post_value['some2]) == FALSE) 
     { 
      //here manually fill error for display on form 
     } 
    } 

EDIT (für CI3): Noch besser, könnte man Definieren Sie die Modellmethode, die nur das Regelarray zurückgibt, und dann vor der Validierung -> run() richten Sie diese Regel (n) aus Ihrem $ model_object-> method_that_returns_rule_array() ein.Diese Regel (en) kann aufrufbare anonyme Funktion enthalten - more info here

Verwandte Themen