回答:
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公開モジュール偽のフィールドを。
hook_field_extra_fields()
これは、管理者ユーザーがフィールドがレンダリングされる、または編集フォームに表示される順序を変更できるようにするために使用されます。通常、フィールドを実装するモジュールは、そのフックも実装します。
_field_extra_fields_pre_render()
プレレンダリング関数です。つまり、レンダリングされる直前にフォーム配列を変更します。フィールドがフィールドAPIを使用して実装されていない場合は、通常のように、フィールドをノード編集フォームに追加するだけです。フィールドAPIを使用して実装されたフィールドの場合、これ以上何もする必要はありません。フィールドAPIから必要なすべての関数を実装すると、フィールドがノードに追加されます。
これは、フィールド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>',
);
}
}