Если вы хотите добавить ссылку на меню в 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']]]);
}
}
Я предложил следующее решение, но я не уверен, что это эффективный способ подойти к нему.
Создайте пользовательский виджет поля ссылки.
/**
* 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,
]);
}
}
Других решений пока нет …