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
$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 数据; f2
Der 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”为 f3
。 f2
中没有任何内容,因此根据 : '';
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 p> hinzugefügt und sichergestellt habe, dass die Zeichenfolge „test“ nicht im Feld angezeigt wird.
$user_search
Die Daten sind in Redis vorhanden und ich habe bestätigt, dass
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.
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.
您正在寻找的函数是
withData
。请记住,请求对象是不可变的,因此您需要将该函数调用的结果分配回请求对象,例如与$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar'))
。