2016-04-28 9 views
1

Ich schreibe etwas, wo ich, wenn Sie eine bestimmte Schaltfläche oder ein Dropdown wählen, möchte ich die Regeln eines bestimmten Feldes ändern. Grundsätzlich ist die Logik, überprüfen Sie eine Schaltfläche oder wählen Sie eine ID aus einer Auswahl und Sie müssen die Adressfelder nicht ausfüllen. Ich habe versucht, was in der form_validation zu tun, anstatt in er-Controller, wo ich eigentlich so etwas wie dieser So Regel aus Codezeichner entfernen aus MY_Form_validation

if(isset($_POST['checkbox'])){ 
    //check rules 
} 

tun konnte ich dies getan habe:

public function check_address($str,$prefix=null){ 
    $this->set_message('check_address','Please select an address or fill out a new one'); 
    //var_dump($this->_field_data);exit; 
    $remove=array('address_line1','address_line2','address_line3','city','postcode'); 
    if($prefix!==null){ 
     foreach($remove as &$r){ 
      $r=$prefix.'_'.$r; 
     } 
    } 
    unset($r); 
    foreach($this->_field_data as $key=>$f){ 
     if(in_array($key,$remove)){ 
      unset($this->_field_data[$key]); 
     } 
    } 
} 

Dies funktioniert so, wie ich will es aber ich glaube ich habe mich in die Form_Validation Klasse von codiegninter eingemischt, da es einen Fehler anzeigt, der besagt, dass die benötigten Indizes in meinem Array nicht gesetzt sind.

Die Fehlermeldung

A PHP Error was encountered 
Severity: Notice 
Message: Undefined index: billing_address_line1 
Filename: libraries/Form_validation.php 
Line Number: 481 

mir wirklich nicht zu sicher bin, wie ich erreichen kann, was ich codeigniter Bedürfnisse, ohne dich mit dem, was zu tun? Gibt es ein anderes Array, das ich entfernen muss, damit der Schlüssel nicht sortiert wird?

Ich habe auch diese jetzt getan

foreach($this->_field_data as $key=>&$f){ 
     if(in_array($key,$remove)){ 
      //unset($this->_field_data[$key]); 
      //str_replace('/required\|/','',$f['rules']); 
      //str_replace('/required/','',$f['rules']); 
      foreach($f['rules']as$r=>$val){ 
       $val=strtolower($val); 
       if($val=='required')unset($f['rules'][$r]); 
      } 
      var_dump($f); 
     } 
    } 
    unset($f); 

jetzt Dies ist, was durch das Entfernen der Regel erforderlich ist erforderlich, aber die gewünschte Funktion Ich denke, must've bereits laufen?

Array von Regeln

$this->con['validation']['checkout']=array(


     array('field'=>'address_line1','label'=>'Address line 1','rules'=>'required|min_length[3]|max_length[200]|check_basket'), 
     array('field'=>'address_line2','label'=>'Address line 2','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'address_line3','label'=>'Address line 3','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'city','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[50]'), 
     array('field'=>'postcode','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[9]|valid_postcode'), 

     array('field'=>'shipping_addressID','label'=>'Address','rules'=>'check_address[]'), 


     array('field'=>'billing_address_line1','label'=>'Billing address line 1','rules'=>'required|min_length[3]|max_length[200]'), 
     array('field'=>'billing_address_line2','label'=>'Billing address line 2','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'billing_address_line3','label'=>'Billing address line 3','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'billing_city','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[50]'), 
     array('field'=>'billing_postcode','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[9]|valid_postcode'), 
     array('field'=>'billing_address_same','label'=>'Billing Address','rules'=>'check_address[billing]'), 
     array('field'=>'billing_addressID','label'=>'Billing address','rules'=>'check_address[billing]') 
    ); 
+0

Was ist der Zweck der Felder "* _addressID"? – DFriend

+0

@DFriend Da ich in der Lage sein möchte, eine Adresse in eine Datenbank aufzunehmen und sie erneut auszuwählen, wenn derselbe Benutzer zurückkehrt, um zu vermeiden, dass dieselbe Adresse mehr als einmal eingegeben wird. Deshalb habe ich '* _addressID' und wenn keine '* _addressID' ausgewählt ist, dann muss der Benutzer die Adressfelder ausfüllen, die sich auf diese Adresse beziehen, sei es Versand oder Rechnungsstellung. – sourRaspberri

Antwort

0

Ich denke, die einfachste Lösung die beste ist. Fügen Sie im Controller die Regel hinzu, wenn das Kontrollkästchen aktiviert ist.

