Codeigniter-Formularvalidierung – wie werden Formularwerte nach Erfolg zurückgesetzt?

Lesezeit: 5 Minuten

Benutzer-Avatar
BrynJ

Mir ist klar, dass diese Anforderung gegen das in der CI-Dokumentation bereitgestellte Beispiel verstößt (das eine separate „Erfolgs“-Seitenansicht empfiehlt), aber ich möchte eine bestimmte Formularansicht wiederverwenden, nachdem ein Formular erfolgreich gesendet wurde – wobei eine Erfolgsmeldung und dann eine angezeigt wird leeres Formular. Ich habe einige Möglichkeiten erfolglos ausprobiert, um die gesetzten Werte der Validierung zu löschen (unsetting $_POSTSetzen von Regeln/Feldern auf ein leeres Array und erneutes Ausführen der Validierung).

Ich könnte auf dieselbe Seite umleiten, aber dann müsste ich eine Sitzungsvariable setzen, um eine Erfolgsmeldung anzuzeigen – was ein chaotischer Ansatz ist.

Irgendwelche Ideen, wie man das oben genannte am besten erreicht?

  • Unsetting post sollte funktionieren. Kannst du einen Code posten

    – Galen

    10. Mai 2010 um 15:16 Uhr

  • Inwiefern sind die Dinge chaotisch, wenn auf sich selbst umgeleitet wird?

    – Teej

    12. Mai 2010 um 1:04 Uhr

Benutzer-Avatar
Teej

Auf sich selbst umleiten. Auf diese Weise wurden keine Übermittlungen durchgeführt … Dies gibt Ihnen auch eine Möglichkeit, die flash_data anzuzeigen.

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

    $this->form_validation->set_rules('firstname', 'First Name', 'required');
    $this->form_validation->set_rules('surname', 'Sur Name', 'required');

    if ($this->form_validation->run() === TRUE)
    {
                    // save data

        $this->session->set_flashdata('message', 'New Contact has been added');
        redirect(current_url());
    }

    $this->load->view('contacts/add', $this->data);

  • Absolut der beste Weg, damit umzugehen.

    – Zach

    11. Mai 2010 um 20:40 Uhr

  • Ich habe danach gesucht und denke, es ist der einzige Weg … obwohl ich es hasse, Erfolgs- / Fehlermeldungen in der Sitzung zu speichern.

    – Sheri

    19. November 2010 um 19:56 Uhr

  • Vielen Dank für diese Weisheiten 🙂

    – Markus

    21. Februar 2011 um 10:27 Uhr

  • Das Unglückliche an dieser Lösung ist, dass die Flashdaten verloren gehen, wenn die Umleitung nicht korrekt gerendert wird. Man müsste einen Rückruf für den Client codieren, um aktiv zu bestätigen, dass der Benutzer die Flashdaten erhalten hat, möglicherweise durch einen AJAX-Rückruf von einem Dialogfeld, das gerendert wird, obwohl dies auf JS-kompatible Clients beschränkt ist.

    – Urkunde02392

    9. Dezember 2012 um 19:53 Uhr

Benutzer-Avatar
d5avard

Eine andere Lösung, erweitern Sie die Bibliothek CI_Form_validation. Die Eigenschaft $_field_data ist geschützt, damit wir darauf zugreifen können:

class MY_Form_validation extends CI_Form_validation {

    public function __construct()
    {
        parent::__construct();
    }

    public function clear_field_data() {

        $this->_field_data = array();
        return $this;
    }
}

Und rufen Sie die neue Methode auf. Auf diese Weise können Sie Daten weitergeben, ohne Daten in der Sitzung zu speichern.

    class Item extends Controller
    {
        function Item()
        {
            parent::Controller();
        }

        function add()
        {
            $this->load->library('form_validation');
            $this->form_validation->set_rules('name', 'name', 'required');

            $success = false;

            if ($this->form_validation->run())
            {
                $success = true;
                $this->form_validation->clear_field_data();
            }

            $this->load->view('item/add', array('success' => $success));
        }
    }

  • Ich denke, diese ist viel besser als die gewählte Antwort, da sie innerhalb der Grenzen von CI funktioniert. Es ist auch von Natur aus sehr skalierbar, da es die Form_validation Library erweitert, was sehr OOP ist.

    – bereichern

    1. April 2013 um 15:44 Uhr


  • Der Konstruktor für die CI-Formularvalidierung erfordert das Regelarray

    – pgee70

    16. August 2017 um 12:57 Uhr

