Sejauh ini, saya menemukan 3 fungsi ini di Drupal 7, tetapi saya tidak begitu yakin apa perbedaan di antara mereka, dan mana yang lebih tepat untuk mendapatkan ID node dalam fungsi blok preproses.
Bisakah Anda memberi saya wawasan?
Sejauh ini, saya menemukan 3 fungsi ini di Drupal 7, tetapi saya tidak begitu yakin apa perbedaan di antara mereka, dan mana yang lebih tepat untuk mendapatkan ID node dalam fungsi blok preproses.
Bisakah Anda memberi saya wawasan?
Jawaban:
Saya tidak begitu yakin apa perbedaan di antara mereka
menu_get_object()
akan mengembalikan objek node untuk node yang ID-nya adalah 1; jika halaman yang ditampilkan adalah example.com/user/1, maka menu_get_object('user')
akan mengembalikan objek pengguna untuk pengguna yang ID-nya adalah 1. node_load
) untuk dipanggil untuk memuat objek yang sesuai dengan bagian dari jalur saat inidrupal_lookup_path("homepage")
akan kembali "node/1"
. Alias path dapat dikaitkan dengan jalur internal apa pun, tidak hanya untuk jalur simpul.dan mana yang lebih tepat untuk mendapatkan ID simpul dalam fungsi blok preproses.
Jika semua yang Anda ingin dapatkan adalah ID node dari node yang saat ini ditampilkan, maka Anda hanya perlu menggunakan kode berikut:
if (arg(0) == 'node') {
$nid = arg(1);
}
Jika Anda perlu mendapatkan objek node, maka Anda dapat menggunakan kode berikut:
if ($node = menu_get_object()) {
// Use the node object.
}
Dari potongan itu, yang kedua lebih baik, karena mengembalikan objek simpul yang benar untuk jalur internal seperti simpul / 1 / revisi / 3 / tampilan.
Ingatlah bahwa beberapa fungsi preproses, seperti yang untuk halaman, atau node, sudah memiliki a $variables['node']
. Ini berarti bahwa dalam kasus tersebut, Anda hanya perlu menggunakan cuplikan berikut dalam fungsi preproses Anda, tanpa khawatir tentang fungsi mana yang akan digunakan.
if (isset($variables['node'])) {
// Check the node ID or other properties.
}
Untuk fungsi preproses lainnya, periksa dokumentasi untuk melihat apakah ada variabel yang mengandung objek node. Sebagai contoh, itulah template_preprocess_comment()
yang menyediakan $variables['node']
fungsi preproses untuk komentar.
Cara melakukannya di template_preprocess_page Drupal Core :
Baris 2267 dari theme.inc dan selanjutnya:
if ($node = menu_get_object()) {
$variables['node'] = $node;
}
template_preprocess_page menggunakan menu_get_object . Setelah itu hanya masalah memeriksa apakah node didefinisikan dan mendapatkan $ node-> nid.
Satu hal yang harus Anda perhatikan adalah path alias.
drupal_get_normal_path($path)
untuk mendapatkan jalur saat ini gunakan variabel sistem $_SERVER["REQUEST_URI"]
(Jika Anda berada di halaman simpul yang dapat Anda panggil $node->uri['path']
, ini akan mengembalikan jalur non-alias. Kemudian lagi jika Anda berada di halaman simpul, Anda bisa menggunakan $node->nid
.)
ini akan mengembalikan simpul / XXXX
jadi coba sesuatu seperti
$node_path = explode('/', drupal_get_normal_path($path));
$nid = $node_path[1];
arg(1);
Bukan cara yang buruk untuk melakukannya. arg () bekerja di jalur internal, sehingga tidak akan terpengaruh oleh alias path.
menu_get_object
(yang hanya membungkus menu_get_item
sehingga sama-sama bagus).
if (arg(0) == 'node' && is_numeric(arg(1)))
maka arg(1)
hampir 99% akan mengembalikan Anda ID simpul. Tapi satu-satunya arg(1)
juga bisa mengembalikan banyak ID lainnya kepada Anda.
Di Drupal 8, Anda bisa mendapatkan argumen url berdasarkan apa yang ada di perutean.
Untuk mendapatkan id sendiri:
$nid = \Drupal::routeMatch()->getRawParameter('node');
Jika Anda berencana untuk memuat objek node, Anda bisa mendapatkannya dengan cara ini:
$node = \Drupal::routeMatch()->getParameter('node');
Untuk menemukan nama parameter, Anda dapat menggunakan:
$possible_parameters = \Drupal::routeMatch()->getParameters();