summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2010-02-07 05:12:35 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2010-02-07 05:12:35 +0000
commit73c28090e36e2ade9c055f7da58767e57d935898 (patch)
treebb6efe15e2c868c65df37adb4859e4a630c82b1c
parent3729441ace1f10b5f37079a7dfcf9f7f26156213 (diff)
downloadbrdo-73c28090e36e2ade9c055f7da58767e57d935898.tar.gz
brdo-73c28090e36e2ade9c055f7da58767e57d935898.tar.bz2
#668386 by yched: Handle unavailable entity types or bundles.
-rw-r--r--includes/common.inc7
-rw-r--r--modules/field/field.crud.inc32
-rw-r--r--modules/field/tests/field.test23
3 files changed, 49 insertions, 13 deletions
diff --git a/includes/common.inc b/includes/common.inc
index 358f76103..566c896b9 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 b69baff28..1cc95217e 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 3cfd3f797..ca503002f 100644
--- a/modules/field/tests/field.test
+++ b/modules/field/tests/field.test
@@ -1348,6 +1348,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.
*/
function testSettingsInfo() {