2 Stimmen

Überprüfen Sie, ob der Parameter festgelegt ist, bevor der Post-Wert in CodeIgniter überprüft wird

Ich erstelle so etwas wie einen Blog in CodeIgniter.
Ein wichtiger Aspekt eines Blogs ist die Erstellung und Aktualisierung von Beiträgen.

Ich möchte die Ansicht, die ich für das Erstellen eines Beitrags verwende, auch für das Aktualisieren wiederverwenden.
Dafür möchte ich die Beitragdaten an das Formular übergeben.

Wenn ein Validierungsfehler auftritt, sollte das Formular die übergebenen Daten anzeigen, anstatt die Parameterdaten.

Also möchte ich Daten an das Formular übergeben, aber nach dem Absenden soll die Methode set_value den Parameter überschreiben.

Bisher habe ich dieses Formular zum Erstellen eines Beitrags.
Wie bereits gesagt, möchte ich dieses Formular anpassen, damit ich es zur Aktualisierung eines Beitrags wiederverwenden kann.

' . $title . '';

    echo form_hidden('id', (isset($id) ? $id : '0'));
    echo form_input('title', set_value('title', 'Titel'), 'size="50"');
    echo '';
    echo form_textarea('content', set_value('content', ''));
    echo form_input('category', set_value('category', 'Kategorie'), 'size="50"');
    echo form_input('keywords', set_value('keywords', 'Schlüsselwörter'), 'size="50"');

    echo form_submit('submit', 'Absenden');
    echo '';

    echo form_fieldset_close();
    echo form_close();
?>

$function sollte create oder update enthalten.
$title ist Beitrag erstellen oder Beitrag aktualisieren und hat keinen Einfluss auf die Funktionalität des Formulars.
Ich habe bereits ein verstecktes Feld für die ID des Beitrags hinzugefügt, das beim Aktualisieren eines Beitrags verwendet wird.

Ich dachte daran, Parameter an die Ansicht zu senden und isset zu verwenden, um auf ihre Existenz zu prüfen, um so den Unterschied zwischen dem Erstellen oder Aktualisieren eines Beitrags zu machen. Aber das würde im Konflikt mit dem set_value stehen. Ich bin mir nicht ganz sicher, ob es möglich wäre, Daten an das Formular zu senden und welche Konsequenzen das hätte.

1voto

Dwayne Towell Punkte 7586

Ein Weg, dies zu lösen, besteht darin, das $_POST-Array mit Werten zu füllen, bevor die Ansicht geladen wird.

$_POST['title'] = $old_retrieved_title;
$_POST['content'] = $old_retrieved_content;
$_POST['category'] = $old_retrieved_category;
$_POST['keywords'] = $old_retrieved_keywords;
$this->load->view(...);

Dies ermöglicht es set_value(), die zuvor eingegebenen und aus Ihrer Datenbank (oder was auch immer) abgerufenen Werte zu sehen. Die CodeIgniter-Funktion set_value() ist darauf ausgelegt, ein Formular nach einer POST-Operation "neu aufzubauen", bei der die Übermittlung nicht einigen Anforderungen entsprach (normalerweise leere/falsche Felder). In diesem Fall ist der Wunsch, dem Benutzer gegenüber nett zu sein und die Werte der Felder auf die gerade übermittelten "alten" Feldwerte zu setzen. Um dies zu erreichen, sucht die Funktion in $_POST nach diesen Werten für die Felder (angenommen, Sie verwenden sie auf die übliche Weise, was Sie offensichtlich tun).

(In Bezug auf die Leistung: Jede durch das von mir vorgeschlagene verursachte Zusatzlast ist äußerst geringfügig und da die Operation ein klarer Teil einer Netzwerktransaktion ist, ist es äußerst unwahrscheinlich, dass sich dies in der Praxis messbar auswirkt.)

1voto

Trick Punkte 636

Während Sie jedem Wert von $_POST den richtigen Wert zuweisen könnten, könnten Sie Overhead verursachen, wenn Sie einige dieser Variablen nicht verwenden. Ein effizienterer Weg wäre:

$_POST['category'] = (isset($_POST['category'])?"my_catehory":"default_category"); 

Denken Sie jetzt daran, dass es effizienter wäre, wenn Sie auf zwanzig, dreißig usw. von insgesamt sechzig Variablen zugreifen, die gesamte $_POST-Variable zu füllen.

Ist das Speichern der Variablen in einer Session eine vernünftige Lösung? Dies würde die Arbeit ersparen, jedes Mal zu überlegen, ob $_POST jedes Mal gefüllt ist.

Schließlich, wenn Sie es füllen müssen:

function populate_post_vars() {
  $_POST['one'] = $old_retrieved_one;
  $_POST['two'] = $old_retrieved_two;
  if (!isset($POST['three']) $POST['three'] = '3';
  // Ich denke, Sie verstehen die Idee.
}

populate_post_vars();
$this->load->view(...); /*Dank an @Dwayne Towell für einige kleine Code-Hinweise*/

0voto

Florin Punkte 4956

Dies ist das, was ich verwende, um bei Validierungsfehlern beizubehalten, dass das Formular die übergebenen Daten anzeigt, anstelle der Parameterdaten. Setzen des übermittelten Werts in der set_value() Methode.

echo form_input('title', set_value('title', this->input->post('title') );

0voto

Sam Punkte 2641

Ich habe das gleiche gemacht wie du und für dasselbe eine Einreichungs- und Bearbeitungsansicht verwendet, so habe ich es gelöst.

function get_value($backup, $post_name) {
    $CI = &get_instance();
    if ($CI->input->server('REQUEST_METHOD') === 'POST') {
        return $CI->input->post($post_name);
    }

    if ($backup === null) {
        return "";
    }

    return $backup;
}

Und

function get_value_from_object($object, $field, $post_name) {
    $CI = &get_instance();

    if ($CI->input->server('REQUEST_METHOD') === 'POST') {
        return set_value($post_name);
    }

    if ($object === null) {
        return "";
    }

    return $object->$field; 
}

Je nach Art des Werts/Forums, den ich verwende, entscheide ich mich in der Regel für letzteres, wenn mein Formular ein Objekt darstellt.

Demonstriert wie folgt:-

Auf der Erstellungsseite wird $person null sein, also wird es zuerst versuchen, es aus POST zu nehmen, wenn es kein POST-Request war (d.h. die Formularübermittlung ist fehlgeschlagen); dann wird es einen leeren String zurückgeben.

Ansonsten wird es versuchen, das Attribut 'name' von $person zu nehmen, also $person->name

BEARBEITEN: Alle diese Funktionen befinden sich in einem von mir erstellten Helfer für Formularaktionen

0voto

Sie können nur dies verwenden:

if($this->input->post('post_value_name')){
     // code here. ...
}

mehr nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X