it-swarm.asia

أضف المحتوى الخاص بك إلى العقدة

لقد قمت بإنشاء وحدة تضيف محتوى مخصص إلى العقدة ؛ أود عرض هذا المحتوى المخصص في عرض العقدة. أعتقد أن hook_node_view() هي الخطاف المناسب للاستخدام ، ولكن لا يتم عرض المحتوى الخاص بي.

ما حصلت عليه حتى الآن هو الرمز التالي:

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; 
}

يمكن لأي شخص أن يساعد؟

8
caspermc

TL؛ DR: الخطاف صحيح ، ولكن $node->content['mymodule']['#items'][0] يجب أن يحتوي على الأقل على أحد فهارس/خصائص المصفوفة: " #markup "or" # theme "؛ إذا كنت لا تستخدم أحدهم ، Drupal لن يخرج أي شيء.

إذا كانت فهارس المصفوفة التي تستخدمها مخصصة للخصائص التي تعالجها وظيفة السمة الخاصة بك ، فيجب عليك استخدام # في البداية ؛ على سبيل المثال "format" سيصبح "#format" (نفس الشيء ينطبق على الخصائص الأخرى).

على أي حال ، ليست هناك حاجة لاستخدام "التنسيق" كما تفعل (مهما كان معنى ذلك) ؛ تقوم الوظيفة فقط بإخراج HTML ، كما تم في المثال الموضح في المثال 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',
  );
}

إذا كنت ترغب في المزيد من الأمثلة الملموسة على عمليات الربط ، فيمكنك إلقاء نظرة على book_node_view () و Statistics_node_view () و 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);
  }
}

كملاحظة جانبية ، سأضيف أنه يجب عليك استخدام الحرف # فقط للممتلكات ، أو سوف تخلط بين دروبال ، الذي يتوقع أن يتم استخدام هذا الحرف فقط للممتلكات.
في الواقع ، element_children () ، التي تُرجع قائمة العناصر الفرعية للعنصر الذي تم تمريره كوسيطة ، تستخدم الكود التالي:

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

كما ترى ، فإن العناصر التي تبدأ قيمتها الأساسية بـ # لا تعتبر عناصر فرعية ؛ بشكل مختلف ، Drupal لن يكون قادرًا على التعامل مع حالة مثل هذه (يتم تنفيذ الرمز بالفعل بواسطة Drupal ، وحدة البحث):

  $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'),
  );

هل $form['#action'] و $form['basic']['submit'] عناصر فرعية؟

كملاحظة جانبية أخرى ، سأضيف أن hook_view() يتم استدعاؤها بواسطة Drupal فقط للوحدات التي تطبق نوع المحتوى. في الواقع ، يتم استدعاء عمليات تنفيذ هذا الخطاف بواسطة node_build_content () باستخدام الكود التالي:

  // 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);
  }

رمز node_invoke () هو التالي:

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

يستدعي الكود $hook للوحدة النمطية التي تنفذ نوع محتوى العقدة التي تم تمريرها كوسيطة.

19
kiamlaluno