You are here

function ctools_entity_from_field_get_children in Chaos Tool Suite (ctools) 7

1 call to ctools_entity_from_field_get_children()
ctools_entity_from_field_get_child in plugins/relationships/entity_from_field.inc
1 string reference to 'ctools_entity_from_field_get_children'
entity_from_field.inc in plugins/relationships/entity_from_field.inc
Plugin to provide an relationship handler for an entity from a field.

File

plugins/relationships/entity_from_field.inc, line 27
Plugin to provide an relationship handler for an entity from a field.

Code

function ctools_entity_from_field_get_children($parent_plugin, $parent) {
  $cid = $parent_plugin['name'] . ':' . $parent;
  $cache =& drupal_static(__FUNCTION__);
  if (!empty($cache[$cid])) {
    return $cache[$cid];
  }
  ctools_include('fields');
  $entities = entity_get_info();
  $plugins = array();
  $context_types = array();

  // Get the schema information for every field.
  $fields_info = field_info_fields();
  foreach ($fields_info as $field_name => $field) {
    foreach ($field['bundles'] as $from_entity => $bundles) {
      foreach ($bundles as $bundle) {

        // There might be fields attached to bundles that are disabled (e.g. a
        // module that declared a node's content type, is now disabled), but the
        // field instance is still shown.
        if (!empty($entities[$from_entity]['bundles'][$bundle])) {
          $foreign_keys = ctools_field_foreign_keys($field_name);
          foreach ($foreign_keys as $key => $info) {
            if (isset($info['table'])) {
              foreach ($entities as $to_entity => $to_entity_info) {
                $from_entity_info = $entities[$from_entity];

                // If somehow the bundle doesn't exist on the to-entity,
                // skip.
                if (!isset($from_entity_info['bundles'][$bundle])) {
                  continue;
                }
                if (isset($to_entity_info['base table']) && $to_entity_info['base table'] == $info['table'] && array_keys($info['columns'], $to_entity_info['entity keys']['id'])) {
                  $name = $field_name . '-' . $from_entity . '-' . $to_entity;
                  $plugin_id = $parent . ':' . $name;

                  // Record the bundle for later.
                  $context_types[$plugin_id]['types'][$bundle] = $from_entity_info['bundles'][$bundle]['label'];

                  // We check for every bundle; this plugin may already have
                  // been created, so don't recreate it.
                  if (!isset($plugins[$plugin_id])) {
                    $plugin = $parent_plugin;
                    $replacements = array(
                      '@to_entity' => $to_entity_info['label'],
                      '@from_entity' => $from_entity_info['label'],
                      '@field_name' => $field_name,
                      '@field_label' => ctools_field_label($field_name),
                    );
                    $plugin['title'] = t('@to_entity from @from_entity (on @from_entity: @field_label [@field_name])', $replacements);
                    $plugin['keyword'] = $to_entity;
                    $plugin['context name'] = $name;
                    $plugin['name'] = $plugin_id;
                    $plugin['description'] = t('Creates a @to_entity context from @from_entity using the @field_name field on @from_entity.', $replacements);
                    $plugin['from entity'] = $from_entity;
                    $plugin['to entity'] = $to_entity;
                    $plugin['field name'] = $field_name;
                    $plugin['join key'] = $key;
                    $plugin['source key'] = current(array_keys($info['columns']));
                    $plugin['parent'] = $parent;
                    $plugins[$plugin_id] = $plugin;

                    /*
                    -- commented out until I figure out how to actually load the reverse properly.
                                        // Build the reverse
                                        $plugin = $parent_plugin;
                                        $name = $field_name . '-' . $from_entity . '-' . $to_entity . '-reverse';
                                        $plugin_id = $parent . ':' . $name;

                                        $plugin['title'] = t('@from_entity from @to_entity (on @from_entity: @field_name)', $replacements);
                                        $plugin['keyword'] = $to_entity;
                                        $plugin['context name'] = $name;
                                        $plugin['name'] = $plugin_id;
                                        $plugin['description'] = t('Creates a @from_entity context from @to_entity using the @field_name field on @from_entity.', $replacements);

                                        $plugin['from entity'] = $from_entity;
                                        $plugin['to entity'] = $to_entity;
                                        $plugin['field name'] = $field_name;
                                        $plugin['reverse'] = TRUE;
                                        $plugin['parent'] = $parent;

                                        // Since we can't apply restrictions on the reverse relationship
                                        // we just add the required context here.
                                        $plugin['required context'] = new ctools_context_required($to_entity_info['label'], $to_entity);

                                        $plugin_entities = array(
                                          'to' => array($from_entity => $from_entity_info),
                                          'from' => array($to_entity => $to_entity_info)
                                        );
                                        drupal_alter('ctools_entity_context', $plugin, $plugin_entities, $plugin_id);

                                        $plugins[$plugin_id] = $plugin;
                    */
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  foreach ($context_types as $key => $context) {
    list($parent, $plugin_name) = explode(':', $key);
    list($field_name, $from_entity, $to_entity) = explode('-', $plugin_name);
    $from_entity_info = $entities[$from_entity];
    $to_entity_info = $entities[$to_entity];
    $plugins[$key]['required context'] = new ctools_context_required($from_entity_info['label'], $from_entity, array(
      'type' => array_keys($context['types']),
    ));
    $plugin_entities = array(
      'to' => array(
        $to_entity => $to_entity_info,
      ),
      'from' => array(
        $from_entity => $from_entity_info,
      ),
    );
    drupal_alter('ctools_entity_context', $plugins[$key], $plugin_entities, $key);
  }
  drupal_alter('ctools_entity_contexts', $plugins);
  $cache[$cid] = $plugins;
  return $plugins;
}