diff -u b/tests/src/Kernel/FieldTest.php b/tests/src/Kernel/FieldTest.php --- b/tests/src/Kernel/FieldTest.php +++ b/tests/src/Kernel/FieldTest.php @@ -127,12 +127,17 @@ ], ]); $entity->save(); - $this->assertTokens('node', ['node' => $entity], [ 'test_field' => Markup::create('foo'), + 'test_field:0' => Markup::create('foo'), 'test_field:0:value' => 'foo', + 'test_field:value' => 'foo', 'test_field:0:format' => $this->testFormat->id(), + 'test_field:format' => $this->testFormat->id(), + 'test_list:0' => Markup::create('value1'), + 'test_list:1' => Markup::create('value2'), 'test_list:0:value' => Markup::create('value1'), + 'test_list:value' => Markup::create('value1'), 'test_list:1:value' => Markup::create('value2'), ]); @@ -207,6 +212,14 @@ $this->assertEqual($token_info['name'], 'Test field', 'The token info name is correct.'); $this->assertEqual((string) $token_info['description'], 'Text (formatted) field. Also known as Different test field.', 'When a field is used in several bundles with different labels, this is noted at the token info description.'); $this->assertEqual($token_info['module'], 'token', 'The token info module is correct.'); + $this->assertEqual($token_info['type'], 'node-test_field', 'The field property token info type is correct.'); + + // Test field property token info. + $token_info = $tokenService->getTokenInfo('node-test_field', 'value'); + $this->assertEqual($token_info['name'], 'Text', 'The field property token info name is correct.'); + // This particular field property description happens to be empty. + $this->assertEqual((string) $token_info['description'], '', 'The field property token info description is correct.'); + $this->assertEqual($token_info['module'], 'token', 'The field property token info module is correct.'); } /** diff -u b/token.tokens.inc b/token.tokens.inc --- b/token.tokens.inc +++ b/token.tokens.inc @@ -1325,8 +1325,8 @@ // inside field_attach_view(). unset($entity->_field_view_prepared); - $view_display = \Drupal::entityTypeManager()->getStorage('entity_view_display') - ->load($entity->getEntityTypeId() . '.' . $entity->bundle() . '.token'); + $view_mode_name = $entity->getEntityTypeId() . '.' . $entity->bundle() . '.token'; + $view_display = \Drupal::entityTypeManager()->getStorage('entity_view_display')->load($view_mode_name); $token_view_display = (!empty($view_display) && $view_display->status()); foreach ($tokens as $name => $original) { // For the [entity:field_name] token. @@ -1395,8 +1395,8 @@ 'token_type' => 'field_property', $data['entity_type'] . '-' . $field_name => $data['entity']->$field_name, 'field_name' => $data['entity_type'] . '-' . $field_name, - ]; - $replacements += \Drupal::token()->generate($field_name, $field_tokens, $property_token_data, $options, $bubbleable_metadata); + ]; + $replacements += \Drupal::token()->generate($field_name, $field_tokens, $property_token_data, $options, $bubbleable_metadata); } } @@ -1406,12 +1406,23 @@ elseif (!empty($data['token_type']) && $data['token_type'] == 'field_property') { foreach ($tokens as $name => $original) { // Handle [entity:field_name:0:value] tokens. - list($delta, $rest) = explode(':', $name, 2); - $name = is_numeric($delta) ? $rest : $name; + if (strpos($name, ':') !== FALSE) { + list($delta, $rest) = explode(':', $name, 2); + $name = is_numeric($delta) ? $rest : $name; + } // [entity:field_name:value] is treated as [entity:field_name:0:value]. - $delta = is_numeric($delta) ? $delta : 0; + else { + $delta = 0; + } if ($field_delta = $data[$data['field_name']][$delta]) { - $replacements[$original] = $field_delta->getValue()[$name]; + $field_delta_value = $field_delta->getValue(); + if (isset($field_delta_value[$name])) { + $replacements[$original] = $field_delta_value[$name]; + } + // This is not a field property token. + else { + continue; + } } // If no such delta exists, let's not replace the token. else {