danielebarchiesi@0: t("(Custom) Entity: Field Value"), danielebarchiesi@0: 'description' => t('Control access by entity field value.'), danielebarchiesi@0: 'callback' => 'ctools_entity_field_value_ctools_access_check', danielebarchiesi@0: 'default' => array('type' => array()), danielebarchiesi@0: 'settings form' => 'ctools_entity_field_value_ctools_access_settings', danielebarchiesi@0: 'settings form submit' => 'ctools_entity_field_value_ctools_access_settings_submit', danielebarchiesi@0: 'summary' => 'ctools_entity_field_value_ctools_access_summary', danielebarchiesi@0: 'get child' => 'ctools_entity_field_value_ctools_access_get_child', danielebarchiesi@0: 'get children' => 'ctools_entity_field_value_ctools_access_get_children', danielebarchiesi@0: ); danielebarchiesi@0: function ctools_entity_field_value_ctools_access_get_child($plugin, $parent, $child) { danielebarchiesi@0: danielebarchiesi@0: $plugins = &drupal_static(__FUNCTION__, array()); danielebarchiesi@0: if (empty($plugins[$parent . ':' . $child])) { danielebarchiesi@0: list($entity_type, $bundle_type, $field_name) = explode(':', $child); danielebarchiesi@0: $plugins[$parent . ':' . $child] = _ctools_entity_field_value_ctools_access_get_child($plugin, $parent, $entity_type, $bundle_type, $field_name); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $plugins[$parent . ':' . $child]; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function ctools_entity_field_value_ctools_access_get_children($plugin, $parent) { danielebarchiesi@0: $plugins = &drupal_static(__FUNCTION__, array()); danielebarchiesi@0: if (!empty($plugins)) { danielebarchiesi@0: return $plugins; danielebarchiesi@0: } danielebarchiesi@0: $entities = entity_get_info(); danielebarchiesi@0: foreach ($entities as $entity_type => $entity) { danielebarchiesi@0: foreach ($entity['bundles'] as $bundle_type => $bundle) { danielebarchiesi@0: foreach (field_info_instances($entity_type, $bundle_type) as $field_name => $field) { danielebarchiesi@0: if (!isset($plugins[$parent . ':' . $entity_type . ':' . $bundle_type . ':' . $field_name])) { danielebarchiesi@0: $plugin = _ctools_entity_field_value_ctools_access_get_child($plugin, $parent, $entity_type, $bundle_type, $field_name, $entity, $bundle, $field); danielebarchiesi@0: $plugins[$parent . ':' . $entity_type . ':' . $bundle_type . ':' . $field_name] = $plugin; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $plugins; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function _ctools_entity_field_value_ctools_access_get_child($plugin, $parent, $entity_type, $bundle_type, $field_name, $entity = NULL, $bundle = NULL, $field = NULL) { danielebarchiesi@0: danielebarchiesi@0: // check that the entity, bundle and field arrays have a value. danielebarchiesi@0: // If not, load theme using machine names. danielebarchiesi@0: if (empty($entity)) { danielebarchiesi@0: $entity = entity_get_info($entity_type); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (empty($bundle)) { danielebarchiesi@0: $bundle = $entity['bundles'][$bundle_type]; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (empty($field)) { danielebarchiesi@0: $field_instances = field_info_instances($entity_type, $bundle_type); danielebarchiesi@0: $field = $field_instances[$field_name]; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $plugin['title'] = t('@entity @type: @field Field', array('@entity' => $entity['label'], '@type' => $bundle_type, '@field' => $field['label'])); danielebarchiesi@0: $plugin['keyword'] = $entity_type; danielebarchiesi@0: $plugin['description'] = t('Control access by @entity entity bundle.', array('@entity' => $entity_type)); danielebarchiesi@0: $plugin['name'] = $parent . ':' . $entity_type . ':' . $bundle_type . ':' . $field_name; danielebarchiesi@0: $plugin['required context'] = new ctools_context_required(t(ucfirst($entity_type)), $entity_type, array( danielebarchiesi@0: 'type' => $bundle_type, danielebarchiesi@0: )); danielebarchiesi@0: danielebarchiesi@0: return $plugin; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Settings form for the 'by entity_bundle' access plugin danielebarchiesi@0: */ danielebarchiesi@0: function ctools_entity_field_value_ctools_access_settings($form, &$form_state, $conf) { danielebarchiesi@0: $plugin = $form_state['plugin']; danielebarchiesi@0: list($parent, $entity_type, $bundle_type, $field_name) = explode(':', $plugin['name']); danielebarchiesi@0: $entity_info = entity_get_info($entity_type); danielebarchiesi@0: $instances = field_info_instances($entity_type, $bundle_type); danielebarchiesi@0: $instance = $instances[$field_name]; danielebarchiesi@0: $field = field_info_field_by_id($instance['field_id']); danielebarchiesi@0: foreach ($field['columns'] as $column => $attributes) { danielebarchiesi@0: $columns[] = _field_sql_storage_columnname($field_name, $column); danielebarchiesi@0: } danielebarchiesi@0: ctools_include('fields'); danielebarchiesi@0: $entity = (object)array( danielebarchiesi@0: $entity_info['entity keys']['bundle'] => $bundle_type, danielebarchiesi@0: ); danielebarchiesi@0: $langcode = field_valid_language(NULL); danielebarchiesi@0: $form['settings'] += (array) ctools_field_invoke_field($instance, 'form', $entity_type, $entity, $form, $form_state, array('default' => TRUE, 'language' => $langcode)); danielebarchiesi@0: // weight is really not important once this is populated and will only interfere with the form layout. danielebarchiesi@0: foreach (element_children($form['settings']) as $element) { danielebarchiesi@0: unset($form['settings'][$element]['#weight']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Need more logic here to handle compound fields. danielebarchiesi@0: foreach ($columns as $column) { danielebarchiesi@0: if (isset($conf[$column]) && is_array($conf[$column])) { danielebarchiesi@0: foreach ($conf[$column] as $delta => $conf_value) { danielebarchiesi@0: if (is_numeric($delta) && is_array($conf_value)) { danielebarchiesi@0: $form['settings'][$field_name][LANGUAGE_NONE][$delta]['value']['#default_value'] = $conf_value['value']; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $form['settings'][$field_name][LANGUAGE_NONE]['#default_value'] = $conf[$column]; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Compress the entity bundles allowed to the minimum. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_entity_field_value_ctools_access_settings_submit($form, &$form_state) { danielebarchiesi@0: $plugin = $form_state['plugin']; danielebarchiesi@0: list($parent, $entity_type, $bundle_type, $field_name) = explode(':', $plugin['name']); danielebarchiesi@0: $langcode = field_valid_language(NULL); danielebarchiesi@0: $langcode = isset($form_state['input']['settings'][$field_name][$langcode]) ? $langcode : LANGUAGE_NONE; danielebarchiesi@0: $instances = field_info_instances($entity_type, $bundle_type); danielebarchiesi@0: $instance = $instances[$field_name]; danielebarchiesi@0: $field = field_info_field_by_id($instance['field_id']); danielebarchiesi@0: foreach ($field['columns'] as $column => $attributes) { danielebarchiesi@0: $columns[] = _field_sql_storage_columnname($field_name, $column); danielebarchiesi@0: } danielebarchiesi@0: foreach ($columns as $column) { danielebarchiesi@0: $form_state['values']['settings'][$column] = $form_state['input']['settings'][$field_name][$langcode]; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Check for access. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_entity_field_value_ctools_access_check($conf, $context, $plugin) { danielebarchiesi@0: list($parent, $entity_type, $bundle_type, $field_name) = explode(':', $plugin['name']); danielebarchiesi@0: danielebarchiesi@0: if ($field_items = field_get_items($entity_type, $context->data, $field_name)) { danielebarchiesi@0: $langcode = field_language($entity_type, $context->data, $field_name); danielebarchiesi@0: // Get field storage columns. danielebarchiesi@0: $instance = field_info_instance($entity_type, $field_name, $bundle_type); danielebarchiesi@0: $field = field_info_field_by_id($instance['field_id']); danielebarchiesi@0: $columns = array(); danielebarchiesi@0: foreach ($field['columns'] as $column => $attributes) { danielebarchiesi@0: $columns[$column] = _field_sql_storage_columnname($field_name, $column); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (isset($conf[$field_name])) { danielebarchiesi@0: // We have settings for this field. danielebarchiesi@0: $conf_value_array = _ctools_entity_field_value_ctools_access_get_conf_field_values($conf[$field_name], $langcode); danielebarchiesi@0: if (empty($conf_value_array)) { danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Check field value. danielebarchiesi@0: foreach ($field_items as $field_value) { danielebarchiesi@0: foreach ($field_value as $field_column => $value) { danielebarchiesi@0: // Iterate through config values. danielebarchiesi@0: foreach ($conf_value_array as $conf_value) { danielebarchiesi@0: // Check access only for stored in config column values. danielebarchiesi@0: if (isset($conf_value[$field_column]) && $value == $conf_value[$field_column]) { danielebarchiesi@0: return TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function _ctools_entity_field_value_ctools_access_get_conf_field_values($values, $langcode = LANGUAGE_NONE) { danielebarchiesi@0: if (!is_array($values) || !isset($values[$langcode])) { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: $conf_values = array(); danielebarchiesi@0: danielebarchiesi@0: foreach ($values[$langcode] as $delta => $value) { danielebarchiesi@0: $conf_values[$delta] = $value; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $conf_values; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide a summary description based upon the checked entity_bundle. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_entity_field_value_ctools_access_summary($conf, $context, $plugin) { danielebarchiesi@0: list($parent, $entity_type, $bundle_type, $field_name) = explode(':', $plugin['name']); danielebarchiesi@0: $instances = field_info_instances($entity_type, $bundle_type); danielebarchiesi@0: $instance = $instances[$field_name]; danielebarchiesi@0: $field = field_info_field_by_id($instance['field_id']); danielebarchiesi@0: $entity_info = entity_get_info($entity_type); danielebarchiesi@0: $entity = (object)array( danielebarchiesi@0: $entity_info['entity keys']['bundle'] => $bundle_type, danielebarchiesi@0: ); danielebarchiesi@0: $string = ''; danielebarchiesi@0: $keys = array(); danielebarchiesi@0: $values = array(); danielebarchiesi@0: foreach ($field['columns'] as $column => $attributes) { danielebarchiesi@0: $conf_key = _field_sql_storage_columnname($field_name, $column); danielebarchiesi@0: if (count($field['columns']) > 1) { danielebarchiesi@0: // Add some sort of handling for compound fields danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: if (isset($conf[$conf_key])) { danielebarchiesi@0: $entity->{$field_name}[LANGUAGE_NONE][] = array($column => $conf[$conf_key]); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: $string .= " @{$column} equals @{$column}_value"; danielebarchiesi@0: $keys['@' . $column] = $column; danielebarchiesi@0: $values["@{$column}_value"] = $conf[$conf_key]; danielebarchiesi@0: } danielebarchiesi@0: $view_mode = 'full'; danielebarchiesi@0: $null = NULL; danielebarchiesi@0: $options = array('language' => LANGUAGE_NONE); danielebarchiesi@0: ctools_include('fields'); danielebarchiesi@0: $display = field_get_display($instance, $view_mode, $entity); danielebarchiesi@0: if (isset($display['module'])) { danielebarchiesi@0: $display['type'] = 'list_default'; danielebarchiesi@0: $function = $display['module'] . '_field_formatter_view'; danielebarchiesi@0: $items = isset($entity->{$field_name}[LANGUAGE_NONE]) ? $entity->{$field_name}[LANGUAGE_NONE] : array(); danielebarchiesi@0: if (function_exists($function)) { danielebarchiesi@0: $elements = $function($entity_type, $entity, $field, $instance, LANGUAGE_NONE, $items, $display); danielebarchiesi@0: } danielebarchiesi@0: $value_keys = array_keys($values); danielebarchiesi@0: foreach ($value_keys as $key => $value) { danielebarchiesi@0: $values[$value] = isset($elements[$key]['#markup']) ? $elements[$key]['#markup'] : ''; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: $values = array_merge($keys, $values); danielebarchiesi@0: return t($string, $values); danielebarchiesi@0: } danielebarchiesi@0: