You are here

public function ButtonLinkFormatter::viewElements in Button Link Formatter 8

Builds a renderable array for a field value.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.

string $langcode: The language that should be used to render the field.

Return value

array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.

Overrides LinkFormatter::viewElements

File

src/Plugin/Field/FieldFormatter/ButtonLinkFormatter.php, line 136

Class

ButtonLinkFormatter
Plugin implementation of the 'link_separate' formatter.

Namespace

Drupal\button_link\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $element = array();
  $entity = $items
    ->getEntity();
  $settings = $this
    ->getSettings();
  foreach ($items as $delta => $item) {

    // By default use the full URL as the link text.
    $url = $this
      ->buildUrl($item);
    $link_title = $url
      ->toString();

    // If the link text field value is available, use it for the text.
    if (empty($settings['url_only']) && !empty($item->title)) {

      // Unsanitized token replacement here because the entire link title
      // gets auto-escaped during link generation in
      // \Drupal\Core\Utility\LinkGenerator::generate().
      $link_title = \Drupal::token()
        ->replace($item->title, [
        $entity
          ->getEntityTypeId() => $entity,
      ], [
        'clear' => TRUE,
      ]);
    }
    if (!empty($settings['link_text'])) {
      $link_title = $this
        ->t($settings['link_text']);
    }

    // The link_separate formatter has two titles; the link text (as in the
    // field values) and the URL itself. If there is no link text value,
    // $link_title defaults to the URL, so it needs to be unset.
    // The URL version may need to be trimmed as well.
    if (empty($item->title) && empty($settings['link_text'])) {
      $link_title = NULL;
    }
    $url_title = $url
      ->toString();
    if (!empty($settings['trim_length'])) {
      $link_title = Unicode::truncate($link_title, $settings['trim_length'], FALSE, TRUE);
      $url_title = Unicode::truncate($url_title, $settings['trim_length'], FALSE, TRUE);
    }
    $element[$delta] = array(
      '#theme' => 'link_formatter_button_link',
      '#title' => $link_title,
      '#url_title' => $url_title,
      '#url' => $url,
      '#type' => $settings['btn_type'],
      '#size' => $settings['btn_size'],
      '#block' => $settings['btn_block'],
      '#icon_class' => $settings['icon_class'],
    );
    if (!empty($item->_attributes)) {

      // Set our RDFa attributes on the <a> element that is being built.
      $url
        ->setOption('attributes', $item->_attributes);

      // Unset field item attributes since they have been included in the
      // formatter output and should not be rendered in the field template.
      unset($item->_attributes);
    }
  }
  return $element;
}