Rumah > Soal Jawab > teks badan
Kami mempunyai aplikasi CakePHP 3.x yang telah kami kemas kini kepada CakePHP 4.x terkini. Sebagai sebahagian daripada kerja ini, kami juga menukar daripada PHP 7 kepada PHP 8.
Semasa menguji apl, kami mendapati bahawa ciri telah berhenti berfungsi.
Aplikasi ini adalah pangkalan data yang boleh dicari dan disepadukan dengan Redis untuk caching. Satu ciri sedemikian bermakna carian pengguna dikekalkan antara muat semula halaman. Ini dicapai dengan menulis data borang bersiri ke Redis dan kemudian mengisinya semula ke dalam medan input
dalam templat. Ini bermakna pengguna boleh melihat istilah carian yang mereka masukkan, mereka tidak perlu memasukkan semula istilah carian apabila halaman dimuat semula.
Kod untuk mengisi semula input
medan borang dalam aplikasi
$form_fields = ['f1', 'f2', 'f3'];Tatasusunan
$form_fields
数组包含模板中 input
$form_fields
mengandungi nama borang dalam templat. Contohnya:
<input type="text" name="f1">
$user_search
是从 Redis 获取并反序列化的数据数组。例如,我们可能有 $user_search['f1']
和 $user_search['f3']
包含 Redis 数据; f2
Bahagian seterusnya kod mengisi semula borang. Dalam kes ini, tidak diisi kerana pengguna tidak mencari menggunakan medan tersebut.
foreach ($form_fields as $form_field) { $this->request->getData()[$form_field] = (isset($user_search[$form_field])) ? $user_search[$form_field] : ''; }Dalam aplikasi Cake 3.x, perkara di atas berfungsi dengan baik. Apabila halaman dimuat semula, medan borang ditetapkan sebagai hasil daripada set meminta data, contohnya dalam gelung di atas ia menilai kepada:
$this->request->getData()['f1'] = 'foo'; $this->request->getData()['f3'] = 'bar';
f1
,“bar”为 f3
。 f2
中没有任何内容,因此根据 : '';
Ini bermakna data yang diminta untuk "foo" ialah dan syarat menetapkannya kepada rentetan kosong.
Dalam aplikasi CakePHP 4.x, ini tidak berfungsi : '';
条件修改为 : 'test';
; apabila halaman dimuat semula, semua medan borang tidak diisi. Saya telah mengesahkan bahawa mereka tidak ditetapkan kepada rentetan kosong dengan menambahkan p> yang dinyatakan di atas dan memastikan bahawa rentetan "ujian" tidak ditunjukkan dalam medan.
$user_search
Data wujud dalam Redis, dan saya telah mengesahkan bahawa
Apabila saya membaca https://book.cakephp.org/4/en/controllers/request-response.html, saya tidak nampak contoh tetapan getData()
permintaan data. Terdapat kaedah yang melakukan apa yang anda harapkan - ia membaca
Adakah cara untuk menetapkan data permintaan dalam Cake 4.x supaya kod di atas boleh berfungsi?
Dalam PHP biasa, apa yang kami lakukan adalah bersamaan dengan
$_POST['f1'] = 'foo'; $_POST['f2'] = ''; // empty string as no value set by user $_POST['f3'] = 'bar';Setahu saya ini adalah dan masih berfungsi dalam PHP anda boleh menetapkan/mengatasi data permintaan menggunakan apa-apa sahaja dalam kod anda; Jika ini salah, sila beritahu saya apa yang perlu saya lakukan. 🎜
Sekadar untuk kejelasan, sebab kami menyediakan data permintaan dengan cara ini adalah kerana carian dilakukan melalui panggilan ajax. Apabila pengguna mula-mula memasukkan kriteria carian, halaman belum dimuat semula, jadi medan borang kelihatan diisi dengan betul. Isu ini berlaku apabila halaman dimuat semula. Dalam kes ini, kami ingin mengisi semula borang dengan nilai yang mereka masukkan sebelum memuat semula halaman.
P粉7225212042024-03-27 00:28:36
Fungsi yang anda cari ialah withData
。请记住,请求对象是不可变的,因此您需要将该函数调用的结果分配回请求对象,例如与$this->setRequest($this->getRequest()->withData('f1', 'foo')->withData('f3', 'bar'))
.