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