Same name and namespace in other branches
  1. 1.1.x src/Plugin/Field/FieldFormatter/EntityReferenceFilteredLinkFormatter.php \Drupal\entity_ref_filtering_link\Plugin\Field\FieldFormatter\EntityReferenceFilteredLinkFormatter::viewElements() 1 comment

File

src/Plugin/Field/FieldFormatter/EntityReferenceFilteredLinkFormatter.php, line 135

Class

EntityReferenceFilteredLinkFormatter
Plugin implementation of the 'entity_reference_filtered_link' formatter.

Namespace

Drupal\entity_ref_filtering_link\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [];
    $view_url = $this->getSetting('view_url');
    $skip_access = $this->getSetting('skip_access_check');
    $mode = $this->getSetting('mode');
    $argument = $this->getSetting('argument');
    $disable = $this->getSetting('disable');
    $disable = !empty($disable) ? explode(",", $disable) : [];
    foreach ($this->getEntitiesToView($items, $langcode) as $delta => $entity) {
        $label = $entity->label();
        if (in_array($label, $disable)) {
            $elements[$delta] = [
                '#plain_text' => $label,
            ];
            continue;
        }
        if ($id = $entity->id()) {
            if ($skip_access) {
                $url = $this->pathValidator
                    ->getUrlIfValidWithoutAccessCheck($view_url);
            }
            else {
                $url = $this->pathValidator
                    ->getUrlIfValid($view_url);
            }
            if (!$url) {
                $elements[$delta] = [
                    '#plain_text' => $label,
                ];
                continue;
            }
            $options = $url->getOptions();
            switch ($mode) {
                case 'id':
                    $options['query'][$argument] = $id;
                    break;
                case 'id_multiple':
                    $options['query']["{$argument}[]"] = $id;
                    break;
                case 'id_multiple_d9':
                    $options['query']["{$argument}[{$id}]"] = $id;
                    break;
                case 'autocomplete':
                    $options['query'][$argument] = "{$entity->label()} ({$id})";
                    break;
                case 'facet':
                    $options['query']['f[0]'] = "{$argument}:{$id}";
                    break;
                case 'label':
                    $options['query']['f[0]'] = "{$argument}:{$entity->label()}";
                    break;
                case 'label_no_facet':
                    $options['query'][$argument] = $entity->label();
                    break;
            }
            $url->setOptions($options);
            $elements[$delta] = [
                '#type' => 'link',
                '#title' => $label,
                '#url' => $url,
                '#options' => $options,
            ];
            if (!empty($items[$delta]->_attributes)) {
                $elements[$delta]['#options'] += [
                    'attributes' => [],
                ];
                $elements[$delta]['#options']['attributes'] += $items[$delta]->_attributes;
                // Unset field item attributes since they have been included in the
                // formatter output and shouldn't be rendered in the field template.
                unset($items[$delta]->_attributes);
            }
        }
        else {
            $elements[$delta] = [
                '#plain_text' => $label,
            ];
        }
        $elements[$delta]['#cache']['tags'] = $entity->getCacheTags();
    }
    return $elements;
}