View source
<?php
namespace Drupal\address_display\Plugin\Field\FieldFormatter;
use Drupal\address\LabelHelper;
use Drupal\address\Plugin\Field\FieldFormatter\AddressPlainFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
class AddressDisplayFormatter extends AddressPlainFormatter {
public static function defaultSettings() {
$settings = [
'address_display' => [
'organization' => [
'display' => TRUE,
'glue' => '',
'weight' => -1,
],
'address_line1' => [
'display' => TRUE,
'glue' => '',
'weight' => 0,
],
'address_line2' => [
'display' => TRUE,
'glue' => ',',
'weight' => 1,
],
'locality' => [
'display' => TRUE,
'glue' => ',',
'weight' => 2,
],
'postal_code' => [
'display' => TRUE,
'glue' => '',
'weight' => 3,
],
'country_code' => [
'display' => TRUE,
'glue' => '',
'weight' => 4,
],
'langcode' => [
'display' => FALSE,
'glue' => ',',
'weight' => 100,
],
'administrative_area' => [
'display' => FALSE,
'glue' => ',',
'weight' => 100,
],
'dependent_locality' => [
'display' => FALSE,
'glue' => ',',
'weight' => 100,
],
'sorting_code' => [
'display' => FALSE,
'glue' => ',',
'weight' => 100,
],
'given_name' => [
'display' => TRUE,
'glue' => '',
'weight' => 100,
],
'family_name' => [
'display' => TRUE,
'glue' => ',',
'weight' => 100,
],
],
];
return $settings + parent::defaultSettings();
}
private function getLabels() {
$values = LabelHelper::getGenericFieldLabels();
return [
'given_name' => $values['givenName'],
'additional_name' => $values['additionalName'],
'family_name' => $values['familyName'],
'organization' => $values['organization'],
'address_line1' => $values['addressLine1'],
'address_line2' => $values['addressLine2'],
'postal_code' => $values['postalCode'],
'sorting_code' => $values['sortingCode'],
'administrative_area' => $values['administrativeArea'],
'locality' => $values['locality'],
'dependent_locality' => $values['dependentLocality'],
'country_code' => $this
->t('Country code'),
'langcode' => $this
->t('Langcode'),
];
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$form = parent::settingsForm($form, $form_state);
$labels = $this
->getLabels();
$group_class = 'group-order-weight';
$items = $this
->getSetting('address_display');
$form['address_display'] = [
'#type' => 'table',
'#caption' => $this
->t('Address display'),
'#header' => [
$this
->t('Label'),
$this
->t('Display'),
$this
->t('Glue'),
$this
->t('Weight'),
],
'#empty' => $this
->t('No items.'),
'#tableselect' => FALSE,
'#tabledrag' => [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => $group_class,
],
],
];
foreach ($items as $key => $value) {
$form['address_display'][$key]['#attributes']['class'][] = 'draggable';
$form['address_display'][$key]['#weight'] = $value['weight'];
$form['address_display'][$key]['label'] = [
'#plain_text' => $labels[$key],
];
$form['address_display'][$key]['display'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Display'),
'#default_value' => $value['display'],
];
$form['address_display'][$key]['glue'] = [
'#type' => 'textfield',
'#title' => $this
->t('Glue'),
'#default_value' => $value['glue'],
];
$form['address_display'][$key]['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight for @title', [
'@title' => $key,
]),
'#title_display' => 'invisible',
'#default_value' => $value['weight'],
'#attributes' => [
'class' => [
$group_class,
],
],
];
}
return $form;
}
public function settingsSummary() {
$config = $this
->getSetting('address_display');
$labels = $this
->getLabels();
$summary = [];
$display = [];
foreach ($config as $key => $config_item) {
if ($config_item['display']) {
$display[] = $labels[$key];
}
}
if (!empty($display)) {
$summary[] = $this
->t('Display: @elements', [
'@elements' => implode(', ', $display),
]);
}
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
foreach ($items as $delta => $item) {
$children = $this
->prepareAddressDisplay($item
->toArray());
if (empty($children)) {
continue;
}
$elements[$delta] = [
'#type' => 'container',
'#children' => $children,
];
}
return $elements;
}
private function prepareAddressDisplay(array $item) {
$config = $this
->getSetting('address_display');
$countries = $this->countryRepository
->getList();
$elements = [];
foreach ($config as $key => $config_item) {
if (!$config_item['display'] || empty($item[$key])) {
unset($config[$key]);
}
}
if (empty($config)) {
return [];
}
$last_key = array_keys($config)[count($config) - 1];
foreach ($config as $key => $config_item) {
if ($key == 'country_code') {
$item[$key] = $countries[$item[$key]];
}
if ($key == $last_key) {
$config_item['glue'] = '';
}
$elements[$key] = [
'#type' => 'html_tag',
'#tag' => 'span',
'#attributes' => [
'class' => [
'address-display-element',
str_replace('_', '-', $key) . '-element',
],
],
'#value' => $item[$key] . $config_item['glue'],
];
}
return $elements;
}
}