Di situs web saya, pengguna dapat mengumpulkan beberapa 'poin' dari waktu ke waktu. Saya memiliki menu bilah atas dengan beberapa tautan (mis. "Rumah", "profil", "logout"). Saya ingin mengubah item menu "profil" dan menambahkan poin nomor yang dimiliki oleh pengguna yang terhubung saat ini.
Saya mencoba beberapa kail, dan saya hampir berhasil mendapatkan apa yang saya inginkan hook_link_alter()
.
function mycustommodule_link_alter(&$variables) {
if ($variables['text'] == "profile") {
// Do some work.
$variables['text'] = $variables['text'] . " (you have $nb_points points)";
}
}
Saya menghapus cache (dengan drush cr
), dan item menu menunjukkan nilai yang saya inginkan. Tetapi, jika nilainya berubah karena suatu alasan, itu menunjukkan nilai yang lama. Saya harus menghapus cache setiap saat untuk memperbarui nilainya.
Bagaimana saya bisa menghindari pembersihan cache untuk memperbarui judul menu setiap kali poin yang diperoleh dari pengguna berubah?
sumber
Jawaban:
Saya sarankan menerapkan plugin tautan menu kustom. Kode di bawah ini mengasumsikan nama modul Anda adalah contoh .
Jika Anda tidak ingin menyuntikkan layanan basis data, kelas akan menjadi lebih sederhana.
Selanjutnya Anda perlu memasukkan definisi tautan ke file example.links.menu.yml .
Masalah caching
Setiap kali jumlah poin diubah, cache tautan menu harus tidak valid sebagai berikut.
Anda perlu mencari tempat yang tepat untuk ini. Jika poin dikelola oleh modul yang disumbang, periksa API modul dan ambil kait yang sesuai ( hook_points_insert () , hook_points_delete () dan sebagainya).
Karena jumlah poin dihitung untuk setiap akun pengguna secara individual, Anda dapat mempertimbangkan untuk menggunakan tag cache setiap akun (sekitar
['example.points_count.' . $uid]
). Karenanya cache akan disimpan untuk pengguna dengan poin yang tidak berubah.Untuk menghasilkan kode untuk plugin tautan Menu, saya menggunakan Drupal Code Generator .
sumber
Saya menghadapi masalah yang sama. Item menu di-cache, sehingga selalu menampilkan nilai lama sampai Anda menghapus cache. Cara alternatif adalah menggunakan
hook_page_attachments()
, lampirkan poin ke drupalSettings.YOUR_MODULE_OR_THEME.YOUR_VARIABLE, dan akses di JavaScript, dan render di browser.Cara normal adalah menonaktifkan cache untuk halaman setiap kali menu "profil" ditampilkan pada kinerja situs.
sumber
Nonaktifkan cache untuk menu itu
hook_preprocess_menu()
dengan mengatur$variables['#cache']['max-age']
ke 0.sumber