protected ContentEntityStorageBase::invokeFieldMethod($method, ContentEntityInterface $entity)
Invokes a method on the Field objects within an entity.
Any argument passed will be forwarded to the invoked method.
Parameters
string $method: The name of the method to be invoked.
\Drupal\Core\Entity\ContentEntityInterface $entity: The entity object.
Return value
array A multidimensional associative array of results, keyed by entity translation language code and field name.
File
- core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php, line 435
Class
- ContentEntityStorageBase
- Base class for content entity storage handlers.
Namespace
Drupal\Core\Entity
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 | protected function invokeFieldMethod( $method , ContentEntityInterface $entity ) { $result = []; $args = array_slice (func_get_args(), 2); $langcodes = array_keys ( $entity ->getTranslationLanguages()); // Ensure that the field method is invoked as first on the current entity // translation and then on all other translations. $current_entity_langcode = $entity ->language()->getId(); if (reset( $langcodes ) != $current_entity_langcode ) { $langcodes = array_diff ( $langcodes , [ $current_entity_langcode ]); array_unshift ( $langcodes , $current_entity_langcode ); } foreach ( $langcodes as $langcode ) { $translation = $entity ->getTranslation( $langcode ); // For non translatable fields, there is only one field object instance // across all translations and it has as parent entity the entity in the // default entity translation. Therefore field methods on non translatable // fields should be invoked only on the default entity translation. $fields = $translation ->isDefaultTranslation() ? $translation ->getFields() : $translation ->getTranslatableFields(); foreach ( $fields as $name => $items ) { // call_user_func_array() is way slower than a direct call so we avoid // using it if have no parameters. $result [ $langcode ][ $name ] = $args ? call_user_func_array([ $items , $method ], $args ) : $items ->{ $method }(); } } // We need to call the delete method for field items of removed // translations. if ( $method == 'postSave' && ! empty ( $entity ->original)) { $original_langcodes = array_keys ( $entity ->original->getTranslationLanguages()); foreach ( array_diff ( $original_langcodes , $langcodes ) as $removed_langcode ) { $translation = $entity ->original->getTranslation( $removed_langcode ); $fields = $translation ->getTranslatableFields(); foreach ( $fields as $name => $items ) { $items -> delete (); } } } return $result ; } |
Please login to continue.