【问题标题】:Change Link Name on Generated Link Field在生成的链接字段上更改链接名称
【发布时间】:2016-07-30 12:20:57
【问题描述】:

我在 Drupal 8 和 node.html.twig 模板上创建了一个自定义主题,我使用 {{content.field_type}} 显示当前页面所在类别的链接,以允许用户链接回该类别中的页面列表。使用这个,页面呈现:

<a href="/drupal/main-cat/sub-cat" hreflang="en">Sub Cat Name</a>

我需要做什么来改变这个:

<a href="/drupal/main-cat/sub-cat" hreflang="en">My Custom Link</a>

【问题讨论】:

    标签: drupal twig drupal-theming drupal-8


    【解决方案1】:

    可以使用预处理函数更改渲染数组,但在您的情况下,这不是一个好主意。您正在谈论的链接是字段格式化程序渲染的结果。因此,您只需要为您的“类型”字段使用另一个字段格式化程序,而不是当前的“标签”格式化程序。

    创建新的格式化程序非常容易(特别是如果您使用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;
      }
    
    }
    

    启用此模块后(如果之前启用此模块,则在清除缓存后),您将拥有所有“实体引用”字段的“链接”格式化程序,允许您仅在格式化程序设置中自定义链接文本。

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 2013-10-26
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2011-11-04
      • 2014-04-10
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多