View source
<?php
namespace Drupal\telephone_formatter\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Locale\CountryManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Url;
use Drupal\telephone_formatter\FormatterInterface;
use libphonenumber\PhoneNumberFormat;
use Symfony\Component\DependencyInjection\ContainerInterface;
class TelephoneFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
protected $formatter;
protected $countryManager;
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, FormatterInterface $formatter, CountryManagerInterface $countryManager) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$this->formatter = $formatter;
$this->countryManager = $countryManager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container
->get('telephone_formatter.formatter'), $container
->get('country_manager'));
}
public static function defaultSettings() {
return [
'format' => PhoneNumberFormat::INTERNATIONAL,
'link' => TRUE,
'default_country' => NULL,
] + parent::defaultSettings();
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$elements['format'] = [
'#type' => 'select',
'#title' => $this
->t('Format'),
'#description' => $this
->t('List of available formats'),
'#default_value' => $this
->getSetting('format'),
'#options' => self::availableFormats(),
];
$elements['link'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Link'),
'#description' => $this
->t('Format as link'),
'#default_value' => $this
->getSetting('link'),
];
$elements['default_country'] = [
'#type' => 'select',
'#title' => $this
->t('Default country'),
'#description' => $this
->t('If field allows internal telephone numbers you can choose which country this number belongs to by default. It is highly advised to enable telephone validation for this field to ensure that telephone number is valid and can be parsed and reformatted.'),
'#default_value' => $this
->getSetting('default_country'),
'#options' => [
NULL => $this
->t('- Do not use default country -'),
] + $this->countryManager
->getList(),
];
return $elements;
}
public function settingsSummary() {
$summary = [];
$formats = self::availableFormats();
$summary[] = $this
->t('Format: @format', [
'@format' => $formats[$this
->getSetting('format')],
]);
$summary[] = $this
->t('Link: @link', [
'@link' => $this
->getSetting('link') ? $this
->t('Yes') : $this
->t('No'),
]);
if ($default_country = $this
->getSetting('default_country')) {
$summary[] = $this
->t('Default country: @default_country', [
'@default_country' => $default_country,
]);
}
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) {
$element = [];
foreach ($items as $delta => $item) {
try {
if ($this
->getSetting('link')) {
$element[$delta] = $this
->viewLinkValue($item);
}
else {
$element[$delta] = $this
->viewFormattedValue($item);
}
} catch (\Exception $e) {
$element[$delta] = $this
->viewPlainValue($item);
}
}
return $element;
}
protected function viewPlainValue(FieldItemInterface $item) {
return [
'#type' => 'inline_template',
'#template' => '{{ value }}',
'#context' => [
'value' => $item->value,
],
];
}
protected function viewFormattedValue(FieldItemInterface $item) {
return [
'#type' => 'inline_template',
'#template' => '{{ value }}',
'#context' => [
'value' => $this
->getFormattedValue($item),
],
];
}
protected function viewLinkValue(FieldItemInterface $item) {
$element = [
'#type' => 'link',
'#title' => $this
->getFormattedValue($item),
'#url' => Url::fromUri($this->formatter
->format($item->value, PhoneNumberFormat::RFC3966, $this
->getSetting('default_country'))),
'#options' => [
'external' => TRUE,
],
];
if (!empty($item->_attributes)) {
$element['#options'] += [
'attributes' => [],
];
$element['#options']['attributes'] += $item->_attributes;
unset($item->_attributes);
}
return $element;
}
protected function getFormattedValue(FieldItemInterface $item) {
return $this->formatter
->format($item->value, $this
->getSetting('format'), $this
->getSetting('default_country'));
}
public static function availableFormats() {
return [
PhoneNumberFormat::INTERNATIONAL => t('International'),
PhoneNumberFormat::E164 => t('E164'),
PhoneNumberFormat::NATIONAL => t('National'),
PhoneNumberFormat::RFC3966 => t('RFC3966'),
];
}
}