summaryrefslogtreecommitdiff
path: root/sites/all/modules/ctools/plugins/content_types/form/entity_form_field.inc
diff options
context:
space:
mode:
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.inc167
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;
+}