Benutzer-Avatar
bschäffer

Übergeben Sie eine WAHR/FALSCH-Variable an Ihre Ansichten, die die Werte des Formulars bedingt festlegt.

Der Controller

if($this->form_validation->run())
{
    $data['reset'] = TRUE;
}
else
{
    $data['reset'] = FALSE:
}

$this->load->view("form", $data);

Die Aussicht:

<input type="text" name="email" value="<?php echo ($reset) ? "" : set_value('email'); ?>" />

<input type="text" name="first_name" value="<?php echo ($reset) ? "" : set_value('first_name'); ?>" />

  • verwenden isset($reset) stattdessen, damit PHP den Fehler einer undefinierten Variable nicht kennzeichnet. Code wird zu: value="<?php echo isset($reset) ? "" : set_value('email'); ?>"

    – Cletus Ajibade

    13. August 2018 um 3:21 Uhr


Die set_value-Funktion holt ihren Wert aus dem Form_validation-Objekt und nicht aus dem $_POST-Array. Das Form_validation-Objekt speichert seine eigene Kopie der geposteten Werte in einer Variablen namens $_field_data.

Es ist ein Hack, aber Sie könnten diese Variable löschen, nachdem Sie eine erfolgreiche Übermittlung bearbeitet haben:

class Item extends Controller
{
    function Item()
    {
        parent::Controller();
        $this->load->model('item_model');
    }

    function add()
    {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('name', 'name', 'required');

        $success = false;

        if ($this->form_validation->run())
        {
            $this->item_model->add_item($this->input->post('name'));
            $success = true;

            // Look away now. Hack coming up!
            // Clear the form validation field data
            $this->form_validation->_field_data = array();
        }

        $this->load->view('item/add', array('success' => $success));
    }
}

Hoffe, das wäre hilfreich. Endlich verstehe ich das ganze Konzept der Erweiterung der Bibliothek. Alles, was Sie tun müssen, ist
Schritt 1: Erstellen Sie in diesem Verzeichnis “application/libraries/” eine Datei mit dem Namen “MY_Form_validation.php” mit dem folgenden PHP-Code

<?php if (!defined('BASEPATH')) exit('No direct script access allowed.');
class MY_Form_validation extends CI_Form_validation {

 public function MY_Form_validation() {
    parent::__construct();
  }

  public function unset_field_data()
    {    
        unset($this->_field_data);    
    }
}

Schritt 2: Dann nutzen Sie die Funktion “unset_field_data()” in Ihrem Controller. Zum Beispiel unten:

    if ($this->form_validation->run())
    {
        $this->item_model->add_item($this->input->post('name'));
        $success = true;

        $this->form_validation->unset_field_data();
    }

Benutzer-Avatar
quinny

Ich habe das gefunden, wo:

  1. Es gibt mehr als einen CI-Ansichtsteil, aus dem die Seite besteht, und ihre Controller-Methoden führen die Validierung durch
  2. Eine der Validierungen ist fehlgeschlagen und hat seit der letzten Seitenaktualisierung einen Fehler erzeugt, z. B. mit einem falsch formatierten oder eingegebenen Eingabefeldwert

Es reicht nicht aus, nur das Array „validation-rules“ zu löschen, Sie müssen auch das Array „validation-error“ löschen.

Zu diesem Zweck habe ich system/libraries/Form_Validation.php eine Methode wie folgt hinzugefügt:

public function clear_rules()
{
    $this->_error_array = array();
    $this->_field_data = array();
    return $this;
}

Die Rückgabe von $this ist wichtig, wenn Sie Ihre Formularvalidierungsmethoden verketten möchten.

Benutzer-Avatar
Bhunesh Satpada

In der neueren Version 3.X, um set_value zu löschen, $_POST=array() und $this->_field_data = array(); in MY_Form_validation.php Bibliothek. Versuchen

Löschen Sie die Formulardaten nach erfolgreichem Codeigniter mit PHP, nicht mit Jquery

1175480cookie-checkCodeigniter-Formularvalidierung – wie werden Formularwerte nach Erfolg zurückgesetzt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy