Можно изменить визуализации массивов с помощью функции Preprocess, но в вашем случае это не хорошая идея. Ссылка, о которой вы говорите, является результатом рендеринга полямера. Таким образом, вам нужен еще один форматирующий поле для поля «Тип» вместо текущего форматирования «Ярлык».
Создание нового форматирования довольно просто (особенно, если вы используете в качестве примера EntityReferenceLabelFormatter
). Предположим, у вас есть модуль под названием entity_reference_link_formatter
. Затем в каталоге этого модуля создать src/Plugin/Field/FieldFormatter
папку и поместить туда следующий EntityReferenceLinkFormatter.php
файл:
<?php
/**
* @file
* Contains Drupal\entity_reference_link_formatter\Plugin\Field\FieldFormatter\EntityReferenceLinkFormatter
*/
namespace Drupal\entity_reference_link_formatter\Plugin\Field\FieldFormatter;
use Drupal\Core\Entity\Exception\UndefinedLinkTemplateException;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Plugin implementation of the 'entity reference link' formatter.
*
* @FieldFormatter(
* id = "entity_reference_link",
* label = @Translation("Link"),
* description = @Translation("Display the link to the referenced entity."),
* field_types = {
* "entity_reference"
* }
*)
*/
class EntityReferenceLinkFormatter extends EntityReferenceFormatterBase {
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'text' => 'View',
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$elements['text'] = [
'#title' => t('Text of the link to the referenced entity'),
'#type' => 'textfield',
'#required' => true,
'#default_value' => $this->getSetting('text'),
];
return $elements;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = [];
$summary[] = t('Link text: @text', ['@text' => $this->getSetting('text')]);
return $summary;
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = array();
foreach ($this->getEntitiesToView($items, $langcode) as $delta => $entity) {
if (!$entity->isNew()) {
try {
$uri = $entity->urlInfo();
$elements[$delta] = [
'#type' => 'link',
'#title' => t('!text', ['!text' => $this->getSetting('text')]),
'#url' => $uri,
'#options' => $uri->getOptions(),
];
if (!empty($items[$delta]->_attributes)) {
$elements[$delta]['#options'] += array('attributes' => array());
$elements[$delta]['#options']['attributes'] += $items[$delta]->_attributes;
// Unset field item attributes since they have been included in the
// formatter output and shouldn't be rendered in the field template.
unset($items[$delta]->_attributes);
}
}
catch (UndefinedLinkTemplateException $e) {
// This exception is thrown by \Drupal\Core\Entity\Entity::urlInfo()
// and it means that the entity type doesn't have a link template nor
// a valid "uri_callback", so don't bother trying to output a link for
// the rest of the referenced entities.
}
}
$elements[$delta]['#cache']['tags'] = $entity->getCacheTags();
}
return $elements;
}
}
После включения этого модуля (или после очистки кэша, если этот модуль был включен ранее), вы будете иметь форматировщик «Ссылка» для всех полей «Ссылки на объекты», позволяющих настраивать текст ссылки только в настройках форматирования.