From 73c28090e36e2ade9c055f7da58767e57d935898 Mon Sep 17 00:00:00 2001 From: Angie Byron <webchick@24967.no-reply.drupal.org> Date: Sun, 7 Feb 2010 05:12:35 +0000 Subject: [PATCH] #668386 by yched: Handle unavailable entity types or bundles. --- includes/common.inc | 7 ++++++- modules/field/field.crud.inc | 32 ++++++++++++++++++++------------ modules/field/tests/field.test | 23 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/includes/common.inc b/includes/common.inc index 358f761036ab..566c896b9115 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -6396,7 +6396,12 @@ function entity_get_info($entity_type = NULL) { } } - return empty($entity_type) ? $entity_info : $entity_info[$entity_type]; + if (empty($entity_type)) { + return $entity_info; + } + elseif (isset($entity_info[$entity_type])) { + return $entity_info[$entity_type]; + } } /** diff --git a/modules/field/field.crud.inc b/modules/field/field.crud.inc index b69baff284af..1cc95217ee20 100644 --- a/modules/field/field.crud.inc +++ b/modules/field/field.crud.inc @@ -823,6 +823,9 @@ function field_read_instance($obj_type, $field_name, $bundle, $include_additiona * An array of instances matching the arguments. */ function field_read_instances($params = array(), $include_additional = array()) { + $include_inactive = isset($include_additional['include_inactive']) && $include_additional['include_inactive']; + $include_deleted = isset($include_additional['include_deleted']) && $include_additional['include_deleted']; + $query = db_select('field_config_instance', 'fci', array('fetch' => PDO::FETCH_ASSOC)); $query->join('field_config', 'fc', 'fc.id = fci.field_id'); $query->fields('fci'); @@ -831,12 +834,12 @@ function field_read_instances($params = array(), $include_additional = array()) foreach ($params as $key => $value) { $query->condition('fci.' . $key, $value); } - if (!isset($include_additional['include_inactive']) || !$include_additional['include_inactive']) { + if (!$include_inactive) { $query ->condition('fc.active', 1) ->condition('fc.storage_active', 1); } - if (!isset($include_additional['include_deleted']) || !$include_additional['include_deleted']) { + if (!$include_deleted) { $query->condition('fc.deleted', 0); $query->condition('fci.deleted', 0); } @@ -845,16 +848,21 @@ function field_read_instances($params = array(), $include_additional = array()) $results = $query->execute(); foreach ($results as $record) { - $instance = unserialize($record['data']); - $instance['id'] = $record['id']; - $instance['field_id'] = $record['field_id']; - $instance['field_name'] = $record['field_name']; - $instance['object_type'] = $record['object_type']; - $instance['bundle'] = $record['bundle']; - $instance['deleted'] = $record['deleted']; - - module_invoke_all('field_read_instance', $instance); - $instances[] = $instance; + // Filter out instances on unknown object types (for instance because the + // module exposing them was disabled). + $entity_info = entity_get_info($record['object_type']); + if ($include_inactive || $entity_info) { + $instance = unserialize($record['data']); + $instance['id'] = $record['id']; + $instance['field_id'] = $record['field_id']; + $instance['field_name'] = $record['field_name']; + $instance['object_type'] = $record['object_type']; + $instance['bundle'] = $record['bundle']; + $instance['deleted'] = $record['deleted']; + + module_invoke_all('field_read_instance', $instance); + $instances[] = $instance; + } } return $instances; } diff --git a/modules/field/tests/field.test b/modules/field/tests/field.test index 3cfd3f7974d4..ca503002f7a1 100644 --- a/modules/field/tests/field.test +++ b/modules/field/tests/field.test @@ -1347,6 +1347,29 @@ class FieldInfoTestCase extends FieldTestCase { } } + /** + * Test that instances on disabled object types are filtered out. + */ + function testInstanceDisabledObjectType() { + // For this test the field type and the object type must be exposed by + // different modules. + $field_definition = array( + 'field_name' => 'field', + 'type' => 'test_field', + ); + field_create_field($field_definition); + $instance_definition = array( + 'field_name' => 'field', + 'object_type' => 'comment', + 'bundle' => 'comment_node_article', + ); + field_create_instance($instance_definition); + + // Disable coment module. This clears field_info cache. + module_disable(array('comment')); + $this->assertNull(field_info_instance('comment', 'field', 'comment_node_article'), t('No instances are returned on disabled object types.')); + } + /** * Test that the field_info settings convenience functions work. */ -- GitLab