View source
<?php
namespace Drupal\cshs\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
class CshsGroupByRootFormatter extends CshsFormatterBase {
public const SORT_NONE = 'none';
public const SORT_DESC = 'desc';
public const SORT_ASC = 'asc';
protected const SORT_OPTIONS = [
self::SORT_NONE => 'None',
self::SORT_DESC => 'Descending',
self::SORT_ASC => 'Ascending',
];
protected const SORT_FUNCTIONS = [
self::SORT_DESC => '\\krsort',
self::SORT_ASC => '\\ksort',
];
public static function defaultSettings() : array {
$settings = parent::defaultSettings();
$settings['sort'] = static::SORT_NONE;
$settings['depth'] = 0;
return $settings;
}
public function settingsForm(array $form, FormStateInterface $form_state) : array {
$element = parent::settingsForm($form, $form_state);
$element['sort'] = [
'#type' => 'select',
'#title' => $this
->t('Sorting'),
'#options' => \array_map([
$this,
't',
], static::SORT_OPTIONS),
'#default_value' => $this
->getSetting('sort'),
];
$element['depth'] = [
'#type' => 'number',
'#min' => 0,
'#title' => $this
->t('Depth'),
'#description' => $this
->t('The maximum hierarchy depth. Use 0 to not limit or 1 to display just the root term (or the last if reverse order selected).'),
'#default_value' => $this
->getSetting('depth'),
];
return $element;
}
public function settingsSummary() : array {
$summary = parent::settingsSummary();
$summary[] = $this
->t('Sorting: @value', [
'@value' => static::SORT_OPTIONS[$this
->getSetting('sort')],
]);
$summary[] = $this
->t('Depth: @value', [
'@value' => $this
->getSetting('depth') ?: $this
->t('Unlimited'),
]);
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) : array {
$depth = $this
->getSetting('depth');
$linked = $this
->getSetting('linked');
$reverse = $this
->getSetting('reverse');
$elements = [];
foreach ($this
->getEntitiesToView($items, $langcode) as $term) {
$tree = $this
->getTermParents($term, !$reverse);
if ($depth > 0) {
$tree = \array_slice($tree, 0, $depth, TRUE);
}
$labels = $this
->getTermsLabels($tree, $linked);
$root = \array_shift($tree);
$root_id = $root
->id();
$root_label = \array_shift($labels);
if (!isset($elements[$root_id])) {
$elements[$root_id] = [
'#theme' => 'cshs_term_group',
'#id' => $root_id,
'#title' => $root_label,
'#terms' => [],
];
}
foreach ($labels as $i => $label) {
$unique_key = (string) $tree[$i]
->label();
if (!isset($elements[$root_id]['#terms'][$unique_key])) {
$elements[$root_id]['#terms'][$unique_key] = [
'id' => $tree[$i]
->id(),
'label' => $label,
'parent' => $tree[$i]->parent->target_id,
];
}
}
}
if ($sort_function = static::SORT_FUNCTIONS[$this
->getSetting('sort')] ?? NULL) {
foreach ($elements as $root_id => $element) {
$sort_function($elements[$root_id]['#terms']);
}
}
return $elements;
}
}