Как установить содержимое определенного типа содержимого, недоступного в ссылке uri Автозаполнение выбрать виджет в Drupal 8?

Если вы хотите добавить ссылку на меню в 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']]]);
}
}

0

Решение

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

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

/**
* 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,
]);
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]