Tambahkan konten Anda sendiri ke simpul


8

Saya telah membuat modul yang menambahkan konten khusus ke sebuah simpul; Saya ingin menampilkan konten khusus ini dalam tampilan simpul. Saya pikir hook_node_view()adalah pengait yang tepat untuk digunakan, tetapi konten saya tidak ditampilkan.

apa yang saya dapatkan sejauh ini adalah kode berikut:

function mymodule_node_view($node, $view_mode = 'full', $langcode = NULL) {
$node->content['mymodule']['#items'][0] = array(
    'value' => theme('mymodule_output', array('mymodule_cid' => $node->mymodule_cid)),
    'summary' => '',
    'format' => 'full_html',
    'safe_value' => theme('mymodule_output', array('mymodule_cid' => $node->mymodule_cid)),
    'safe_summary' => '',
);
$node->content['mymodule']['#weight'] = 12; 
}

Adakah yang bisa membantu?

Jawaban:


19

TL; DR: Pengait sudah benar, tetapi $node->content['mymodule']['#items'][0]setidaknya harus mengandung salah satu dari indeks / properti array ini: " #markup " atau " #theme "; jika Anda tidak menggunakan salah satunya, Drupal tidak akan menghasilkan apa-apa.

Jika indeks array yang Anda gunakan adalah untuk properti yang ditangani oleh fungsi tema Anda, maka Anda harus menggunakan # di awal; misalnya "format" akan menjadi "#format" (hal yang sama berlaku untuk properti lainnya).

Lagi pula, tidak perlu menggunakan "format" seperti yang Anda lakukan (apa pun artinya); fungsi hanya menghasilkan HTML, seperti yang dilakukan pada contoh yang ditunjukkan pada contoh hook_node_view () .

function hook_node_view($node, $view_mode, $langcode) {
  $node->content['my_additional_field'] = array(
    '#markup' => $additional_field, 
    '#weight' => 10, 
    '#theme' => 'mymodule_my_additional_field',
  );
}

Jika Anda menginginkan beberapa contoh konkret dari implementasi pengait itu, Anda dapat melihat book_node_view () , statistics_node_view () , dan translation_node_view () .

function book_node_view($node, $view_mode) {
  if ($view_mode == 'full') {
    if (!empty($node->book['bid']) && empty($node->in_preview)) {
      $node->content['book_navigation'] = array(
        '#markup' => theme('book_navigation', array('book_link' => $node->book)), 
        '#weight' => 100,
      );
    }
  }

  if ($view_mode != 'rss') {
    book_node_view_link($node, $view_mode);
  }
}

Sebagai catatan, saya akan menambahkan bahwa Anda harus menggunakan karakter # hanya untuk properti, atau Anda akan membingungkan Drupal, yang mengharapkan agar karakter itu hanya digunakan untuk properti.
Bahkan, element_children () , yang mengembalikan daftar elemen turunan dari elemen yang dilewatkan sebagai argumen, menggunakan kode berikut:

  foreach ($elements as $key => $value) {
    if ($key === '' || $key[0] !== '#') {
      $children[$key] = $value;
      if (is_array($value) && isset($value['#weight'])) {
        $sortable = TRUE;
      }
    }
  }

Seperti yang Anda lihat, elemen yang nilai kuncinya dimulai dengan # tidak dianggap elemen anak; secara berbeda, Drupal tidak akan dapat menangani kasus seperti ini (kode ini benar-benar diterapkan oleh modul Drupal, modul Pencarian):

  $form['#action'] = url($action);
  // Record the $action for later use in redirecting.
  $form_state['action'] = $action;
  $form['#attributes']['class'][] = 'search-form';
  $form['module'] = array(
    '#type' => 'value',
    '#value' => $module,
  );
  $form['basic'] = array(
    '#type' => 'container',
    '#attributes' => array('class' => array('container-inline')),
  );
  $form['basic']['keys'] = array(
    '#type' => 'textfield', 
    '#title' => $prompt, 
    '#default_value' => $keys, 
    '#size' => $prompt ? 40 : 20, 
    '#maxlength' => 255,
  );
  // processed_keys is used to coordinate keyword passing between other forms
  // that hook into the basic search form.
  $form['basic']['processed_keys'] = array(
    '#type' => 'value',
    '#value' => '',
  );
  $form['basic']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Search'),
  );

Apakah $form['#action']dan $form['basic']['submit']elemen anak?

Sebagai catatan tambahan, saya akan menambahkan yang hook_view()dipanggil oleh Drupal hanya untuk modul yang mengimplementasikan tipe konten. Bahkan, implementasi dari hook itu dipanggil oleh node_build_content () menggunakan kode berikut:

  // The 'view' hook can be implemented to overwrite the default function
  // to display nodes.
  if (node_hook($node, 'view')) {
    $node = node_invoke($node, 'view', $view_mode, $langcode);
  }

Kode untuk node_invoke () adalah yang berikut:

  if (node_hook($node, $hook)) {
    $base = node_type_get_base($node);
    $function = $base . '_' . $hook;
    return ($function($node, $a2, $a3, $a4));
  }

Kode ini dipanggil $hookuntuk modul yang mengimplementasikan tipe konten dari node yang dikirimkan sebagai argumen.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.