hook_field_extra_fields()をどのように使用すればよいですか?


6

私はについて知りましたhook_field_extra_fields()が、ドキュメントにはそれを使用する方法が本当に示されていません。

追加フィールドの出力はどこに生成されますか?

NodeモジュールとPollモジュールを理解しようと一生懸命に努力しましたが、理解できません。また、カスタムフィールドフォーマッターを追加しようとしました。

回答:


6

hook_field_extra_fields()_field_extra_fields_pre_render()によって呼び出されます。これは、field_attach_form()field_attach_view()によって使用される事前レンダリング関数です。

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

これらの関数を使用して、フックを直接呼び出さないでください。これらの関数は、Drupalが知っているエンティティにすでに使用されています。ノードのフィールドを実装する場合は、フックを実装するだけで済みます。

hook_field_extra_fields()実装の例は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;
}

そのコードの効果により、管理者ユーザーは、エンティティがレンダリングされるとき、またはエンティティが編集されるときに編集フォームに表示されるときに、フィールドがレンダリングされる順序を変更できます。フィールドUIは、右の許可(通常は管理者ユーザー)を持つユーザーは、これらの並べ替えを可能にするUI公開モジュールのフィールドを。


説明をありがとうございました、追加のフィールドの出力(またはフォーム要素)がどこに構築されるのかまだわかりません。(ここで、とは、ソースコード内のフック/関数/何でもいいことを意味します。)私の場合、ノードに緩く相関している任意のデータがあり、別のサブシステムで急上昇しており、表示モードのフィールドとして公開したいと思います。 。これらの余分なフィールドは行く方法だと思いましたか?それとも私は間違っていますか?
Philipp Melab、2011

hook_field_extra_fields()これは、管理者ユーザーがフィールドがレンダリングされる、または編集フォームに表示される順序を変更できるようにするために使用されます。通常、フィールドを実装するモジュールは、そのフックも実装します。
kiamlaluno

今やった!私は自分の追加フィールド用のディスプレイフックを探していました。しかし、私は単にそれをhook_entity_view_alterまたは同様のものに追加する必要がありますね?私を正しい方向に向けてくれてありがとう!
Philipp Melab、2011

_field_extra_fields_pre_render()プレレンダリング関数です。つまり、レンダリングされる直前にフォーム配列を変更します。フィールドがフィールドAPIを使用して実装されていない場合は、通常のように、フィールドをノード編集フォームに追加するだけです。フィールドAPIを使用して実装されたフィールドの場合、これ以上何もする必要はありません。フィールドAPIから必要なすべての関数を実装すると、フィールドがノードに追加されます。
kiamlaluno

17

これは、フィールドUIに追加フィールドを追加する方法を示す簡単な例であり、フィールドをノードに挿入する1つの方法の例を提供します。

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

これが正解です。
ЕлинЙ.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.