function ctools_entity_from_field_get_children

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

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