diff options
Diffstat (limited to 'sites/all/modules/ctools/plugins/content_types/form/entity_form_field.inc')
-rw-r--r-- | sites/all/modules/ctools/plugins/content_types/form/entity_form_field.inc | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/sites/all/modules/ctools/plugins/content_types/form/entity_form_field.inc b/sites/all/modules/ctools/plugins/content_types/form/entity_form_field.inc new file mode 100644 index 000000000..582bd785c --- /dev/null +++ b/sites/all/modules/ctools/plugins/content_types/form/entity_form_field.inc @@ -0,0 +1,167 @@ +<?php + +/** + * @file + * Handle rendering entity fields as panes. + */ + +$plugin = array( + 'title' => t('Entity field'), + 'defaults' => array('label' => '', 'formatter' => ''), + 'content type' => 'ctools_entity_form_field_content_type_content_type', +); + +/** + * Just one subtype. + * + * Ordinarily this function is meant to get just one subtype. However, we are + * using it to deal with the fact that we have changed the subtype names. This + * lets us translate the name properly. + */ +function ctools_entity_form_field_content_type_content_type($subtype) { + $types = ctools_entity_form_field_content_type_content_types(); + if (isset($types[$subtype])) { + return $types[$subtype]; + } +} + +/** + * Return all field content types available. + */ +function ctools_entity_form_field_content_type_content_types() { + // This will hold all the individual field content types. + $types = &drupal_static(__FUNCTION__); + if (isset($types)) { + return $types; + } + + $types = array(); + $content_types = array(); + $entities = entity_get_info(); + + foreach ($entities as $entity_type => $entity) { + foreach ($entity['bundles'] as $type => $bundle) { + foreach (field_info_instances($entity_type, $type) as $field_name => $field) { + if (!isset($types[$entity_type . ':' . $field_name])) { + $types[$entity_type . ':' . $field_name] = array( + 'category' => t('Form'), + 'icon' => 'icon_field.png', + 'title' => t('Field form: @widget_label', array( + '@widget_label' => t($field['label']), + )), + 'description' => t('Field on the referenced entity.'), + ); + } + $content_types[$entity_type . ':' . $field_name]['types'][$type] = $bundle['label']; + } + } + } + + if (module_exists('field_group')) { + foreach ($entities as $entity_type => $entity) { + foreach ($entity['bundles'] as $type => $bundle) { + if ($group_info = field_group_info_groups($entity_type, $type, "form")) { + foreach ($group_info as $group_name => $group) { + if (!isset($types[$entity_type . ':' . $group_name])) { + $types[$entity_type . ':' . $group_name] = array( + 'category' => t('Form'), + 'icon' => 'icon_field.png', + 'title' => t('Group form: @widget_label', array('@widget_label' => $group->label)), + 'description' => t('Field group on the referenced entity.'), + ); + } + $content_types[$entity_type . ':' . $group_name]['types'][$type] = $bundle['label']; + } + } + } + } + } + + // Create the required context for each field related to the bundle types. + foreach ($types as $key => $field_content_type) { + list($entity_type, $field_name) = explode(':', $key, 2); + $types[$key]['required context'] = new ctools_context_required(t(ucfirst($entity_type)), $entity_type, array( + 'form' => array('form'), + 'type' => array_keys($content_types[$key]['types']), + )); + unset($content_types[$key]['types']); + } + return $types; +} + +/** +* Render the custom content type. +*/ +function ctools_entity_form_field_content_type_render($subtype, $conf, $panel_args, $context) { + if (empty($context) || empty($context->data)) { + return; + } + + // Get a shortcut to the entity. + $entity = $context->data; + list($entity_type, $field_name) = explode(':', $subtype, 2); + + // Load the entity type's information for this field. + $ids = entity_extract_ids($entity_type, $entity); + $field = field_info_instance($entity_type, $field_name, $ids[2]); + + // Check for field groups. + if (empty($field) && module_exists('field_group')) { + $groups = field_group_info_groups($entity_type, $entity->type, "form"); + $group = !empty($groups[$field_name]) ? $groups[$field_name] : NULL; + } + + // Do not render if the entity type does not have this field or group. + if (empty($field) && empty($group)) { + return; + } + + $block = new stdClass(); + if (isset($context->form)) { + $block->content = array(); + if (!empty($field)) { + $block->content[$field_name] = $context->form[$field_name]; + unset($context->form[$field_name]); + } + else { + // Pre-render the form to populate field groups. + if (isset($context->form['#pre_render'])) { + foreach ($context->form['#pre_render'] as $function) { + if (function_exists($function)) { + $context->form = $function($context->form); + } + } + unset($context->form['#pre_render']); + } + + $block->content[$field_name] = $context->form[$field_name]; + unset($context->form[$field_name]); + } + } + else { + $block->content = t('Entity info.'); + } + + return $block; +} + +/** +* Returns the administrative title for a type. +*/ +function ctools_entity_form_field_content_type_admin_title($subtype, $conf, $context) { + list($entity_type, $field_name) = explode(':', $subtype, 2); + + if (!empty($context->restrictions)) { + $field = field_info_instance($entity_type, $field_name, $context->restrictions['type'][0]); + } + else { + $field = array('label' => $subtype); + } + + return t('"@s" @field form', array('@s' => $context->identifier, '@field' => $field['label'])); +} + +function ctools_entity_form_field_content_type_edit_form($form, &$form_state) { + // provide a blank form so we have a place to have context setting. + return $form; +} |