Wie soll ich hook_field_extra_fields () verwenden?


6

Ich habe gerade davon erfahren hook_field_extra_fields(), aber die Dokumentation sagt mir nicht wirklich, wie ich es verwenden soll.

Wo wird die Ausgabe der zusätzlichen Felder generiert?

Ich habe mich sehr bemüht, die Node- und Poll-Module zu verstehen, kann es aber nicht herausfinden. Ich habe auch versucht, einen benutzerdefinierten Feldformatierer hinzuzufügen.

Antworten:


6

hook_field_extra_fields()wird von _field_extra_fields_pre_render () aufgerufen , einer Pre-Render-Funktion, die von field_attach_form () und field_attach_view () verwendet wird .

/**
 * Pre-render callback to adjust weights and visibility of non-field elements.
 */
function _field_extra_fields_pre_render($elements) {
  $entity_type = $elements['#entity_type'];
  $bundle = $elements['#bundle'];

  if (isset($elements['#type']) && $elements['#type'] == 'form') {
    $extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
    foreach ($extra_fields as $name => $settings) {
      if (isset($elements[$name])) {
        $elements[$name]['#weight'] = $settings['weight'];
      }
    }
  }
  elseif (isset($elements['#view_mode'])) {
    $view_mode = $elements['#view_mode'];
    $extra_fields = field_extra_fields_get_display($entity_type, $bundle, $view_mode);
    foreach ($extra_fields as $name => $settings) {
      if (isset($elements[$name])) {
        $elements[$name]['#weight'] = $settings['weight'];
        // Visibility: make sure we do not accidentally show a hidden element.
        $elements[$name]['#access'] = isset($elements[$name]['#access']) ? ($elements[$name]['#access'] && $settings['visible']) : $settings['visible'];
      }
    }
  }

  return $elements;
}

Mit diesen Funktionen sollten Sie den Hook nicht direkt aufrufen. Diese Funktionen werden bereits für Entitäten verwendet, die Drupal kennt. Wenn Sie ein Feld für Knoten implementieren, müssen Sie lediglich den Hook implementieren.

Ein Beispiel für die hook_field_extra_fields()Implementierung ist mollom_field_extra_fields () .

function mollom_field_extra_fields() {
  $extras = array();
  $forms = array_flip(db_query('SELECT form_id FROM {mollom_form}')->fetchCol());
  foreach (mollom_form_list() as $form_id => $info) {
    // @todo Technically, an 'entity' does not need to be a Entity/Field API
//   kind of entity. Ideally of course, developers should use fieldable
//   entities, but contributed/custom code may not. It is not clear whether
//   registering extra fields for non-existing entities/bundles can break
//   anything, so leaving it this way for now.
    if (isset($info['entity']) && isset($forms[$form_id])) {
      // If the entity type does not implement bundles, then entity_get_info()
      // assumes a single bundle named after the entity.
      $entity_type = $info['entity'];
      $bundle = (isset($info['bundle']) ? $info['bundle'] : $entity_type);

      $extras[$entity_type][$bundle]['form']['mollom'] = array(
        'label' => t('Mollom'), 
        'description' => t('Mollom CAPTCHA or privacy policy link'), 
        'weight' => 99,
      );
    }
  }
  return $extras;
}

Durch diesen Code können Administratorbenutzer die Reihenfolge ändern, in der Felder beim Rendern der Entität gerendert oder beim Bearbeiten der Entität im Bearbeitungsformular angezeigt werden. Das Feld-UI- Modul stellt eine Benutzeroberfläche bereit, mit der Benutzer mit der richtigen Berechtigung (normalerweise Administratorbenutzer) diese falschen Felder sortieren können.


Vielen Dank für die Erklärung, aber ich verstehe noch nicht, wo die Ausgabe (oder das Formularelement) des zusätzlichen Felds erstellt wird. (Mit wo meine ich den Hook / die Funktion / was auch immer im Quellcode.) In meinem Fall habe ich einige willkürliche Daten, die lose mit Knoten korreliert sind und in einem anderen Subsystem schweben, das ich als Felder für Anzeigemodi verfügbar machen möchte . Ich dachte, diese zusätzlichen Felder sind der richtige Weg? Oder liege ich falsch?
Philipp Melab

hook_field_extra_fields()wird verwendet, damit Administratorbenutzer die Reihenfolge ändern können, in der Felder gerendert oder im Bearbeitungsformular angezeigt werden. Normalerweise implementiert jedes Modul, das Felder implementiert, auch diesen Hook.
Kiamlaluno

Jetzt hab ich es verstanden! Ich suchte nach einem Display-Haken für mein zusätzliches Feld. Aber ich muss es einfach in hook_entity_view_alter oder ähnlichem hinzufügen, oder? Danke, dass du mich in die richtige Richtung gestoßen hast!
Philipp Melab

_field_extra_fields_pre_render()ist eine Pre-Render-Funktion, dh, sie ändert das Formulararray unmittelbar vor dem Rendern. Wenn Ihr Feld nicht über die Feld-API implementiert wird, müssen Sie es nur wie gewohnt zum Knotenbearbeitungsformular hinzufügen. Wenn es sich um ein Feld handelt, das mithilfe der Feld-API implementiert wurde, müssen Sie nichts weiter tun. Das Feld wird dem Knoten hinzugefügt, wenn Sie alle von der Feld-API erforderlichen Funktionen implementieren.
Kiamlaluno

17

Dies ist ein einfaches Beispiel, das zeigt, wie der Feldbenutzeroberfläche ein zusätzliches Feld hinzugefügt wird, und ein Beispiel für eine Möglichkeit, das Feld in einen Knoten einzufügen.

/**
 * Implements hook_field_extra_fields().
 */
function MODULE_field_extra_fields() {
  $extra['node']['article']['display']['extended_submitted_by'] = array(
    'label' => t('Extended Submitted By'),
    'description' => t('Provides Jumper Menu for Version Selection'),
    'weight' => 0,
  );
  return $extra;
}

/**
 * Implements hook_node_view().
 */
function MODULE_node_view($node, $view_mode, $langcode) {
  // Only add if the view mode is for a full view, although we 
  // could control this via the Field UI too using 'hidden'.
  if ($view_mode == 'full' && $node->type == 'article') {
    $node->content['extended_submitted_by'] = array(
      '#markup' => '<p>This is inserted unless hidden in the field ui.</p>',
    );
  }
}

Das ist die richtige Antwort.
Елин Й.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.