You are here

public function TelephoneLinkFormatter::viewElements in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php \Drupal\telephone\Plugin\Field\FieldFormatter\TelephoneLinkFormatter::viewElements()
  2. 9 core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php \Drupal\telephone\Plugin\Field\FieldFormatter\TelephoneLinkFormatter::viewElements()

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 FormatterInterface::viewElements

File

core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php, line 65

Class

TelephoneLinkFormatter
Plugin implementation of the 'telephone_link' formatter.

Namespace

Drupal\telephone\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $element = [];
  $title_setting = $this
    ->getSetting('title');
  foreach ($items as $delta => $item) {

    // If the telephone number is 5 or less digits, parse_url() will think
    // it's a port number rather than a phone number which causes the link
    // formatter to throw an InvalidArgumentException. Avoid this by inserting
    // a dash (-) after the first digit - RFC 3966 defines the dash as a
    // visual separator character and so will be removed before the phone
    // number is used. See https://bugs.php.net/bug.php?id=70588 for more.
    // While the bug states this only applies to numbers <= 65535, a 5 digit
    // number greater than 65535 will cause parse_url() to return FALSE so
    // we need the work around on any 5 digit (or less) number.
    // First we strip whitespace so we're counting actual digits.
    $phone_number = preg_replace('/\\s+/', '', $item->value);
    if (strlen($phone_number) <= 5) {
      $phone_number = substr_replace($phone_number, '-', 1, 0);
    }

    // Render each element as link.
    $element[$delta] = [
      '#type' => 'link',
      // Use custom title if available, otherwise use the telephone number
      // itself as title.
      '#title' => $title_setting ?: $item->value,
      // Prepend 'tel:' to the telephone number.
      '#url' => Url::fromUri('tel:' . rawurlencode($phone_number)),
      '#options' => [
        'external' => TRUE,
      ],
    ];
    if (!empty($item->_attributes)) {
      $element[$delta]['#options'] += [
        'attributes' => [],
      ];
      $element[$delta]['#options']['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;
}