Рейтинг:0

Модуль Linkit — указание атрибута заголовка ссылки на настраиваемое поле. Крюк в наличии?

флаг us

В настоящее время Линкит модуль доставляет ссылку заглавие атрибут, потянув связанный узел заглавие поле.

Мы хотели бы, чтобы он указывал на другое поле в узле.

Как мы можем этого добиться?

я заглянул в Модуль расширенных ссылок редактора, но мне нужно, чтобы это было автоматически, а мое настраиваемое поле менялось в зависимости от типа содержимого.

Может у кого есть идея с крючком?

Рейтинг:3
флаг cn

Есть (как минимум) 2 варианта:

  1. Напишите собственный плагин фильтра, основываясь на LinkitФильтр плагин, включенный в модуль Linkit. в процесс() метод, где заголовок в настоящее время установлен, введите собственную логику для установки поля заголовка вместо существующего $сущность->метка().

    Преимущество этого метода заключается в автоматическом обновлении при изменении заголовка ссылочного узла, но это означает, что вам придется поддерживать свой фильтр вместе с выпусками модуля Linkit. процесс() метод делает гораздо больше, чем просто устанавливает заголовок, и новые функции/исправления ошибок в модуле необходимо будет включить в ваш код.

  2. Измените диалоговую форму ссылки (как это делает Расширенная ссылка редактора) и добавьте заголовок в разметку, пока он еще находится в редакторе. Этот метод немного проще и требует меньше обслуживания, но заглавие Атрибут не будет обновляться вместе с заголовком узла. Он будет обновляться только при повторном сохранении диалоговой формы ссылки.

    Если это приемлемо, это грубый, но рабочий пример для начала:

    используйте Drupal\Core\Form\FormStateInterface;
    используйте Drupal\node\NodeInterface;
    
    функция custom_module_form_editor_link_dialog_alter(&$form, FormStateInterface $form_state, $form_id) {
      array_unshift($form['#validate'], '_custom_module_link_dialog_validate');
    }
    
    функция _custom_module_link_dialog_validate (массив и $ форма, FormStateInterface $ form_state) {
      $attributes = $form_state->getValue('атрибуты');
    
      if (isset($attributes['тип-объекта-данных']) && $attributes['тип-объекта-данных'] == 'узел') {
        $node = \Drupal::service('entity.repository')
          ->loadEntityByUuid('узел', $attributes['data-entity-uuid']);
        если ($ узел экземпляр NodeInterface) {
          $override_title = '';
          переключатель ($node->getType()) {
            случай 'страница':
              $override_title = $node->field_title_override->значение;
              сломать;
            случай 'фу':
              // ...
              сломать;
          }
          если (strlen($override_title)) {
            $form_state->setValue(['атрибуты', 'заголовок'], $override_title);
          }
        }
      }
    }
    
флаг us
Спасибо за это!
флаг us
Спасибо за это! И за редактирование моего вопроса, чтобы сделать его более понятным. Нам нужно, чтобы это применялось только на переднем конце. И не для всех типов контента это поле будет доступно. Есть ли в модуле Linkit ловушка, позволяющая фильтру проверять, существует ли и заполнено ли в узле определенное поле, и заменять его на лету во внешнем интерфейсе?
флаг cn
Нет, к сожалению, на данный момент он жестко запрограммирован в середине метода процесса. Вам нужно будет воспроизвести весь фильтр для этого подхода.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.