it-swarm-id.com

Bagaimana cara saya mendapatkan ID simpul dari URL?

Sejauh ini, saya menemukan 3 fungsi ini di Drupal 7, tapi saya tidak begitu yakin apa perbedaan di antara mereka, dan mana yang lebih tepat untuk mendapatkan ID simpul dalam fungsi blok preproses) .

Bisakah Anda memberi saya wawasan?

47
silkAdmin

Saya tidak begitu yakin apa perbedaan di antara mereka

  • menu_get_object () mengembalikan objek yang terkait dengan halaman yang sedang ditampilkan. Jika kode dieksekusi ketika Drupal menampilkan halaman contoh.com/node/1, maka menu_get_object() akan mengembalikan objek node untuk simpul yang ID-nya 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.
  • menu_get_item () mengembalikan array yang berisi indeks untuk setiap bidang yang terdapat dalam tabel "menu_router". Ini termasuk:
    • jalur: jalur saat ini dari menu panggil balik
    • load_functions: array nama fungsi (seperti node_load) dipanggil untuk memuat objek yang sesuai dengan bagian dari jalur saat ini
    • access_callback: panggilan balik yang memeriksa apakah pengguna yang saat ini masuk memiliki akses ke item menu
    • page_callback: nama fungsi yang membuat halaman
    • title: judul untuk halaman yang terkait dengan item menu
  • drupal_lookup_path () adalah fungsi yang mengembalikan Anda jalur internal yang terkait dengan alias dilewatkan sebagai argumen. Jika "beranda" adalah alias yang dikaitkan dengan example.com/node/1, maka drupal_lookup_path("homepage") akan mengembalikan "node/1". Alias ​​path dapat dikaitkan dengan jalur internal apa pun, tidak hanya ke jalur simpul.

dan yang lebih tepat untuk mendapatkan ID simpul dalam fungsi blok preprocess.

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 cuplikan tersebut, 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 simpul, sudah memiliki $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, itu adalah kasus untuk template_preprocess_comment() yang membuat $variables['node'] Tersedia untuk fungsi preprocess untuk komentar.

63
kiamlaluno

Bagaimana ini dilakukan di Drupal Core template_preprocess_page :

Baris 2267 dari theme.inc dan selanjutnya:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page using menu_get_object . Setelah itu hanya masalah memeriksa apakah node didefinisikan dan mendapatkan $ node-> nid.

7
Bart

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 Anda dapat memanggil $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];
4
iStryker
arg(1);

Bukan cara yang buruk untuk melakukannya. arg () bekerja di jalur internal, sehingga tidak akan terpengaruh oleh alias path.

3
Jeremy French

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();
2
oknate