annotate sites/all/modules/entityreference/entityreference.module @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2
danielebarchiesi@4 3 /**
danielebarchiesi@4 4 * Implements hook_ctools_plugin_directory().
danielebarchiesi@4 5 */
danielebarchiesi@4 6 function entityreference_ctools_plugin_directory($module, $plugin) {
danielebarchiesi@4 7 if ($module == 'entityreference') {
danielebarchiesi@4 8 return 'plugins/' . $plugin;
danielebarchiesi@4 9 }
danielebarchiesi@4 10 }
danielebarchiesi@4 11
danielebarchiesi@4 12 /**
danielebarchiesi@4 13 * Implements hook_init().
danielebarchiesi@4 14 */
danielebarchiesi@4 15 function entityreference_init() {
danielebarchiesi@4 16 // Include feeds.module integration.
danielebarchiesi@4 17 if (module_exists('feeds')) {
danielebarchiesi@4 18 module_load_include('inc', 'entityreference', 'entityreference.feeds');
danielebarchiesi@4 19 }
danielebarchiesi@4 20 }
danielebarchiesi@4 21
danielebarchiesi@4 22 /**
danielebarchiesi@4 23 * Implements hook_ctools_plugin_type().
danielebarchiesi@4 24 */
danielebarchiesi@4 25 function entityreference_ctools_plugin_type() {
danielebarchiesi@4 26 $plugins['selection'] = array(
danielebarchiesi@4 27 'classes' => array('class'),
danielebarchiesi@4 28 );
danielebarchiesi@4 29 $plugins['behavior'] = array(
danielebarchiesi@4 30 'classes' => array('class'),
danielebarchiesi@4 31 'process' => 'entityreference_behavior_plugin_process',
danielebarchiesi@4 32 );
danielebarchiesi@4 33 return $plugins;
danielebarchiesi@4 34 }
danielebarchiesi@4 35
danielebarchiesi@4 36 /**
danielebarchiesi@4 37 * CTools callback; Process the behavoir plugins.
danielebarchiesi@4 38 */
danielebarchiesi@4 39 function entityreference_behavior_plugin_process(&$plugin, $info) {
danielebarchiesi@4 40 $plugin += array(
danielebarchiesi@4 41 'description' => '',
danielebarchiesi@4 42 'behavior type' => 'field',
danielebarchiesi@4 43 'access callback' => FALSE,
danielebarchiesi@4 44 'force enabled' => FALSE,
danielebarchiesi@4 45 );
danielebarchiesi@4 46 }
danielebarchiesi@4 47
danielebarchiesi@4 48 /**
danielebarchiesi@4 49 * Implements hook_field_info().
danielebarchiesi@4 50 */
danielebarchiesi@4 51 function entityreference_field_info() {
danielebarchiesi@4 52 $field_info['entityreference'] = array(
danielebarchiesi@4 53 'label' => t('Entity Reference'),
danielebarchiesi@4 54 'description' => t('This field reference another entity.'),
danielebarchiesi@4 55 'settings' => array(
danielebarchiesi@4 56 // Default to the core target entity type node.
danielebarchiesi@4 57 'target_type' => 'node',
danielebarchiesi@4 58 // The handler for this field.
danielebarchiesi@4 59 'handler' => 'base',
danielebarchiesi@4 60 // The handler settings.
danielebarchiesi@4 61 'handler_settings' => array(),
danielebarchiesi@4 62 ),
danielebarchiesi@4 63 'instance_settings' => array(),
danielebarchiesi@4 64 'default_widget' => 'entityreference_autocomplete',
danielebarchiesi@4 65 'default_formatter' => 'entityreference_label',
danielebarchiesi@4 66 'property_callbacks' => array('entityreference_field_property_callback'),
danielebarchiesi@4 67 );
danielebarchiesi@4 68 return $field_info;
danielebarchiesi@4 69 }
danielebarchiesi@4 70
danielebarchiesi@4 71 /**
danielebarchiesi@4 72 * Implements hook_flush_caches().
danielebarchiesi@4 73 */
danielebarchiesi@4 74 function entityreference_flush_caches() {
danielebarchiesi@4 75 // Because of the intricacies of the info hooks, we are forced to keep a
danielebarchiesi@4 76 // separate list of the base tables of each entities, so that we can use
danielebarchiesi@4 77 // it in entityreference_field_schema() without calling entity_get_info().
danielebarchiesi@4 78 // See http://drupal.org/node/1416558 for details.
danielebarchiesi@4 79 $base_tables = array();
danielebarchiesi@4 80 foreach (entity_get_info() as $entity_type => $entity_info) {
danielebarchiesi@4 81 if (!empty($entity_info['base table']) && !empty($entity_info['entity keys']['id'])) {
danielebarchiesi@4 82 $base_tables[$entity_type] = array($entity_info['base table'], $entity_info['entity keys']['id']);
danielebarchiesi@4 83 }
danielebarchiesi@4 84 }
danielebarchiesi@4 85 // We are using a variable because cache is going to be cleared right after
danielebarchiesi@4 86 // hook_flush_caches() is finished.
danielebarchiesi@4 87 variable_set('entityreference:base-tables', $base_tables);
danielebarchiesi@4 88 }
danielebarchiesi@4 89
danielebarchiesi@4 90 /**
danielebarchiesi@4 91 * Implements hook_menu().
danielebarchiesi@4 92 */
danielebarchiesi@4 93 function entityreference_menu() {
danielebarchiesi@4 94 $items = array();
danielebarchiesi@4 95
danielebarchiesi@4 96 $items['entityreference/autocomplete/single/%/%/%'] = array(
danielebarchiesi@4 97 'title' => 'Entity Reference Autocomplete',
danielebarchiesi@4 98 'page callback' => 'entityreference_autocomplete_callback',
danielebarchiesi@4 99 'page arguments' => array(2, 3, 4, 5),
danielebarchiesi@4 100 'access callback' => 'entityreference_autocomplete_access_callback',
danielebarchiesi@4 101 'access arguments' => array(2, 3, 4, 5),
danielebarchiesi@4 102 'type' => MENU_CALLBACK,
danielebarchiesi@4 103 );
danielebarchiesi@4 104 $items['entityreference/autocomplete/tags/%/%/%'] = array(
danielebarchiesi@4 105 'title' => 'Entity Reference Autocomplete',
danielebarchiesi@4 106 'page callback' => 'entityreference_autocomplete_callback',
danielebarchiesi@4 107 'page arguments' => array(2, 3, 4, 5),
danielebarchiesi@4 108 'access callback' => 'entityreference_autocomplete_access_callback',
danielebarchiesi@4 109 'access arguments' => array(2, 3, 4, 5),
danielebarchiesi@4 110 'type' => MENU_CALLBACK,
danielebarchiesi@4 111 );
danielebarchiesi@4 112
danielebarchiesi@4 113 return $items;
danielebarchiesi@4 114 }
danielebarchiesi@4 115
danielebarchiesi@4 116 /**
danielebarchiesi@4 117 * Implements hook_field_is_empty().
danielebarchiesi@4 118 */
danielebarchiesi@4 119 function entityreference_field_is_empty($item, $field) {
danielebarchiesi@4 120 $empty = !isset($item['target_id']) || !is_numeric($item['target_id']);
danielebarchiesi@4 121
danielebarchiesi@4 122 // Invoke the behaviors to allow them to override the empty status.
danielebarchiesi@4 123 foreach (entityreference_get_behavior_handlers($field) as $handler) {
danielebarchiesi@4 124 $handler->is_empty_alter($empty, $item, $field);
danielebarchiesi@4 125 }
danielebarchiesi@4 126 return $empty;
danielebarchiesi@4 127 }
danielebarchiesi@4 128
danielebarchiesi@4 129 /**
danielebarchiesi@4 130 * Get the behavior handlers for a given entityreference field.
danielebarchiesi@4 131 */
danielebarchiesi@4 132 function entityreference_get_behavior_handlers($field, $instance = NULL) {
danielebarchiesi@4 133 $object_cache = drupal_static(__FUNCTION__);
danielebarchiesi@4 134 $identifier = $field['field_name'];
danielebarchiesi@4 135 if (!empty($instance)) {
danielebarchiesi@4 136 $identifier .= ':' . $instance['entity_type'] . ':' . $instance['bundle'];
danielebarchiesi@4 137 }
danielebarchiesi@4 138
danielebarchiesi@4 139 if (!isset($object_cache[$identifier])) {
danielebarchiesi@4 140 $object_cache[$identifier] = array();
danielebarchiesi@4 141
danielebarchiesi@4 142 // Merge in defaults.
danielebarchiesi@4 143 $field['settings'] += array('behaviors' => array());
danielebarchiesi@4 144
danielebarchiesi@4 145 $object_cache[$field['field_name']] = array();
danielebarchiesi@4 146 $behaviors = !empty($field['settings']['handler_settings']['behaviors']) ? $field['settings']['handler_settings']['behaviors'] : array();
danielebarchiesi@4 147 if (!empty($instance['settings']['behaviors'])) {
danielebarchiesi@4 148 $behaviors = array_merge($behaviors, $instance['settings']['behaviors']);
danielebarchiesi@4 149 }
danielebarchiesi@4 150 foreach ($behaviors as $behavior => $settings) {
danielebarchiesi@4 151 if (empty($settings['status'])) {
danielebarchiesi@4 152 // Behavior is not enabled.
danielebarchiesi@4 153 continue;
danielebarchiesi@4 154 }
danielebarchiesi@4 155
danielebarchiesi@4 156 $object_cache[$identifier][] = _entityreference_get_behavior_handler($behavior);
danielebarchiesi@4 157 }
danielebarchiesi@4 158 }
danielebarchiesi@4 159
danielebarchiesi@4 160 return $object_cache[$identifier];
danielebarchiesi@4 161 }
danielebarchiesi@4 162
danielebarchiesi@4 163 /**
danielebarchiesi@4 164 * Get the behavior handler for a given entityreference field and instance.
danielebarchiesi@4 165 *
danielebarchiesi@4 166 * @param $handler
danielebarchiesi@4 167 * The behavior handler name.
danielebarchiesi@4 168 */
danielebarchiesi@4 169 function _entityreference_get_behavior_handler($behavior) {
danielebarchiesi@4 170 $object_cache = drupal_static(__FUNCTION__);
danielebarchiesi@4 171
danielebarchiesi@4 172 if (!isset($object_cache[$behavior])) {
danielebarchiesi@4 173 ctools_include('plugins');
danielebarchiesi@4 174 $class = ctools_plugin_load_class('entityreference', 'behavior', $behavior, 'class');
danielebarchiesi@4 175
danielebarchiesi@4 176 $class = class_exists($class) ? $class : 'EntityReference_BehaviorHandler_Broken';
danielebarchiesi@4 177 $object_cache[$behavior] = new $class($behavior);
danielebarchiesi@4 178 }
danielebarchiesi@4 179
danielebarchiesi@4 180 return $object_cache[$behavior];
danielebarchiesi@4 181 }
danielebarchiesi@4 182
danielebarchiesi@4 183 /**
danielebarchiesi@4 184 * Get the selection handler for a given entityreference field.
danielebarchiesi@4 185 */
danielebarchiesi@4 186 function entityreference_get_selection_handler($field, $instance = NULL, $entity_type = NULL, $entity = NULL) {
danielebarchiesi@4 187 ctools_include('plugins');
danielebarchiesi@4 188 $handler = $field['settings']['handler'];
danielebarchiesi@4 189 $class = ctools_plugin_load_class('entityreference', 'selection', $handler, 'class');
danielebarchiesi@4 190
danielebarchiesi@4 191 if (class_exists($class)) {
danielebarchiesi@4 192 return call_user_func(array($class, 'getInstance'), $field, $instance, $entity_type, $entity);
danielebarchiesi@4 193 }
danielebarchiesi@4 194 else {
danielebarchiesi@4 195 return EntityReference_SelectionHandler_Broken::getInstance($field, $instance, $entity_type, $entity);
danielebarchiesi@4 196 }
danielebarchiesi@4 197 }
danielebarchiesi@4 198
danielebarchiesi@4 199 /**
danielebarchiesi@4 200 * Implements hook_field_load().
danielebarchiesi@4 201 */
danielebarchiesi@4 202 function entityreference_field_load($entity_type, $entities, $field, $instances, $langcode, &$items) {
danielebarchiesi@4 203 // Invoke the behaviors.
danielebarchiesi@4 204 foreach (entityreference_get_behavior_handlers($field) as $handler) {
danielebarchiesi@4 205 $handler->load($entity_type, $entities, $field, $instances, $langcode, $items);
danielebarchiesi@4 206 }
danielebarchiesi@4 207 }
danielebarchiesi@4 208
danielebarchiesi@4 209 /**
danielebarchiesi@4 210 * Implements hook_field_validate().
danielebarchiesi@4 211 */
danielebarchiesi@4 212 function entityreference_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
danielebarchiesi@4 213 $ids = array();
danielebarchiesi@4 214 foreach ($items as $delta => $item) {
danielebarchiesi@4 215 if (!entityreference_field_is_empty($item, $field) && $item['target_id'] !== NULL) {
danielebarchiesi@4 216 $ids[$item['target_id']] = $delta;
danielebarchiesi@4 217 }
danielebarchiesi@4 218 }
danielebarchiesi@4 219
danielebarchiesi@4 220 if ($ids) {
danielebarchiesi@4 221 $valid_ids = entityreference_get_selection_handler($field, $instance, $entity_type, $entity)->validateReferencableEntities(array_keys($ids));
danielebarchiesi@4 222
danielebarchiesi@4 223 $invalid_entities = array_diff_key($ids, array_flip($valid_ids));
danielebarchiesi@4 224 if ($invalid_entities) {
danielebarchiesi@4 225 foreach ($invalid_entities as $id => $delta) {
danielebarchiesi@4 226 $errors[$field['field_name']][$langcode][$delta][] = array(
danielebarchiesi@4 227 'error' => 'entityreference_invalid_entity',
danielebarchiesi@4 228 'message' => t('The referenced entity (@type: @id) is invalid.', array('@type' => $field['settings']['target_type'], '@id' => $id)),
danielebarchiesi@4 229 );
danielebarchiesi@4 230 }
danielebarchiesi@4 231 }
danielebarchiesi@4 232 }
danielebarchiesi@4 233
danielebarchiesi@4 234 // Invoke the behaviors.
danielebarchiesi@4 235 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 236 $handler->validate($entity_type, $entity, $field, $instance, $langcode, $items, $errors);
danielebarchiesi@4 237 }
danielebarchiesi@4 238 }
danielebarchiesi@4 239
danielebarchiesi@4 240 /**
danielebarchiesi@4 241 * Implements hook_field_presave().
danielebarchiesi@4 242 *
danielebarchiesi@4 243 * Adds the target type to the field data structure when saving.
danielebarchiesi@4 244 */
danielebarchiesi@4 245 function entityreference_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
danielebarchiesi@4 246 // Invoke the behaviors.
danielebarchiesi@4 247 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 248 $handler->presave($entity_type, $entity, $field, $instance, $langcode, $items);
danielebarchiesi@4 249 }
danielebarchiesi@4 250 }
danielebarchiesi@4 251
danielebarchiesi@4 252 /**
danielebarchiesi@4 253 * Implements hook_field_insert().
danielebarchiesi@4 254 */
danielebarchiesi@4 255 function entityreference_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
danielebarchiesi@4 256 // Invoke the behaviors.
danielebarchiesi@4 257 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 258 $handler->insert($entity_type, $entity, $field, $instance, $langcode, $items);
danielebarchiesi@4 259 }
danielebarchiesi@4 260 }
danielebarchiesi@4 261
danielebarchiesi@4 262 /**
danielebarchiesi@4 263 * Implements hook_field_attach_insert().
danielebarchiesi@4 264 *
danielebarchiesi@4 265 * Emulates a post-insert hook.
danielebarchiesi@4 266 */
danielebarchiesi@4 267 function entityreference_field_attach_insert($entity_type, $entity) {
danielebarchiesi@4 268 list(, , $bundle) = entity_extract_ids($entity_type, $entity);
danielebarchiesi@4 269 foreach (field_info_instances($entity_type, $bundle) as $field_name => $instance) {
danielebarchiesi@4 270 $field = field_info_field($field_name);
danielebarchiesi@4 271 if ($field['type'] == 'entityreference') {
danielebarchiesi@4 272 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 273 $handler->postInsert($entity_type, $entity, $field, $instance);
danielebarchiesi@4 274 }
danielebarchiesi@4 275 }
danielebarchiesi@4 276 }
danielebarchiesi@4 277 }
danielebarchiesi@4 278
danielebarchiesi@4 279 /**
danielebarchiesi@4 280 * Implements hook_field_update().
danielebarchiesi@4 281 */
danielebarchiesi@4 282 function entityreference_field_update($entity_type, $entity, $field, $instance, $langcode, &$items) {
danielebarchiesi@4 283 // Invoke the behaviors.
danielebarchiesi@4 284 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 285 $handler->update($entity_type, $entity, $field, $instance, $langcode, $items);
danielebarchiesi@4 286 }
danielebarchiesi@4 287 }
danielebarchiesi@4 288
danielebarchiesi@4 289 /**
danielebarchiesi@4 290 * Implements hook_field_attach_update().
danielebarchiesi@4 291 *
danielebarchiesi@4 292 * Emulates a post-update hook.
danielebarchiesi@4 293 */
danielebarchiesi@4 294 function entityreference_field_attach_update($entity_type, $entity) {
danielebarchiesi@4 295 list(, , $bundle) = entity_extract_ids($entity_type, $entity);
danielebarchiesi@4 296 foreach (field_info_instances($entity_type, $bundle) as $field_name => $instance) {
danielebarchiesi@4 297 $field = field_info_field($field_name);
danielebarchiesi@4 298 if ($field['type'] == 'entityreference') {
danielebarchiesi@4 299 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 300 $handler->postUpdate($entity_type, $entity, $field, $instance);
danielebarchiesi@4 301 }
danielebarchiesi@4 302 }
danielebarchiesi@4 303 }
danielebarchiesi@4 304 }
danielebarchiesi@4 305
danielebarchiesi@4 306 /**
danielebarchiesi@4 307 * Implements hook_field_delete().
danielebarchiesi@4 308 */
danielebarchiesi@4 309 function entityreference_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
danielebarchiesi@4 310 // Invoke the behaviors.
danielebarchiesi@4 311 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 312 $handler->delete($entity_type, $entity, $field, $instance, $langcode, $items);
danielebarchiesi@4 313 }
danielebarchiesi@4 314 }
danielebarchiesi@4 315
danielebarchiesi@4 316 /**
danielebarchiesi@4 317 * Implements hook_field_attach_delete().
danielebarchiesi@4 318 *
danielebarchiesi@4 319 * Emulates a post-delete hook.
danielebarchiesi@4 320 */
danielebarchiesi@4 321 function entityreference_field_attach_delete($entity_type, $entity) {
danielebarchiesi@4 322 list(, , $bundle) = entity_extract_ids($entity_type, $entity);
danielebarchiesi@4 323 foreach (field_info_instances($entity_type, $bundle) as $field_name => $instance) {
danielebarchiesi@4 324 $field = field_info_field($field_name);
danielebarchiesi@4 325 if ($field['type'] == 'entityreference') {
danielebarchiesi@4 326 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 327 $handler->postDelete($entity_type, $entity, $field, $instance);
danielebarchiesi@4 328 }
danielebarchiesi@4 329 }
danielebarchiesi@4 330 }
danielebarchiesi@4 331 }
danielebarchiesi@4 332
danielebarchiesi@4 333 /**
danielebarchiesi@4 334 * Implements hook_entity_insert().
danielebarchiesi@4 335 */
danielebarchiesi@4 336 function entityreference_entity_insert($entity, $entity_type) {
danielebarchiesi@4 337 entityreference_entity_crud($entity, $entity_type, 'entityPostInsert');
danielebarchiesi@4 338 }
danielebarchiesi@4 339
danielebarchiesi@4 340 /**
danielebarchiesi@4 341 * Implements hook_entity_update().
danielebarchiesi@4 342 */
danielebarchiesi@4 343 function entityreference_entity_update($entity, $entity_type) {
danielebarchiesi@4 344 entityreference_entity_crud($entity, $entity_type, 'entityPostUpdate');
danielebarchiesi@4 345 }
danielebarchiesi@4 346
danielebarchiesi@4 347 /**
danielebarchiesi@4 348 * Implements hook_entity_delete().
danielebarchiesi@4 349 */
danielebarchiesi@4 350 function entityreference_entity_delete($entity, $entity_type) {
danielebarchiesi@4 351 entityreference_entity_crud($entity, $entity_type, 'entityPostDelete');
danielebarchiesi@4 352 }
danielebarchiesi@4 353
danielebarchiesi@4 354 /**
danielebarchiesi@4 355 * Invoke a behavior based on entity CRUD.
danielebarchiesi@4 356 *
danielebarchiesi@4 357 * @param $entity
danielebarchiesi@4 358 * The entity object.
danielebarchiesi@4 359 * @param $entity_type
danielebarchiesi@4 360 * The entity type.
danielebarchiesi@4 361 * @param $method_name
danielebarchiesi@4 362 * The method to invoke.
danielebarchiesi@4 363 */
danielebarchiesi@4 364 function entityreference_entity_crud($entity, $entity_type, $method_name) {
danielebarchiesi@4 365 list(, , $bundle) = entity_extract_ids($entity_type, $entity);
danielebarchiesi@4 366 foreach (field_info_instances($entity_type, $bundle) as $field_name => $instance) {
danielebarchiesi@4 367 $field = field_info_field($field_name);
danielebarchiesi@4 368 if ($field['type'] == 'entityreference') {
danielebarchiesi@4 369 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 370 $handler->{$method_name}($entity_type, $entity, $field, $instance);
danielebarchiesi@4 371 }
danielebarchiesi@4 372 }
danielebarchiesi@4 373 }
danielebarchiesi@4 374 }
danielebarchiesi@4 375
danielebarchiesi@4 376 /**
danielebarchiesi@4 377 * Implements hook_field_settings_form().
danielebarchiesi@4 378 */
danielebarchiesi@4 379 function entityreference_field_settings_form($field, $instance, $has_data) {
danielebarchiesi@4 380 // The field settings infrastructure is not AJAX enabled by default,
danielebarchiesi@4 381 // because it doesn't pass over the $form_state.
danielebarchiesi@4 382 // Build the whole form into a #process in which we actually have access
danielebarchiesi@4 383 // to the form state.
danielebarchiesi@4 384 $form = array(
danielebarchiesi@4 385 '#type' => 'container',
danielebarchiesi@4 386 '#attached' => array(
danielebarchiesi@4 387 'css' => array(drupal_get_path('module', 'entityreference') . '/entityreference.admin.css'),
danielebarchiesi@4 388 ),
danielebarchiesi@4 389 '#process' => array(
danielebarchiesi@4 390 '_entityreference_field_settings_process',
danielebarchiesi@4 391 '_entityreference_field_settings_ajax_process',
danielebarchiesi@4 392 ),
danielebarchiesi@4 393 '#element_validate' => array('_entityreference_field_settings_validate'),
danielebarchiesi@4 394 '#field' => $field,
danielebarchiesi@4 395 '#instance' => $instance,
danielebarchiesi@4 396 '#has_data' => $has_data,
danielebarchiesi@4 397 );
danielebarchiesi@4 398 return $form;
danielebarchiesi@4 399 }
danielebarchiesi@4 400
danielebarchiesi@4 401 function _entityreference_field_settings_process($form, $form_state) {
danielebarchiesi@4 402 $field = isset($form_state['entityreference']['field']) ? $form_state['entityreference']['field'] : $form['#field'];
danielebarchiesi@4 403 $instance = isset($form_state['entityreference']['instance']) ? $form_state['entityreference']['instance'] : $form['#instance'];
danielebarchiesi@4 404 $has_data = $form['#has_data'];
danielebarchiesi@4 405
danielebarchiesi@4 406 $settings = $field['settings'];
danielebarchiesi@4 407 $settings += array('handler' => 'base');
danielebarchiesi@4 408
danielebarchiesi@4 409 // Select the target entity type.
danielebarchiesi@4 410 $entity_type_options = array();
danielebarchiesi@4 411 foreach (entity_get_info() as $entity_type => $entity_info) {
danielebarchiesi@4 412 $entity_type_options[$entity_type] = $entity_info['label'];
danielebarchiesi@4 413 }
danielebarchiesi@4 414
danielebarchiesi@4 415 $form['target_type'] = array(
danielebarchiesi@4 416 '#type' => 'select',
danielebarchiesi@4 417 '#title' => t('Target type'),
danielebarchiesi@4 418 '#options' => $entity_type_options,
danielebarchiesi@4 419 '#default_value' => $field['settings']['target_type'],
danielebarchiesi@4 420 '#required' => TRUE,
danielebarchiesi@4 421 '#description' => t('The entity type that can be referenced through this field.'),
danielebarchiesi@4 422 '#disabled' => $has_data,
danielebarchiesi@4 423 '#size' => 1,
danielebarchiesi@4 424 '#ajax' => TRUE,
danielebarchiesi@4 425 '#limit_validation_errors' => array(),
danielebarchiesi@4 426 );
danielebarchiesi@4 427
danielebarchiesi@4 428 ctools_include('plugins');
danielebarchiesi@4 429 $handlers = ctools_get_plugins('entityreference', 'selection');
danielebarchiesi@4 430 uasort($handlers, 'ctools_plugin_sort');
danielebarchiesi@4 431 $handlers_options = array();
danielebarchiesi@4 432 foreach ($handlers as $handler => $handler_info) {
danielebarchiesi@4 433 $handlers_options[$handler] = check_plain($handler_info['title']);
danielebarchiesi@4 434 }
danielebarchiesi@4 435
danielebarchiesi@4 436 $form['handler'] = array(
danielebarchiesi@4 437 '#type' => 'fieldset',
danielebarchiesi@4 438 '#title' => t('Entity selection'),
danielebarchiesi@4 439 '#tree' => TRUE,
danielebarchiesi@4 440 '#process' => array('_entityreference_form_process_merge_parent'),
danielebarchiesi@4 441 );
danielebarchiesi@4 442
danielebarchiesi@4 443 $form['handler']['handler'] = array(
danielebarchiesi@4 444 '#type' => 'select',
danielebarchiesi@4 445 '#title' => t('Mode'),
danielebarchiesi@4 446 '#options' => $handlers_options,
danielebarchiesi@4 447 '#default_value' => $settings['handler'],
danielebarchiesi@4 448 '#required' => TRUE,
danielebarchiesi@4 449 '#ajax' => TRUE,
danielebarchiesi@4 450 '#limit_validation_errors' => array(),
danielebarchiesi@4 451 );
danielebarchiesi@4 452 $form['handler_submit'] = array(
danielebarchiesi@4 453 '#type' => 'submit',
danielebarchiesi@4 454 '#value' => t('Change handler'),
danielebarchiesi@4 455 '#limit_validation_errors' => array(),
danielebarchiesi@4 456 '#attributes' => array(
danielebarchiesi@4 457 'class' => array('js-hide'),
danielebarchiesi@4 458 ),
danielebarchiesi@4 459 '#submit' => array('entityreference_settings_ajax_submit'),
danielebarchiesi@4 460 );
danielebarchiesi@4 461
danielebarchiesi@4 462 $form['handler']['handler_settings'] = array(
danielebarchiesi@4 463 '#type' => 'container',
danielebarchiesi@4 464 '#attributes' => array('class' => array('entityreference-settings')),
danielebarchiesi@4 465 );
danielebarchiesi@4 466
danielebarchiesi@4 467 $handler = entityreference_get_selection_handler($field, $instance);
danielebarchiesi@4 468 $form['handler']['handler_settings'] += $handler->settingsForm($field, $instance);
danielebarchiesi@4 469
danielebarchiesi@4 470 _entityreference_get_behavior_elements($form, $field, $instance, 'field');
danielebarchiesi@4 471 if (!empty($form['behaviors'])) {
danielebarchiesi@4 472 $form['behaviors'] += array(
danielebarchiesi@4 473 '#type' => 'fieldset',
danielebarchiesi@4 474 '#title' => t('Additional behaviors'),
danielebarchiesi@4 475 '#parents' => array_merge($form['#parents'], array('handler_settings', 'behaviors')),
danielebarchiesi@4 476 );
danielebarchiesi@4 477 }
danielebarchiesi@4 478
danielebarchiesi@4 479 return $form;
danielebarchiesi@4 480 }
danielebarchiesi@4 481
danielebarchiesi@4 482 function _entityreference_field_settings_ajax_process($form, $form_state) {
danielebarchiesi@4 483 _entityreference_field_settings_ajax_process_element($form, $form);
danielebarchiesi@4 484 return $form;
danielebarchiesi@4 485 }
danielebarchiesi@4 486
danielebarchiesi@4 487 function _entityreference_field_settings_ajax_process_element(&$element, $main_form) {
danielebarchiesi@4 488 if (isset($element['#ajax']) && $element['#ajax'] === TRUE) {
danielebarchiesi@4 489 $element['#ajax'] = array(
danielebarchiesi@4 490 'callback' => 'entityreference_settings_ajax',
danielebarchiesi@4 491 'wrapper' => $main_form['#id'],
danielebarchiesi@4 492 'element' => $main_form['#array_parents'],
danielebarchiesi@4 493 );
danielebarchiesi@4 494 }
danielebarchiesi@4 495
danielebarchiesi@4 496 foreach (element_children($element) as $key) {
danielebarchiesi@4 497 _entityreference_field_settings_ajax_process_element($element[$key], $main_form);
danielebarchiesi@4 498 }
danielebarchiesi@4 499 }
danielebarchiesi@4 500
danielebarchiesi@4 501 function _entityreference_form_process_merge_parent($element) {
danielebarchiesi@4 502 $parents = $element['#parents'];
danielebarchiesi@4 503 array_pop($parents);
danielebarchiesi@4 504 $element['#parents'] = $parents;
danielebarchiesi@4 505 return $element;
danielebarchiesi@4 506 }
danielebarchiesi@4 507
danielebarchiesi@4 508 function _entityreference_element_validate_filter(&$element, &$form_state) {
danielebarchiesi@4 509 $element['#value'] = array_filter($element['#value']);
danielebarchiesi@4 510 form_set_value($element, $element['#value'], $form_state);
danielebarchiesi@4 511 }
danielebarchiesi@4 512
danielebarchiesi@4 513 function _entityreference_field_settings_validate($form, &$form_state) {
danielebarchiesi@4 514 // Store the new values in the form state.
danielebarchiesi@4 515 $field = $form['#field'];
danielebarchiesi@4 516 if (isset($form_state['values']['field'])) {
danielebarchiesi@4 517 $field['settings'] = $form_state['values']['field']['settings'];
danielebarchiesi@4 518 }
danielebarchiesi@4 519 $form_state['entityreference']['field'] = $field;
danielebarchiesi@4 520
danielebarchiesi@4 521 unset($form_state['values']['field']['settings']['handler_submit']);
danielebarchiesi@4 522 }
danielebarchiesi@4 523
danielebarchiesi@4 524 /**
danielebarchiesi@4 525 * Implements hook_field_instance_settings_form().
danielebarchiesi@4 526 */
danielebarchiesi@4 527 function entityreference_field_instance_settings_form($field, $instance) {
danielebarchiesi@4 528 $form['settings'] = array(
danielebarchiesi@4 529 '#type' => 'container',
danielebarchiesi@4 530 '#attached' => array(
danielebarchiesi@4 531 'css' => array(drupal_get_path('module', 'entityreference') . '/entityreference.admin.css'),
danielebarchiesi@4 532 ),
danielebarchiesi@4 533 '#weight' => 10,
danielebarchiesi@4 534 '#tree' => TRUE,
danielebarchiesi@4 535 '#process' => array(
danielebarchiesi@4 536 '_entityreference_form_process_merge_parent',
danielebarchiesi@4 537 '_entityreference_field_instance_settings_form',
danielebarchiesi@4 538 '_entityreference_field_settings_ajax_process',
danielebarchiesi@4 539 ),
danielebarchiesi@4 540 '#element_validate' => array('_entityreference_field_instance_settings_validate'),
danielebarchiesi@4 541 '#field' => $field,
danielebarchiesi@4 542 '#instance' => $instance,
danielebarchiesi@4 543 );
danielebarchiesi@4 544
danielebarchiesi@4 545 return $form;
danielebarchiesi@4 546 }
danielebarchiesi@4 547
danielebarchiesi@4 548 function _entityreference_field_instance_settings_form($form, $form_state) {
danielebarchiesi@4 549 $field = isset($form_state['entityreference']['field']) ? $form_state['entityreference']['field'] : $form['#field'];
danielebarchiesi@4 550 $instance = isset($form_state['entityreference']['instance']) ? $form_state['entityreference']['instance'] : $form['#instance'];
danielebarchiesi@4 551
danielebarchiesi@4 552 _entityreference_get_behavior_elements($form, $field, $instance, 'instance');
danielebarchiesi@4 553 if (!empty($form['behaviors'])) {
danielebarchiesi@4 554 $form['behaviors'] += array(
danielebarchiesi@4 555 '#type' => 'fieldset',
danielebarchiesi@4 556 '#title' => t('Additional behaviors'),
danielebarchiesi@4 557 '#process' => array(
danielebarchiesi@4 558 '_entityreference_field_settings_ajax_process',
danielebarchiesi@4 559 ),
danielebarchiesi@4 560 );
danielebarchiesi@4 561 }
danielebarchiesi@4 562 return $form;
danielebarchiesi@4 563 }
danielebarchiesi@4 564
danielebarchiesi@4 565 function _entityreference_field_instance_settings_validate($form, &$form_state) {
danielebarchiesi@4 566 // Store the new values in the form state.
danielebarchiesi@4 567 $instance = $form['#instance'];
danielebarchiesi@4 568 if (isset($form_state['values']['instance'])) {
danielebarchiesi@4 569 $instance = drupal_array_merge_deep($instance, $form_state['values']['instance']);
danielebarchiesi@4 570 }
danielebarchiesi@4 571 $form_state['entityreference']['instance'] = $instance;
danielebarchiesi@4 572 }
danielebarchiesi@4 573
danielebarchiesi@4 574 /**
danielebarchiesi@4 575 * Get the field or instance elements for the field configuration.
danielebarchiesi@4 576 */
danielebarchiesi@4 577 function _entityreference_get_behavior_elements(&$element, $field, $instance, $level) {
danielebarchiesi@4 578 // Add the accessible behavior handlers.
danielebarchiesi@4 579 $behavior_plugins = entityreference_get_accessible_behavior_plugins($field, $instance);
danielebarchiesi@4 580
danielebarchiesi@4 581 if ($behavior_plugins[$level]) {
danielebarchiesi@4 582 $element['behaviors'] = array();
danielebarchiesi@4 583
danielebarchiesi@4 584 foreach ($behavior_plugins[$level] as $name => $plugin) {
danielebarchiesi@4 585 if ($level == 'field') {
danielebarchiesi@4 586 $settings = !empty($field['settings']['handler_settings']['behaviors'][$name]) ? $field['settings']['handler_settings']['behaviors'][$name] : array();
danielebarchiesi@4 587 }
danielebarchiesi@4 588 else {
danielebarchiesi@4 589 $settings = !empty($instance['settings']['behaviors'][$name]) ? $instance['settings']['behaviors'][$name] : array();
danielebarchiesi@4 590 }
danielebarchiesi@4 591 $settings += array('status' => $plugin['force enabled']);
danielebarchiesi@4 592
danielebarchiesi@4 593 // Render the checkbox.
danielebarchiesi@4 594 $element['behaviors'][$name] = array(
danielebarchiesi@4 595 '#tree' => TRUE,
danielebarchiesi@4 596 );
danielebarchiesi@4 597 $element['behaviors'][$name]['status'] = array(
danielebarchiesi@4 598 '#type' => 'checkbox',
danielebarchiesi@4 599 '#title' => check_plain($plugin['title']),
danielebarchiesi@4 600 '#description' => $plugin['description'],
danielebarchiesi@4 601 '#default_value' => $settings['status'],
danielebarchiesi@4 602 '#disabled' => $plugin['force enabled'],
danielebarchiesi@4 603 '#ajax' => TRUE,
danielebarchiesi@4 604 );
danielebarchiesi@4 605
danielebarchiesi@4 606 if ($settings['status']) {
danielebarchiesi@4 607 $handler = _entityreference_get_behavior_handler($name);
danielebarchiesi@4 608 if ($behavior_elements = $handler->settingsForm($field, $instance)) {
danielebarchiesi@4 609 foreach ($behavior_elements as $key => &$behavior_element) {
danielebarchiesi@4 610 $behavior_element += array(
danielebarchiesi@4 611 '#default_value' => !empty($settings[$key]) ? $settings[$key] : NULL,
danielebarchiesi@4 612 );
danielebarchiesi@4 613 }
danielebarchiesi@4 614
danielebarchiesi@4 615 // Get the behavior settings.
danielebarchiesi@4 616 $behavior_elements += array(
danielebarchiesi@4 617 '#type' => 'container',
danielebarchiesi@4 618 '#process' => array('_entityreference_form_process_merge_parent'),
danielebarchiesi@4 619 '#attributes' => array(
danielebarchiesi@4 620 'class' => array('entityreference-settings'),
danielebarchiesi@4 621 ),
danielebarchiesi@4 622 );
danielebarchiesi@4 623 $element['behaviors'][$name]['settings'] = $behavior_elements;
danielebarchiesi@4 624 }
danielebarchiesi@4 625 }
danielebarchiesi@4 626 }
danielebarchiesi@4 627 }
danielebarchiesi@4 628 }
danielebarchiesi@4 629
danielebarchiesi@4 630 /**
danielebarchiesi@4 631 * Get all accessible behavior plugins.
danielebarchiesi@4 632 */
danielebarchiesi@4 633 function entityreference_get_accessible_behavior_plugins($field, $instance) {
danielebarchiesi@4 634 ctools_include('plugins');
danielebarchiesi@4 635 $plugins = array('field' => array(), 'instance' => array());
danielebarchiesi@4 636 foreach (ctools_get_plugins('entityreference', 'behavior') as $name => $plugin) {
danielebarchiesi@4 637 $handler = _entityreference_get_behavior_handler($name);
danielebarchiesi@4 638 $level = $plugin['behavior type'];
danielebarchiesi@4 639 if ($handler->access($field, $instance)) {
danielebarchiesi@4 640 $plugins[$level][$name] = $plugin;
danielebarchiesi@4 641 }
danielebarchiesi@4 642 }
danielebarchiesi@4 643 return $plugins;
danielebarchiesi@4 644 }
danielebarchiesi@4 645
danielebarchiesi@4 646 /**
danielebarchiesi@4 647 * Ajax callback for the handler settings form.
danielebarchiesi@4 648 *
danielebarchiesi@4 649 * @see entityreference_field_settings_form()
danielebarchiesi@4 650 */
danielebarchiesi@4 651 function entityreference_settings_ajax($form, $form_state) {
danielebarchiesi@4 652 $trigger = $form_state['triggering_element'];
danielebarchiesi@4 653 return drupal_array_get_nested_value($form, $trigger['#ajax']['element']);
danielebarchiesi@4 654 }
danielebarchiesi@4 655
danielebarchiesi@4 656 /**
danielebarchiesi@4 657 * Submit handler for the non-JS case.
danielebarchiesi@4 658 *
danielebarchiesi@4 659 * @see entityreference_field_settings_form()
danielebarchiesi@4 660 */
danielebarchiesi@4 661 function entityreference_settings_ajax_submit($form, &$form_state) {
danielebarchiesi@4 662 $form_state['rebuild'] = TRUE;
danielebarchiesi@4 663 }
danielebarchiesi@4 664
danielebarchiesi@4 665 /**
danielebarchiesi@4 666 * Property callback for the Entity Metadata framework.
danielebarchiesi@4 667 */
danielebarchiesi@4 668 function entityreference_field_property_callback(&$info, $entity_type, $field, $instance, $field_type) {
danielebarchiesi@4 669 // Set the property type based on the targe type.
danielebarchiesi@4 670 $field_type['property_type'] = $field['settings']['target_type'];
danielebarchiesi@4 671
danielebarchiesi@4 672 // Then apply the default.
danielebarchiesi@4 673 entity_metadata_field_default_property_callback($info, $entity_type, $field, $instance, $field_type);
danielebarchiesi@4 674
danielebarchiesi@4 675 // Invoke the behaviors to allow them to change the properties.
danielebarchiesi@4 676 foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
danielebarchiesi@4 677 $handler->property_info_alter($info, $entity_type, $field, $instance, $field_type);
danielebarchiesi@4 678 }
danielebarchiesi@4 679 }
danielebarchiesi@4 680
danielebarchiesi@4 681 /**
danielebarchiesi@4 682 * Implements hook_field_widget_info().
danielebarchiesi@4 683 */
danielebarchiesi@4 684 function entityreference_field_widget_info() {
danielebarchiesi@4 685 $widgets['entityreference_autocomplete'] = array(
danielebarchiesi@4 686 'label' => t('Autocomplete'),
danielebarchiesi@4 687 'description' => t('An autocomplete text field.'),
danielebarchiesi@4 688 'field types' => array('entityreference'),
danielebarchiesi@4 689 'settings' => array(
danielebarchiesi@4 690 'match_operator' => 'CONTAINS',
danielebarchiesi@4 691 'size' => 60,
danielebarchiesi@4 692 // We don't have a default here, because it's not the same between
danielebarchiesi@4 693 // the two widgets, and the Field API doesn't update default
danielebarchiesi@4 694 // settings when the widget changes.
danielebarchiesi@4 695 'path' => '',
danielebarchiesi@4 696 ),
danielebarchiesi@4 697 );
danielebarchiesi@4 698
danielebarchiesi@4 699 $widgets['entityreference_autocomplete_tags'] = array(
danielebarchiesi@4 700 'label' => t('Autocomplete (Tags style)'),
danielebarchiesi@4 701 'description' => t('An autocomplete text field.'),
danielebarchiesi@4 702 'field types' => array('entityreference'),
danielebarchiesi@4 703 'settings' => array(
danielebarchiesi@4 704 'match_operator' => 'CONTAINS',
danielebarchiesi@4 705 'size' => 60,
danielebarchiesi@4 706 // We don't have a default here, because it's not the same between
danielebarchiesi@4 707 // the two widgets, and the Field API doesn't update default
danielebarchiesi@4 708 // settings when the widget changes.
danielebarchiesi@4 709 'path' => '',
danielebarchiesi@4 710 ),
danielebarchiesi@4 711 'behaviors' => array(
danielebarchiesi@4 712 'multiple values' => FIELD_BEHAVIOR_CUSTOM,
danielebarchiesi@4 713 ),
danielebarchiesi@4 714 );
danielebarchiesi@4 715
danielebarchiesi@4 716 return $widgets;
danielebarchiesi@4 717 }
danielebarchiesi@4 718
danielebarchiesi@4 719 /**
danielebarchiesi@4 720 * Implements hook_field_widget_info_alter().
danielebarchiesi@4 721 */
danielebarchiesi@4 722 function entityreference_field_widget_info_alter(&$info) {
danielebarchiesi@4 723 if (module_exists('options')) {
danielebarchiesi@4 724 $info['options_select']['field types'][] = 'entityreference';
danielebarchiesi@4 725 $info['options_buttons']['field types'][] = 'entityreference';
danielebarchiesi@4 726 }
danielebarchiesi@4 727 }
danielebarchiesi@4 728
danielebarchiesi@4 729 /**
danielebarchiesi@4 730 * Implements hook_field_widget_settings_form().
danielebarchiesi@4 731 */
danielebarchiesi@4 732 function entityreference_field_widget_settings_form($field, $instance) {
danielebarchiesi@4 733 $widget = $instance['widget'];
danielebarchiesi@4 734 $settings = $widget['settings'] + field_info_widget_settings($widget['type']);
danielebarchiesi@4 735
danielebarchiesi@4 736 $form = array();
danielebarchiesi@4 737
danielebarchiesi@4 738 if ($widget['type'] == 'entityreference_autocomplete' || $widget['type'] == 'entityreference_autocomplete_tags') {
danielebarchiesi@4 739 $form['match_operator'] = array(
danielebarchiesi@4 740 '#type' => 'select',
danielebarchiesi@4 741 '#title' => t('Autocomplete matching'),
danielebarchiesi@4 742 '#default_value' => $settings['match_operator'],
danielebarchiesi@4 743 '#options' => array(
danielebarchiesi@4 744 'STARTS_WITH' => t('Starts with'),
danielebarchiesi@4 745 'CONTAINS' => t('Contains'),
danielebarchiesi@4 746 ),
danielebarchiesi@4 747 '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of nodes.'),
danielebarchiesi@4 748 );
danielebarchiesi@4 749 $form['size'] = array(
danielebarchiesi@4 750 '#type' => 'textfield',
danielebarchiesi@4 751 '#title' => t('Size of textfield'),
danielebarchiesi@4 752 '#default_value' => $settings['size'],
danielebarchiesi@4 753 '#element_validate' => array('_element_validate_integer_positive'),
danielebarchiesi@4 754 '#required' => TRUE,
danielebarchiesi@4 755 );
danielebarchiesi@4 756 }
danielebarchiesi@4 757
danielebarchiesi@4 758 return $form;
danielebarchiesi@4 759 }
danielebarchiesi@4 760
danielebarchiesi@4 761 /**
danielebarchiesi@4 762 * Implements hook_options_list().
danielebarchiesi@4 763 */
danielebarchiesi@4 764 function entityreference_options_list($field, $instance = NULL, $entity_type = NULL, $entity = NULL) {
danielebarchiesi@4 765 if (!$options = entityreference_get_selection_handler($field, $instance, $entity_type, $entity)->getReferencableEntities()) {
danielebarchiesi@4 766 return array();
danielebarchiesi@4 767 }
danielebarchiesi@4 768
danielebarchiesi@4 769 // Rebuild the array, by changing the bundle key into the bundle label.
danielebarchiesi@4 770 $target_type = $field['settings']['target_type'];
danielebarchiesi@4 771 $entity_info = entity_get_info($target_type);
danielebarchiesi@4 772
danielebarchiesi@4 773 $return = array();
danielebarchiesi@4 774 foreach ($options as $bundle => $entity_ids) {
danielebarchiesi@4 775 $bundle_label = check_plain($entity_info['bundles'][$bundle]['label']);
danielebarchiesi@4 776 $return[$bundle_label] = $entity_ids;
danielebarchiesi@4 777 }
danielebarchiesi@4 778
danielebarchiesi@4 779 return count($return) == 1 ? reset($return) : $return;
danielebarchiesi@4 780 }
danielebarchiesi@4 781
danielebarchiesi@4 782 /**
danielebarchiesi@4 783 * Implements hook_query_TAG_alter().
danielebarchiesi@4 784 */
danielebarchiesi@4 785 function entityreference_query_entityreference_alter(QueryAlterableInterface $query) {
danielebarchiesi@4 786 $handler = $query->getMetadata('entityreference_selection_handler');
danielebarchiesi@4 787 $handler->entityFieldQueryAlter($query);
danielebarchiesi@4 788 }
danielebarchiesi@4 789
danielebarchiesi@4 790 /**
danielebarchiesi@4 791 * Implements hook_field_widget_form().
danielebarchiesi@4 792 */
danielebarchiesi@4 793 function entityreference_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
danielebarchiesi@4 794 $entity_type = $instance['entity_type'];
danielebarchiesi@4 795 $entity = isset($element['#entity']) ? $element['#entity'] : NULL;
danielebarchiesi@4 796 $handler = entityreference_get_selection_handler($field, $instance, $entity_type, $entity);
danielebarchiesi@4 797
danielebarchiesi@4 798 if ($instance['widget']['type'] == 'entityreference_autocomplete' || $instance['widget']['type'] == 'entityreference_autocomplete_tags') {
danielebarchiesi@4 799
danielebarchiesi@4 800 if ($instance['widget']['type'] == 'entityreference_autocomplete') {
danielebarchiesi@4 801 // We let the Field API handles multiple values for us, only take
danielebarchiesi@4 802 // care of the one matching our delta.
danielebarchiesi@4 803 if (isset($items[$delta])) {
danielebarchiesi@4 804 $items = array($items[$delta]);
danielebarchiesi@4 805 }
danielebarchiesi@4 806 else {
danielebarchiesi@4 807 $items = array();
danielebarchiesi@4 808 }
danielebarchiesi@4 809 }
danielebarchiesi@4 810
danielebarchiesi@4 811 $entity_ids = array();
danielebarchiesi@4 812 $entity_labels = array();
danielebarchiesi@4 813
danielebarchiesi@4 814 // Build an array of entities ID.
danielebarchiesi@4 815 foreach ($items as $item) {
danielebarchiesi@4 816 $entity_ids[] = $item['target_id'];
danielebarchiesi@4 817 }
danielebarchiesi@4 818
danielebarchiesi@4 819 // Load those entities and loop through them to extract their labels.
danielebarchiesi@4 820 $entities = entity_load($field['settings']['target_type'], $entity_ids);
danielebarchiesi@4 821
danielebarchiesi@4 822 foreach ($entities as $entity_id => $entity_item) {
danielebarchiesi@4 823 $label = $handler->getLabel($entity_item);
danielebarchiesi@4 824 $key = "$label ($entity_id)";
danielebarchiesi@4 825 // Labels containing commas or quotes must be wrapped in quotes.
danielebarchiesi@4 826 if (strpos($key, ',') !== FALSE || strpos($key, '"') !== FALSE) {
danielebarchiesi@4 827 $key = '"' . str_replace('"', '""', $key) . '"';
danielebarchiesi@4 828 }
danielebarchiesi@4 829 $entity_labels[] = $key;
danielebarchiesi@4 830 }
danielebarchiesi@4 831
danielebarchiesi@4 832 // Prepare the autocomplete path.
danielebarchiesi@4 833 if (!empty($instance['widget']['settings']['path'])) {
danielebarchiesi@4 834 $autocomplete_path = $instance['widget']['settings']['path'];
danielebarchiesi@4 835 }
danielebarchiesi@4 836 else {
danielebarchiesi@4 837 $autocomplete_path = $instance['widget']['type'] == 'entityreference_autocomplete' ? 'entityreference/autocomplete/single' : 'entityreference/autocomplete/tags';
danielebarchiesi@4 838 }
danielebarchiesi@4 839
danielebarchiesi@4 840 $autocomplete_path .= '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['bundle'] . '/';
danielebarchiesi@4 841 // Use <NULL> as a placeholder in the URL when we don't have an entity.
danielebarchiesi@4 842 // Most webservers collapse two consecutive slashes.
danielebarchiesi@4 843 $id = 'NULL';
danielebarchiesi@4 844 if ($entity) {
danielebarchiesi@4 845 list($eid) = entity_extract_ids($entity_type, $entity);
danielebarchiesi@4 846 if ($eid) {
danielebarchiesi@4 847 $id = $eid;
danielebarchiesi@4 848 }
danielebarchiesi@4 849 }
danielebarchiesi@4 850 $autocomplete_path .= $id;
danielebarchiesi@4 851
danielebarchiesi@4 852 if ($instance['widget']['type'] == 'entityreference_autocomplete') {
danielebarchiesi@4 853 $element += array(
danielebarchiesi@4 854 '#type' => 'textfield',
danielebarchiesi@4 855 '#maxlength' => 1024,
danielebarchiesi@4 856 '#default_value' => implode(', ', $entity_labels),
danielebarchiesi@4 857 '#autocomplete_path' => $autocomplete_path,
danielebarchiesi@4 858 '#size' => $instance['widget']['settings']['size'],
danielebarchiesi@4 859 '#element_validate' => array('_entityreference_autocomplete_validate'),
danielebarchiesi@4 860 );
danielebarchiesi@4 861 return array('target_id' => $element);
danielebarchiesi@4 862 }
danielebarchiesi@4 863 else {
danielebarchiesi@4 864 $element += array(
danielebarchiesi@4 865 '#type' => 'textfield',
danielebarchiesi@4 866 '#maxlength' => 1024,
danielebarchiesi@4 867 '#default_value' => implode(', ', $entity_labels),
danielebarchiesi@4 868 '#autocomplete_path' => $autocomplete_path,
danielebarchiesi@4 869 '#size' => $instance['widget']['settings']['size'],
danielebarchiesi@4 870 '#element_validate' => array('_entityreference_autocomplete_tags_validate'),
danielebarchiesi@4 871 );
danielebarchiesi@4 872 return $element;
danielebarchiesi@4 873 }
danielebarchiesi@4 874 }
danielebarchiesi@4 875 }
danielebarchiesi@4 876
danielebarchiesi@4 877 function _entityreference_autocomplete_validate($element, &$form_state, $form) {
danielebarchiesi@4 878 // If a value was entered into the autocomplete...
danielebarchiesi@4 879 $value = '';
danielebarchiesi@4 880 if (!empty($element['#value'])) {
danielebarchiesi@4 881 // Take "label (entity id)', match the id from parenthesis.
danielebarchiesi@4 882 if (preg_match("/.+\((\d+)\)/", $element['#value'], $matches)) {
danielebarchiesi@4 883 $value = $matches[1];
danielebarchiesi@4 884 }
danielebarchiesi@4 885 else {
danielebarchiesi@4 886 // Try to get a match from the input string when the user didn't use the
danielebarchiesi@4 887 // autocomplete but filled in a value manually.
danielebarchiesi@4 888 $field = field_info_field($element['#field_name']);
danielebarchiesi@4 889 $handler = entityreference_get_selection_handler($field);
danielebarchiesi@4 890 $field_name = $element['#field_name'];
danielebarchiesi@4 891 $field = field_info_field($field_name);
danielebarchiesi@4 892 $instance = field_info_instance($element['#entity_type'], $field_name, $element['#bundle']);
danielebarchiesi@4 893 $handler = entityreference_get_selection_handler($field, $instance);
danielebarchiesi@4 894 $value = $handler->validateAutocompleteInput($element['#value'], $element, $form_state, $form);
danielebarchiesi@4 895 }
danielebarchiesi@4 896 }
danielebarchiesi@4 897 // Update the value of this element so the field can validate the product IDs.
danielebarchiesi@4 898 form_set_value($element, $value, $form_state);
danielebarchiesi@4 899 }
danielebarchiesi@4 900
danielebarchiesi@4 901 function _entityreference_autocomplete_tags_validate($element, &$form_state, $form) {
danielebarchiesi@4 902 $value = array();
danielebarchiesi@4 903 // If a value was entered into the autocomplete...
danielebarchiesi@4 904 if (!empty($element['#value'])) {
danielebarchiesi@4 905 $entities = drupal_explode_tags($element['#value']);
danielebarchiesi@4 906 $value = array();
danielebarchiesi@4 907 foreach ($entities as $entity) {
danielebarchiesi@4 908 // Take "label (entity id)', match the id from parenthesis.
danielebarchiesi@4 909 if (preg_match("/.+\((\d+)\)/", $entity, $matches)) {
danielebarchiesi@4 910 $value[] = array(
danielebarchiesi@4 911 'target_id' => $matches[1],
danielebarchiesi@4 912 );
danielebarchiesi@4 913 }
danielebarchiesi@4 914 else {
danielebarchiesi@4 915 // Try to get a match from the input string when the user didn't use the
danielebarchiesi@4 916 // autocomplete but filled in a value manually.
danielebarchiesi@4 917 $field = field_info_field($element['#field_name']);
danielebarchiesi@4 918 $handler = entityreference_get_selection_handler($field);
danielebarchiesi@4 919 $value[] = array(
danielebarchiesi@4 920 'target_id' => $handler->validateAutocompleteInput($entity, $element, $form_state, $form),
danielebarchiesi@4 921 );
danielebarchiesi@4 922 }
danielebarchiesi@4 923 }
danielebarchiesi@4 924 }
danielebarchiesi@4 925 // Update the value of this element so the field can validate the product IDs.
danielebarchiesi@4 926 form_set_value($element, $value, $form_state);
danielebarchiesi@4 927 }
danielebarchiesi@4 928
danielebarchiesi@4 929 /**
danielebarchiesi@4 930 * Implements hook_field_widget_error().
danielebarchiesi@4 931 */
danielebarchiesi@4 932 function entityreference_field_widget_error($element, $error) {
danielebarchiesi@4 933 form_error($element, $error['message']);
danielebarchiesi@4 934 }
danielebarchiesi@4 935
danielebarchiesi@4 936 /**
danielebarchiesi@4 937 * Menu Access callback for the autocomplete widget.
danielebarchiesi@4 938 *
danielebarchiesi@4 939 * @param $type
danielebarchiesi@4 940 * The widget type (i.e. 'single' or 'tags').
danielebarchiesi@4 941 * @param $field_name
danielebarchiesi@4 942 * The name of the entity-reference field.
danielebarchiesi@4 943 * @param $entity_type
danielebarchiesi@4 944 * The entity type.
danielebarchiesi@4 945 * @param $bundle_name
danielebarchiesi@4 946 * The bundle name.
danielebarchiesi@4 947 * @return
danielebarchiesi@4 948 * True if user can access this menu item.
danielebarchiesi@4 949 */
danielebarchiesi@4 950 function entityreference_autocomplete_access_callback($type, $field_name, $entity_type, $bundle_name) {
danielebarchiesi@4 951 $field = field_info_field($field_name);
danielebarchiesi@4 952 $instance = field_info_instance($entity_type, $field_name, $bundle_name);
danielebarchiesi@4 953
danielebarchiesi@4 954 if (!$field || !$instance || $field['type'] != 'entityreference' || !field_access('edit', $field, $entity_type)) {
danielebarchiesi@4 955 return FALSE;
danielebarchiesi@4 956 }
danielebarchiesi@4 957 return TRUE;
danielebarchiesi@4 958 }
danielebarchiesi@4 959
danielebarchiesi@4 960 /**
danielebarchiesi@4 961 * Menu callback: autocomplete the label of an entity.
danielebarchiesi@4 962 *
danielebarchiesi@4 963 * @param $type
danielebarchiesi@4 964 * The widget type (i.e. 'single' or 'tags').
danielebarchiesi@4 965 * @param $field_name
danielebarchiesi@4 966 * The name of the entity-reference field.
danielebarchiesi@4 967 * @param $entity_type
danielebarchiesi@4 968 * The entity type.
danielebarchiesi@4 969 * @param $bundle_name
danielebarchiesi@4 970 * The bundle name.
danielebarchiesi@4 971 * @param $entity_id
danielebarchiesi@4 972 * Optional; The entity ID the entity-reference field is attached to.
danielebarchiesi@4 973 * Defaults to ''.
danielebarchiesi@4 974 * @param $string
danielebarchiesi@4 975 * The label of the entity to query by.
danielebarchiesi@4 976 */
danielebarchiesi@4 977 function entityreference_autocomplete_callback($type, $field_name, $entity_type, $bundle_name, $entity_id = '', $string = '') {
danielebarchiesi@4 978 $field = field_info_field($field_name);
danielebarchiesi@4 979 $instance = field_info_instance($entity_type, $field_name, $bundle_name);
danielebarchiesi@4 980
danielebarchiesi@4 981 return entityreference_autocomplete_callback_get_matches($type, $field, $instance, $entity_type, $entity_id, $string);
danielebarchiesi@4 982 }
danielebarchiesi@4 983
danielebarchiesi@4 984 /**
danielebarchiesi@4 985 * Return JSON based on given field, instance and string.
danielebarchiesi@4 986 *
danielebarchiesi@4 987 * This function can be used by other modules that wish to pass a mocked
danielebarchiesi@4 988 * definition of the field on instance.
danielebarchiesi@4 989 *
danielebarchiesi@4 990 * @param $type
danielebarchiesi@4 991 * The widget type (i.e. 'single' or 'tags').
danielebarchiesi@4 992 * @param $field
danielebarchiesi@4 993 * The field array defintion.
danielebarchiesi@4 994 * @param $instance
danielebarchiesi@4 995 * The instance array defintion.
danielebarchiesi@4 996 * @param $entity_type
danielebarchiesi@4 997 * The entity type.
danielebarchiesi@4 998 * @param $entity_id
danielebarchiesi@4 999 * Optional; The entity ID the entity-reference field is attached to.
danielebarchiesi@4 1000 * Defaults to ''.
danielebarchiesi@4 1001 * @param $string
danielebarchiesi@4 1002 * The label of the entity to query by.
danielebarchiesi@4 1003 */
danielebarchiesi@4 1004 function entityreference_autocomplete_callback_get_matches($type, $field, $instance, $entity_type, $entity_id = '', $string = '') {
danielebarchiesi@4 1005 $matches = array();
danielebarchiesi@4 1006
danielebarchiesi@4 1007 $entity = NULL;
danielebarchiesi@4 1008 if ($entity_id !== 'NULL') {
danielebarchiesi@4 1009 $entity = entity_load_single($entity_type, $entity_id);
danielebarchiesi@4 1010 if (!$entity || !entity_access('view', $entity_type, $entity)) {
danielebarchiesi@4 1011 return MENU_ACCESS_DENIED;
danielebarchiesi@4 1012 }
danielebarchiesi@4 1013 }
danielebarchiesi@4 1014
danielebarchiesi@4 1015 $handler = entityreference_get_selection_handler($field, $instance, $entity_type, $entity);
danielebarchiesi@4 1016
danielebarchiesi@4 1017 if ($type == 'tags') {
danielebarchiesi@4 1018 // The user enters a comma-separated list of tags. We only autocomplete the last tag.
danielebarchiesi@4 1019 $tags_typed = drupal_explode_tags($string);
danielebarchiesi@4 1020 $tag_last = drupal_strtolower(array_pop($tags_typed));
danielebarchiesi@4 1021 if (!empty($tag_last)) {
danielebarchiesi@4 1022 $prefix = count($tags_typed) ? implode(', ', $tags_typed) . ', ' : '';
danielebarchiesi@4 1023 }
danielebarchiesi@4 1024 }
danielebarchiesi@4 1025 else {
danielebarchiesi@4 1026 // The user enters a single tag.
danielebarchiesi@4 1027 $prefix = '';
danielebarchiesi@4 1028 $tag_last = $string;
danielebarchiesi@4 1029 }
danielebarchiesi@4 1030
danielebarchiesi@4 1031 if (isset($tag_last)) {
danielebarchiesi@4 1032 // Get an array of matching entities.
danielebarchiesi@4 1033 $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator'], 10);
danielebarchiesi@4 1034
danielebarchiesi@4 1035 // Loop through the products and convert them into autocomplete output.
danielebarchiesi@4 1036 foreach ($entity_labels as $values) {
danielebarchiesi@4 1037 foreach ($values as $entity_id => $label) {
danielebarchiesi@4 1038 $key = "$label ($entity_id)";
danielebarchiesi@4 1039 // Strip things like starting/trailing white spaces, line breaks and tags.
danielebarchiesi@4 1040 $key = preg_replace('/\s\s+/', ' ', str_replace("\n", '', trim(decode_entities(strip_tags($key)))));
danielebarchiesi@4 1041 // Names containing commas or quotes must be wrapped in quotes.
danielebarchiesi@4 1042 if (strpos($key, ',') !== FALSE || strpos($key, '"') !== FALSE) {
danielebarchiesi@4 1043 $key = '"' . str_replace('"', '""', $key) . '"';
danielebarchiesi@4 1044 }
danielebarchiesi@4 1045 $matches[$prefix . $key] = '<div class="reference-autocomplete">' . $label . '</div>';
danielebarchiesi@4 1046 }
danielebarchiesi@4 1047 }
danielebarchiesi@4 1048 }
danielebarchiesi@4 1049
danielebarchiesi@4 1050 drupal_json_output($matches);
danielebarchiesi@4 1051 }
danielebarchiesi@4 1052
danielebarchiesi@4 1053 /**
danielebarchiesi@4 1054 * Implements hook_field_formatter_info().
danielebarchiesi@4 1055 */
danielebarchiesi@4 1056 function entityreference_field_formatter_info() {
danielebarchiesi@4 1057 return array(
danielebarchiesi@4 1058 'entityreference_label' => array(
danielebarchiesi@4 1059 'label' => t('Label'),
danielebarchiesi@4 1060 'description' => t('Display the label of the referenced entities.'),
danielebarchiesi@4 1061 'field types' => array('entityreference'),
danielebarchiesi@4 1062 'settings' => array(
danielebarchiesi@4 1063 'link' => FALSE,
danielebarchiesi@4 1064 ),
danielebarchiesi@4 1065 ),
danielebarchiesi@4 1066 'entityreference_entity_id' => array(
danielebarchiesi@4 1067 'label' => t('Entity id'),
danielebarchiesi@4 1068 'description' => t('Display the id of the referenced entities.'),
danielebarchiesi@4 1069 'field types' => array('entityreference'),
danielebarchiesi@4 1070 ),
danielebarchiesi@4 1071 'entityreference_entity_view' => array(
danielebarchiesi@4 1072 'label' => t('Rendered entity'),
danielebarchiesi@4 1073 'description' => t('Display the referenced entities rendered by entity_view().'),
danielebarchiesi@4 1074 'field types' => array('entityreference'),
danielebarchiesi@4 1075 'settings' => array(
danielebarchiesi@4 1076 'view_mode' => '',
danielebarchiesi@4 1077 'links' => TRUE,
danielebarchiesi@4 1078 ),
danielebarchiesi@4 1079 ),
danielebarchiesi@4 1080 );
danielebarchiesi@4 1081 }
danielebarchiesi@4 1082
danielebarchiesi@4 1083 /**
danielebarchiesi@4 1084 * Implements hook_field_formatter_settings_form().
danielebarchiesi@4 1085 */
danielebarchiesi@4 1086 function entityreference_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
danielebarchiesi@4 1087 $display = $instance['display'][$view_mode];
danielebarchiesi@4 1088 $settings = $display['settings'];
danielebarchiesi@4 1089
danielebarchiesi@4 1090 if ($display['type'] == 'entityreference_label') {
danielebarchiesi@4 1091 $element['link'] = array(
danielebarchiesi@4 1092 '#title' => t('Link label to the referenced entity'),
danielebarchiesi@4 1093 '#type' => 'checkbox',
danielebarchiesi@4 1094 '#default_value' => $settings['link'],
danielebarchiesi@4 1095 );
danielebarchiesi@4 1096 }
danielebarchiesi@4 1097
danielebarchiesi@4 1098 if ($display['type'] == 'entityreference_entity_view') {
danielebarchiesi@4 1099 $entity_info = entity_get_info($field['settings']['target_type']);
danielebarchiesi@4 1100 $options = array();
danielebarchiesi@4 1101 if (!empty($entity_info['view modes'])) {
danielebarchiesi@4 1102 foreach ($entity_info['view modes'] as $view_mode => $view_mode_settings) {
danielebarchiesi@4 1103 $options[$view_mode] = $view_mode_settings['label'];
danielebarchiesi@4 1104 }
danielebarchiesi@4 1105 }
danielebarchiesi@4 1106
danielebarchiesi@4 1107 if (count($options) > 1) {
danielebarchiesi@4 1108 $element['view_mode'] = array(
danielebarchiesi@4 1109 '#type' => 'select',
danielebarchiesi@4 1110 '#options' => $options,
danielebarchiesi@4 1111 '#title' => t('View mode'),
danielebarchiesi@4 1112 '#default_value' => $settings['view_mode'],
danielebarchiesi@4 1113 );
danielebarchiesi@4 1114 }
danielebarchiesi@4 1115
danielebarchiesi@4 1116 $element['links'] = array(
danielebarchiesi@4 1117 '#type' => 'checkbox',
danielebarchiesi@4 1118 '#title' => t('Show links'),
danielebarchiesi@4 1119 '#default_value' => $settings['links'],
danielebarchiesi@4 1120 );
danielebarchiesi@4 1121 }
danielebarchiesi@4 1122
danielebarchiesi@4 1123 return $element;
danielebarchiesi@4 1124 }
danielebarchiesi@4 1125
danielebarchiesi@4 1126 /**
danielebarchiesi@4 1127 * Implements hook_field_formatter_settings_summary().
danielebarchiesi@4 1128 */
danielebarchiesi@4 1129 function entityreference_field_formatter_settings_summary($field, $instance, $view_mode) {
danielebarchiesi@4 1130 $display = $instance['display'][$view_mode];
danielebarchiesi@4 1131 $settings = $display['settings'];
danielebarchiesi@4 1132
danielebarchiesi@4 1133 $summary = array();
danielebarchiesi@4 1134
danielebarchiesi@4 1135 if ($display['type'] == 'entityreference_label') {
danielebarchiesi@4 1136 $summary[] = $settings['link'] ? t('Link to the referenced entity') : t('No link');
danielebarchiesi@4 1137 }
danielebarchiesi@4 1138
danielebarchiesi@4 1139 if ($display['type'] == 'entityreference_entity_view') {
danielebarchiesi@4 1140 $entity_info = entity_get_info($field['settings']['target_type']);
danielebarchiesi@4 1141 $summary[] = t('Rendered as @mode', array('@mode' => isset($entity_info['view modes'][$settings['view_mode']]['label']) ? $entity_info['view modes'][$settings['view_mode']]['label'] : $settings['view_mode']));
danielebarchiesi@4 1142 $summary[] = !empty($settings['links']) ? t('Display links') : t('Do not display links');
danielebarchiesi@4 1143 }
danielebarchiesi@4 1144
danielebarchiesi@4 1145 return implode('<br />', $summary);
danielebarchiesi@4 1146 }
danielebarchiesi@4 1147
danielebarchiesi@4 1148 /**
danielebarchiesi@4 1149 * Implements hook_field_formatter_prepare_view().
danielebarchiesi@4 1150 */
danielebarchiesi@4 1151 function entityreference_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
danielebarchiesi@4 1152 $target_ids = array();
danielebarchiesi@4 1153
danielebarchiesi@4 1154 // Collect every possible entity attached to any of the entities.
danielebarchiesi@4 1155 foreach ($entities as $id => $entity) {
danielebarchiesi@4 1156 foreach ($items[$id] as $delta => $item) {
danielebarchiesi@4 1157 if (isset($item['target_id'])) {
danielebarchiesi@4 1158 $target_ids[] = $item['target_id'];
danielebarchiesi@4 1159 }
danielebarchiesi@4 1160 }
danielebarchiesi@4 1161 }
danielebarchiesi@4 1162
danielebarchiesi@4 1163 if ($target_ids) {
danielebarchiesi@4 1164 $target_entities = entity_load($field['settings']['target_type'], $target_ids);
danielebarchiesi@4 1165 }
danielebarchiesi@4 1166 else {
danielebarchiesi@4 1167 $target_entities = array();
danielebarchiesi@4 1168 }
danielebarchiesi@4 1169
danielebarchiesi@4 1170 // Iterate through the fieldable entities again to attach the loaded data.
danielebarchiesi@4 1171 foreach ($entities as $id => $entity) {
danielebarchiesi@4 1172 $rekey = FALSE;
danielebarchiesi@4 1173
danielebarchiesi@4 1174 foreach ($items[$id] as $delta => $item) {
danielebarchiesi@4 1175 // Check whether the referenced entity could be loaded.
danielebarchiesi@4 1176 if (isset($target_entities[$item['target_id']])) {
danielebarchiesi@4 1177 // Replace the instance value with the term data.
danielebarchiesi@4 1178 $items[$id][$delta]['entity'] = $target_entities[$item['target_id']];
danielebarchiesi@4 1179 // Check whether the user has access to the referenced entity.
danielebarchiesi@4 1180 $items[$id][$delta]['access'] = entity_access('view', $field['settings']['target_type'], $target_entities[$item['target_id']]);
danielebarchiesi@4 1181 }
danielebarchiesi@4 1182 // Otherwise, unset the instance value, since the entity does not exist.
danielebarchiesi@4 1183 else {
danielebarchiesi@4 1184 unset($items[$id][$delta]);
danielebarchiesi@4 1185 $rekey = TRUE;
danielebarchiesi@4 1186 }
danielebarchiesi@4 1187 }
danielebarchiesi@4 1188
danielebarchiesi@4 1189 if ($rekey) {
danielebarchiesi@4 1190 // Rekey the items array.
danielebarchiesi@4 1191 $items[$id] = array_values($items[$id]);
danielebarchiesi@4 1192 }
danielebarchiesi@4 1193 }
danielebarchiesi@4 1194 }
danielebarchiesi@4 1195
danielebarchiesi@4 1196 /**
danielebarchiesi@4 1197 * Implements hook_field_formatter_view().
danielebarchiesi@4 1198 */
danielebarchiesi@4 1199 function entityreference_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
danielebarchiesi@4 1200 $result = array();
danielebarchiesi@4 1201 $settings = $display['settings'];
danielebarchiesi@4 1202
danielebarchiesi@4 1203 // Rebuild the items list to contain only those with access.
danielebarchiesi@4 1204 foreach ($items as $key => $item) {
danielebarchiesi@4 1205 if (empty($item['access'])) {
danielebarchiesi@4 1206 unset($items[$key]);
danielebarchiesi@4 1207 }
danielebarchiesi@4 1208 }
danielebarchiesi@4 1209
danielebarchiesi@4 1210 switch ($display['type']) {
danielebarchiesi@4 1211 case 'entityreference_label':
danielebarchiesi@4 1212 $handler = entityreference_get_selection_handler($field, $instance, $entity_type, $entity);
danielebarchiesi@4 1213
danielebarchiesi@4 1214 foreach ($items as $delta => $item) {
danielebarchiesi@4 1215 $label = $handler->getLabel($item['entity']);
danielebarchiesi@4 1216 // If the link is to be displayed and the entity has a uri, display a link.
danielebarchiesi@4 1217 // Note the assignment ($url = ) here is intended to be an assignment.
danielebarchiesi@4 1218 if ($display['settings']['link'] && ($uri = entity_uri($field['settings']['target_type'], $item['entity']))) {
danielebarchiesi@4 1219 $result[$delta] = array('#markup' => l($label, $uri['path'], $uri['options']));
danielebarchiesi@4 1220 }
danielebarchiesi@4 1221 else {
danielebarchiesi@4 1222 $result[$delta] = array('#markup' => check_plain($label));
danielebarchiesi@4 1223 }
danielebarchiesi@4 1224 }
danielebarchiesi@4 1225 break;
danielebarchiesi@4 1226
danielebarchiesi@4 1227 case 'entityreference_entity_id':
danielebarchiesi@4 1228 foreach ($items as $delta => $item) {
danielebarchiesi@4 1229 $result[$delta] = array('#markup' => check_plain($item['target_id']));
danielebarchiesi@4 1230 }
danielebarchiesi@4 1231 break;
danielebarchiesi@4 1232
danielebarchiesi@4 1233 case 'entityreference_entity_view':
danielebarchiesi@4 1234 foreach ($items as $delta => $item) {
danielebarchiesi@4 1235 // Protect ourselves from recursive rendering.
danielebarchiesi@4 1236 static $depth = 0;
danielebarchiesi@4 1237 $depth++;
danielebarchiesi@4 1238 if ($depth > 20) {
danielebarchiesi@4 1239 throw new EntityReferenceRecursiveRenderingException(t('Recursive rendering detected when rendering entity @entity_type(@entity_id). Aborting rendering.', array('@entity_type' => $entity_type, '@entity_id' => $item['target_id'])));
danielebarchiesi@4 1240 }
danielebarchiesi@4 1241
danielebarchiesi@4 1242 $entity = clone $item['entity'];
danielebarchiesi@4 1243 unset($entity->content);
danielebarchiesi@4 1244 $result[$delta] = entity_view($field['settings']['target_type'], array($item['target_id'] => $entity), $settings['view_mode'], $langcode, FALSE);
danielebarchiesi@4 1245
danielebarchiesi@4 1246 if (empty($settings['links']) && isset($result[$delta][$field['settings']['target_type']][$item['target_id']]['links'])) {
danielebarchiesi@4 1247 $result[$delta][$field['settings']['target_type']][$item['target_id']]['links']['#access'] = FALSE;
danielebarchiesi@4 1248 }
danielebarchiesi@4 1249 $depth = 0;
danielebarchiesi@4 1250 }
danielebarchiesi@4 1251 break;
danielebarchiesi@4 1252 }
danielebarchiesi@4 1253
danielebarchiesi@4 1254 return $result;
danielebarchiesi@4 1255 }
danielebarchiesi@4 1256
danielebarchiesi@4 1257 /**
danielebarchiesi@4 1258 * Exception thrown when the entity view renderer goes into a potentially infinite loop.
danielebarchiesi@4 1259 */
danielebarchiesi@4 1260 class EntityReferenceRecursiveRenderingException extends Exception {}
danielebarchiesi@4 1261
danielebarchiesi@4 1262 /**
danielebarchiesi@4 1263 * Implements hook_views_api().
danielebarchiesi@4 1264 */
danielebarchiesi@4 1265 function entityreference_views_api() {
danielebarchiesi@4 1266 return array(
danielebarchiesi@4 1267 'api' => 3,
danielebarchiesi@4 1268 'path' => drupal_get_path('module', 'entityreference') . '/views',
danielebarchiesi@4 1269 );
danielebarchiesi@4 1270 }