Nous avons une application CakePHP 3.x que nous avons mise à jour vers la dernière version de CakePHP 4.x. Dans le cadre de ce travail, nous sommes également passés de PHP 7 à PHP 8.
Lors du test de l'application, nous avons remarqué qu'une fonctionnalité ne fonctionnait plus.
L'application est une base de données consultable et intégrée à Redis pour la mise en cache. L'une de ces fonctionnalités signifie que les recherches des utilisateurs sont préservées entre les rechargements de pages. Ceci est accompli en écrivant les données du formulaire sérialisé dans Redis, puis en les repeuplant dans le champ input
du modèle. Cela signifie que les utilisateurs peuvent voir les termes de recherche qu'ils ont saisis ; ils n'ont pas besoin de les saisir à nouveau lorsque la page est actualisée.
Le code pour repeupler les input
champs du formulaire dans l'application
$form_fields = ['f1', 'f2', 'f3'];Le tableau
$form_fields
数组包含模板中 input
$form_fields
contient les noms des formulaires du modèle. Par exemple :
<input type="text" name="f1">
$user_search
是从 Redis 获取并反序列化的数据数组。例如,我们可能有 $user_search['f1']
和 $user_search['f3']
包含 Redis 数据; f2
La partie suivante du code remplit à nouveau le formulaire. Dans ce cas, n'est pas renseigné car l'utilisateur n'a pas effectué de recherche à l'aide de ce champ.
foreach ($form_fields as $form_field) { $this->request->getData()[$form_field] = (isset($user_search[$form_field])) ? $user_search[$form_field] : ''; }Dans les applications Cake 3.x, ce qui précède fonctionne très bien. Lorsque la page se recharge, les champs du formulaire sont définis à la suite de la demande de données set, par exemple dans la boucle ci-dessus, il est évalué comme :
$this->request->getData()['f1'] = 'foo'; $this->request->getData()['f3'] = 'bar';
f1
,“bar”为 f3
。 f2
中没有任何内容,因此根据 : '';
Cela signifie que les données demandées pour "foo" sont et la condition la définit sur la chaîne vide.
Dans une application CakePHP 4.x, cela ne fonctionne pas : '';
条件修改为 : 'test';
lorsque la page se recharge, tous les champs du formulaire ne sont pas renseignés. J'ai confirmé qu'ils ne sont pas définis sur une chaîne vide en ajoutant le p> mentionné ci-dessus et en m'assurant que la chaîne "test" n'est pas affichée dans le champ.
$user_search
Les données existent dans Redis, et j'ai confirmé que
Quand je lis https://book.cakephp.org/4/en/controllers/request-response.html, je ne vois pas d'exemple de définition de getData()
données de requête. Il existe une méthode qui fait ce que vous attendez : elle lit
Existe-t-il un moyen de définir les données de la requête dans Cake 4.x afin que le code ci-dessus puisse fonctionner ?
En PHP normal, ce que nous faisons équivaut à
$_POST['f1'] = 'foo'; $_POST['f2'] = ''; // empty string as no value set by user $_POST['f3'] = 'bar';Pour autant que je sache, cela fonctionnait et fonctionne toujours en PHP, vous pouvez définir/remplacer les données de la requête en utilisant n'importe quoi dans votre code ; Si c'est faux, dites-moi ce que je dois faire. 🎜
Pour plus de clarté, la raison pour laquelle nous configurons les données de la demande de cette façon est que la recherche est effectuée via un appel ajax. Lorsque l'utilisateur saisit initialement les critères de recherche, la page n'est pas encore rechargée, les champs du formulaire semblent donc être correctement renseignés. Ce problème se produit lors du rechargement de la page. Dans ce cas, nous souhaitons repeupler le formulaire avec les valeurs saisies avant de recharger la page.
La fonction que vous recherchez est
withData
。请记住,请求对象是不可变的,因此您需要将该函数调用的结果分配回请求对象,例如与$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar'))
.