Как настроить содержимое определенного типа содержимого, недоступного в ссылке на автозаполнение виджета выбора в Drupal 8? - PullRequest
0 голосов
/ 06 июня 2018

Если вы хотите добавить ссылку на меню в Drupal 8, вы можете ввести Menu link title и выбрать один из вариантов из списка автозаполнения для виджета поля Link.

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

Как настроить все содержимое типа содержимого Banner и Basic page, недоступное вавтозаполнение выбора поля виджета?Я хочу показать содержимое (проверена публикация) только для типа содержимого Article.

Ниже приведены попытки, как я пробовал один за другим, но это не работает.

function my_module_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
    if ($entity_type->id() == 'menu_link_content' && !empty($fields['link'])) {
       // Attempt 1
       $fields['link']->setTargetBundle('article');
       // Attempt 2
       $fields['link']->setSetting('handler_settings', ['target_bundles' => ['article' => 'article']]);
       // Attempt 3
       $fields['link']->setSetting('selection_settings', ['target_bundles' => ['article' => 'article']]);
       // Attempt 4
       $fields['link']->setSettings(['selection_settings' => ['target_bundles' => ['article' => 'article']]]);
       // Attempt 5
       $fields['link']->setSettings(['handler_settings' => ['target_bundles' => ['article' => 'article']]]);
    }
}

1 Ответ

0 голосов
/ 07 июня 2018

Я пришел к следующему решению, но не уверен, что это эффективный способ приблизиться к нему.

Создать пользовательский виджет поля ссылки.

/**
 * Some class description.
 *
 * @FieldWidget(
 *   id = "my_custom_link_widget",
 *   label = @Translation("My custom link widget"),
 *   field_types = {
 *     "link"
 *   }
 * )
*/
class MyCustomLinkWidget extends LinkWidget {

  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);
    $content_types = [
      'banner',
      'basic_page',
    ];
    $node_types = \Drupal::entityQuery('node_type')
      ->condition('type', $content_types, 'NOT IN')
      ->execute();
    $element['uri']['#selection_settings']['target_bundles'] = $node_types;

    return $element;
  }

}

Хук реализацииустановить виджет моей пользовательской ссылки в поле ввода ссылки.

function my_module_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'menu_link_content' && !empty($fields['link'])) {
    $fields['link']->setDisplayOptions('form', [
      'type' => 'my_custom_link_widget',
      'weight' => -2,
    ]);
  }
}
...