file_get_file_references(FileInterface $file, FieldDefinitionInterface $field = NULL, $age = EntityStorageInterface::FIELD_LOAD_REVISION, $field_type = 'file')
Retrieves a list of references to a file.
Parameters
\Drupal\file\FileInterface $file: A file entity.
\Drupal\Core\Field\FieldDefinitionInterface|null $field: (optional) A field definition to be used for this check. If given, limits the reference check to the given field. Defaults to NULL.
int $age: (optional) A constant that specifies which references to count. Use EntityStorageInterface::FIELD_LOAD_REVISION (the default) to retrieve all references within all revisions or EntityStorageInterface::FIELD_LOAD_CURRENT to retrieve references only in the current revisions of all entities that have references to this file.
string $field_type: (optional) The name of a field type. If given, limits the reference check to fields of the given type. If both $field and $field_type are given but $field is not the same type as $field_type, an empty array will be returned. Defaults to 'file'.
Return value
array A multidimensional array. The keys are field_name, entity_type, entity_id and the value is an entity referencing this file.
Related topics
- File interface
- Common file handling functions.
File
- core/modules/file/file.module, line 1475
- Defines a "managed_file" Form API field and a "file" field for Field module.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | function file_get_file_references(FileInterface $file , FieldDefinitionInterface $field = NULL, $age = EntityStorageInterface::FIELD_LOAD_REVISION, $field_type = 'file' ) { $references = &drupal_static( __FUNCTION__ , array ()); $field_columns = &drupal_static( __FUNCTION__ . ':field_columns' , array ()); // Fill the static cache, disregard $field and $field_type for now. if (!isset( $references [ $file ->id()][ $age ])) { $references [ $file ->id()][ $age ] = array (); $usage_list = \Drupal::service( 'file.usage' )->listUsage( $file ); $file_usage_list = isset( $usage_list [ 'file' ]) ? $usage_list [ 'file' ] : array (); foreach ( $file_usage_list as $entity_type_id => $entity_ids ) { $entities = \Drupal::entityTypeManager() ->getStorage( $entity_type_id )->loadMultiple( array_keys ( $entity_ids )); foreach ( $entities as $entity ) { $bundle = $entity ->bundle(); // We need to find file fields for this entity type and bundle. if (!isset( $file_fields [ $entity_type_id ][ $bundle ])) { $file_fields [ $entity_type_id ][ $bundle ] = array (); // This contains the possible field names. foreach ( $entity ->getFieldDefinitions() as $field_name => $field_definition ) { // If this is the first time this field type is seen, check // whether it references files. if (!isset( $field_columns [ $field_definition -> getType ()])) { $field_columns [ $field_definition -> getType ()] = file_field_find_file_reference_column( $field_definition ); } // If the field type does reference files then record it. if ( $field_columns [ $field_definition -> getType ()]) { $file_fields [ $entity_type_id ][ $bundle ][ $field_name ] = $field_columns [ $field_definition -> getType ()]; } } } foreach ( $file_fields [ $entity_type_id ][ $bundle ] as $field_name => $field_column ) { // Iterate over the field items to find the referenced file and field // name. This will fail if the usage checked is in a non-current // revision because field items are from the current // revision. // We also iterate over all translations because a file can be linked // to a language other than the default. foreach ( $entity ->getTranslationLanguages() as $langcode => $language ) { foreach ( $entity ->getTranslation( $langcode )->get( $field_name ) as $item ) { if ( $file ->id() == $item ->{ $field_column }) { $references [ $file ->id()][ $age ][ $field_name ][ $entity_type_id ][ $entity ->id()] = $entity ; break ; } } } } } } } $return = $references [ $file ->id()][ $age ]; // Filter the static cache down to the requested entries. The usual static // cache is very small so this will be very fast. if ( $field || $field_type ) { foreach ( $return as $field_name => $data ) { foreach ( array_keys ( $data ) as $entity_type_id ) { $field_storage_definitions = \Drupal::entityManager()->getFieldStorageDefinitions( $entity_type_id ); $current_field = $field_storage_definitions [ $field_name ]; if (( $field_type && $current_field -> getType () != $field_type ) || ( $field && $field ->uuid() != $current_field ->uuid())) { unset( $return [ $field_name ][ $entity_type_id ]); } } } } return $return ; } |
Please login to continue.