Anforderungsdaten festlegen – CakePHP 4
P粉212971745
P粉212971745 2024-03-26 14:02:51
0
1
442

Wir haben eine CakePHP 3.x-Anwendung, die wir auf die neueste CakePHP 4.x aktualisiert haben. Im Rahmen dieser Arbeiten haben wir auch von PHP 7 auf PHP 8 umgestellt.

Beim Testen der App ist uns aufgefallen, dass eine Funktion nicht mehr funktioniert.

Die Anwendung ist eine durchsuchbare Datenbank und zum Caching in Redis integriert. Eine dieser Funktionen bedeutet, dass Benutzersuchen zwischen dem erneuten Laden der Seite beibehalten werden. Dies wird erreicht, indem die serialisierten Formulardaten in Redis geschrieben und dann wieder in das Feld input in der Vorlage eingefügt werden. Dies bedeutet, dass Benutzer die von ihnen eingegebenen Suchbegriffe sehen können; sie müssen die Suchbegriffe nicht erneut eingeben, wenn die Seite aktualisiert wird.

Der Code zum erneuten Auffüllen der input Formularfelder in der

CakePHP 3.x-Anwendung sieht folgendermaßen aus:

$form_fields = ['f1', 'f2', 'f3'];
Das Array $form_fields 数组包含模板中 input$form_fields enthält die Namen der

Formulare in der Vorlage. Zum Beispiel:

<input type="text" name="f1">
$user_search 是从 Redis 获取并反序列化的数据数组。例如,我们可能有 $user_search['f1']$user_search['f3'] 包含 Redis 数据; f2Der nächste Teil des Codes füllt das Formular neu aus. In diesem Fall wird

nicht ausgefüllt, da der Benutzer nicht mit diesem Feld gesucht hat.

foreach ($form_fields as $form_field) {
    $this->request->getData()[$form_field] = (isset($user_search[$form_field])) ? $user_search[$form_field] : '';
}
In Cake 3.x-Anwendungen funktioniert das oben Genannte einwandfrei. Wenn die Seite neu geladen wird, werden die Formularfelder als Ergebnis der Datenanforderung durch set

festgelegt. In der obigen Schleife wird beispielsweise Folgendes ausgewertet:

$this->request->getData()['f1'] = 'foo';
$this->request->getData()['f3'] = 'bar';
f1,“bar”为 f3f2 中没有任何内容,因此根据 : '';Das bedeutet, dass die angeforderten Daten für „foo“

sind und die Bedingung sie auf die leere Zeichenfolge setzt.

In einer CakePHP 4.x-Anwendung funktioniert dies nicht : ''; 条件修改为 : 'test';; beim Neuladen der Seite werden nicht alle Formularfelder ausgefüllt. Ich habe bestätigt, dass sie nicht auf eine leere Zeichenfolge gesetzt werden, indem ich das oben erwähnte hinzugefügt und sichergestellt habe, dass die Zeichenfolge „test“ nicht im Feld angezeigt wird.

$user_searchDie Daten sind in Redis vorhanden und ich habe bestätigt, dass

das enthält, was oben gezeigt wird – mit anderen Worten, die Daten gehen nicht verloren, also haben wir das ausgeschlossen.

Wenn ich https://book.cakephp.org/4/en/controllers/request-response.html lese, sehe ich kein Beispiel für die Einstellung von Anforderungsdaten. Es gibt eine Methode , die das tut, was Sie erwarten – sie getData() liest die angeforderten Daten.

Gibt es eine Möglichkeit, die Anforderungsdaten in Cake 4.x so festzulegen, dass der obige Code funktionieren kann?

In normalem PHP entspricht das, was wir tun,

$_POST['f1'] = 'foo';
$_POST['f2'] = ''; // empty string as no value set by user
$_POST['f3'] = 'bar';

Soweit ich weiß, funktioniert dies in PHP und Sie können die Anforderungsdaten mit allem in Ihrem Code festlegen/überschreiben. Wenn das falsch ist, sagen Sie mir bitte, was ich tun soll.

Aus Gründen der Klarheit haben wir die Anforderungsdaten auf diese Weise eingerichtet, weil die Suche über einen Ajax-Aufruf erfolgt. Wenn der Benutzer zum ersten Mal die Suchkriterien eingibt, wurde die Seite noch nicht neu geladen, sodass die Formularfelder anscheinend korrekt ausgefüllt sind. Dieses Problem tritt auf, wenn die Seite neu geladen wird. In diesem Fall möchten wir das Formular erneut mit den eingegebenen Werten füllen, bevor wir die Seite neu laden.

P粉212971745
P粉212971745

Antworte allen(1)
P粉722521204

您正在寻找的函数是withData。请记住,请求对象是不可变的,因此您需要将该函数调用的结果分配回请求对象,例如与$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar'))

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage