Bagaimana cara saya mendapatkan ID simpul dari URL?

47

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?

sutra sutera
sumber
Apakah Anda melakukan ini di node.tpl.php atau sesuatu seperti itu? Jika ya, Anda bisa menggunakan $ node-> nid.
Bart
Tidak, saya melakukan ini dalam fungsi preprocess blok, meskipun blok tidak dicetak pada halaman node.
silkAdmin

Jawaban:

63

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 example.com/node/1, maka 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.
  • 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) untuk 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 merender 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 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.

kiamlaluno
sumber
7

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.

Bart
sumber
4

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];
iStryker
sumber
3
arg(1);

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

Jeremy French
sumber
Ini benar, itu tidak akan terpengaruh oleh alias path. Tetapi jika Anda berada di node / XXXXX, maka Anda bisa menggunakan $ node-> nid. @ Prancis, di mana lagi Anda akan menggunakan arg (1) dan itu akan mengembalikan apa yang Anda inginkan?
iStryker
jika Anda berada di pengait modul Anda tidak akan memiliki akses ke node. Argumen tampilan dapat menjadi contoh juga.
Jeremy French
terima kasih jeremy dan istryker, saya telah memperbarui pertanyaan saya mungkin lebih jelas .. Meskipun saya akan mencoba kedua solusi Anda, terima kasih
silkAdmin
1
Ini adalah ide yang sangat buruk untuk menggunakan arg (), Anda mengikat diri sendiri ke jalan, gunakan menu_get_object(yang hanya membungkus menu_get_itemsehingga 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.
leymannx
2

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