it-swarm.com.de

Fügen Sie dem Knoten Ihren eigenen Inhalt hinzu

Ich habe ein Modul erstellt, das einem Knoten benutzerdefinierten Inhalt hinzufügt. Ich möchte diesen benutzerdefinierten Inhalt in der Knotenansicht anzeigen. Ich denke, hook_node_view() ist der richtige Hook, aber mein Inhalt wird nicht angezeigt.

was ich bisher bekommen habe, ist der folgende Code:

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

Kann jemand helfen?

8
caspermc

TL; DR: Der Hook ist korrekt, aber $node->content['mymodule']['#items'][0] Sollte mindestens einen dieser Array-Indizes/Eigenschaften enthalten: " #markup "oder" # theme "; Wenn Sie keinen von ihnen verwenden, gibt Drupal nichts aus.

Wenn sich die von Ihnen verwendeten Array-Indizes auf Eigenschaften beziehen, die von Ihrer Designfunktion verarbeitet werden, sollten Sie am Anfang # Verwenden. Zum Beispiel würde "Format" zu "#format" (dasselbe gilt für die anderen Eigenschaften).

Wie auch immer, es ist nicht erforderlich, "Format" wie Sie zu verwenden (welche Bedeutung es auch hat); Die Funktion gibt nur HTML aus, wie im Beispiel im Beispiel hook_node_view () gezeigt.

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

Wenn Sie konkretere Beispiele für diese Hook-Implementierungen wünschen, können Sie sich book_node_view () , statistics_node_view () und translation_node_view () ansehen.

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

Als Randnotiz möchte ich hinzufügen, dass Sie das Zeichen # Nur für Eigenschaften verwenden sollten, oder Sie werden Drupal verwirren, das erwartet, dass dieses Zeichen nur für Eigenschaften verwendet wird.
Tatsächlich verwendet element_children () , das die Liste der untergeordneten Elemente des als Argument übergebenen Elements zurückgibt, den folgenden Code:

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

Wie Sie sehen, werden Elemente, deren Schlüsselwert mit # beginnt, nicht als untergeordnete Elemente angesehen. anders, Drupal wäre nicht in der Lage, einen Fall wie diesen zu behandeln (der Code wird wirklich von einem Drupal Modul, das Suchmodul) implementiert:

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

Sind $form['#action'] Und $form['basic']['submit'] Untergeordnete Elemente?

Als weitere Randnotiz möchte ich hinzufügen, dass hook_view() von Drupal nur für die Module aufgerufen wird, die einen Inhaltstyp implementieren. Tatsächlich werden die Implementierungen dieses Hooks von aufgerufen node_build_content () mit folgendem Code:

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

Der Code für node_invoke () ist der folgende:

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

Der Code ruft $hook Für das Modul auf, das den Inhaltstyp des als Argument übergebenen Knotens implementiert.

19
kiamlaluno