You are here

function ctools_entity_from_field_context in Chaos Tool Suite (ctools) 7

Return a new context based on an existing context.

1 string reference to 'ctools_entity_from_field_context'
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 156
Plugin to provide an relationship handler for an entity from a field.

Code

function ctools_entity_from_field_context($context, $conf) {

  // Perform access check on current logged in user.
  global $user;

  // Clone user object so account can be passed by value to access callback.
  $account = clone $user;
  $delta = !empty($conf['delta']) ? intval($conf['delta']) : 0;
  $plugin = $conf['name'];
  list($plugin, $plugin_name) = explode(':', $plugin);
  list($field_name, $from_entity, $to_entity) = explode('-', $plugin_name);

  // If unset it wants a generic, unfilled context, which is just NULL.
  $entity_info = entity_get_info($from_entity);
  if (empty($context->data) || !isset($context->data->{$entity_info['entity keys']['id']})) {
    return ctools_context_create_empty('entity:' . $to_entity, NULL);
  }
  if (isset($context->data->{$entity_info['entity keys']['id']})) {

    // Load the entity.
    $id = $context->data->{$entity_info['entity keys']['id']};
    $entity = entity_load($from_entity, array(
      $id,
    ));
    $entity = $entity[$id];
    if ($items = field_get_items($from_entity, $entity, $field_name)) {
      if (isset($items[$delta])) {
        ctools_include('fields');
        $to_entity_info = entity_get_info($to_entity);
        $plugin_info = ctools_get_relationship($conf['name']);
        $to_entity_id = $items[$delta][$plugin_info['source key']];
        $loaded_to_entity = entity_load($to_entity, array(
          $to_entity_id,
        ));
        $loaded_to_entity = array_shift($loaded_to_entity);

        // Pass current user account and entity type to access callback.
        if (isset($to_entity_info['access callback']) && function_exists($to_entity_info['access callback']) && !call_user_func($to_entity_info['access callback'], 'view', $loaded_to_entity, $account, $to_entity)) {
          return ctools_context_create_empty('entity:' . $to_entity, NULL);
        }
        else {

          // Send it to ctools.
          return ctools_context_create('entity:' . $to_entity, $to_entity_id);
        }
      }
      else {

        // In case that delta was empty.
        return ctools_context_create_empty('entity:' . $to_entity, NULL);
      }
    }
  }
}