if(isset($_POST['checkbox'])){ 
    $this->form_validation->set_rules('billing_address_line1', 'Billing Address Line 1', 'required'); 
} 

Added nach Kommentaren und Frage bearbeitet

immer noch nach der einfachsten Implementierung Streben während foreach Schleifen zu vermeiden eine Reihe von String-Manipulation verwendet, und mehr Regeln Arrays, die fast identisch sind.

Dies macht Gebrauch von der Tatsache, dass form_validation->set_rules() kann ein Array im dritten Argument (anstelle der Rohr-getrennte Zeichenfolge) akzeptieren. Die Zeichenfolge wird schließlich trotzdem in ein Array umgewandelt, daher ist es zur Laufzeit effizienter, mit einem Array zu beginnen.

Auch im Namen der effizienten Laufzeit wird beim Festlegen von Regeln die Methodenverkettung verwendet.

Beginnen Sie mit der Erstellung von wiederverwendbaren "Regeln" -Arrays, die an set_rules() übergeben werden.

$rules_address1 = ['required', 'min_length[3]', 'max_length[200]', 'callback_check_basket']; 
$rules_address_23 = ['min_length[3]', 'max_length[200]']; 
$rules_city = ['required', 'min_length[3]', 'max_length[50]']; 
$rules_postcode = ['required', 'min_length[3]', 'max_length[9]', 'callback_valid_postcode']; 

$this->form_validation->set_message('required', 'You must provide {field}.'); 

$this->form_validation 
    ->set_rules('address_line1', 'Address line 1', $rules_address1) 
    ->set_rules('address_line2', 'Address line 2', $rules_address_23) 
    ->set_rules('address_line3', 'Address line 3', $rules_address_23) 
    ->set_rules('city', 'Town/City', $rules_city) 
    ->set_rules('postcode', 'Postal Code', $rules_postcode); 

if(!isset($_POST['checkbox'])) 
{ 
    unset($rules_address1[0]); 
    unset($rules_address_23[0]); 
    unset($rules_city[0]); 
    unset($rules_postcode[0]); 
} 

$this->form_validation 
    ->set_rules('billing_address_line1', 'Billing Address line 1', $rules_address1) 
    ->set_rules('billing_address_line2', 'Billing Address line 2', $rules_address_23) 
    ->set_rules('billing_address_line3', 'Billing Address line 3', $rules_address_23) 
    ->set_rules('billing_city', 'Town/City', $rules_city) 
    ->set_rules('billing_postcode', 'Postal Code', $rules_postcode); 

ich übersprungen Regeln für den addressID Bereich (e), wie ich bin nicht sicher, wie es verwendet wird.

Auch, per CI SOP, hinzugefügt callback_ zu dem, was mir als benutzerdefinierte Callback-Methoden. Dementsprechend anpassen.

Wie Sie wissen, erfolgt dies alles in der Steuerung, bevor $this->form_validation->run() aufgerufen wird.

+0

Danke, aber ich möchte das Gegenteil tun: p Wenn das Kontrollkästchen gesetzt ist, möchte ich die Regel entfernen. Also müsste ich die Regeln grundsätzlich in 3 separate Arrays umschreiben und das möchte ich nicht. Ich scanne die form_validation-Klasse, um zu sehen, ob ich etwas finden kann, aber ich denke, weil diese Funktion in zwischen verschiedenen Funktionen Regeln aufgerufen wird, funktioniert es möglicherweise nicht? – sourRaspberri

+0

Ich habe das Array hinzugefügt, die Methode, über die Sie sprechen, beinhaltet das Manipulieren des Arrays, bevor Sie die Funktion 'run' starten. Also würde ich entweder eine foreach vor dem Lauf ausführen müssen oder 3 separate Arrays haben, um die verschiedenen Fehler nicht aufzunehmen, die ich nicht einschließen möchte. (Eigentlich denke ich, es ist 2 shh) – sourRaspberri

+0

Checkout die überarbeitete Antwort. – DFriend

0

Überprüfen Sie es aus Form Validierung Klasse.Rufen Sie Ihre eigene Validierungsmethode für Regeln auf, die Sie löschen möchten. https://codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

Dann in diesen Methoden, ob Checkbox aktiviert ist oder nicht. Wenn aktiviert, überspringe alle Regeln und gebe TRUE von der Callback-Funktion zurück. So etwas wie dieses:

address_line1_callback_function() { 
    CI = &get_instance(); 
    if (CI->input->post('checked')) 
     return true; 
    /// Rules for address line go here 
}