メインメニューにプログラムで画像フィールドを追加して、megaMenuを作成します。
/**
* Implements hook_entity_base_field_info().
*/
function hook_entity_base_field_info(EntityTypeInterface $entity_type) {
$fields = [];
if ($entity_type->id() == 'menu_link_content') {
$year = date('Y');
$month = date('m');
$fields['image'] = BaseFieldDefinition::create('image')
->setLabel(t('Image'))
->setDescription(t('Image field'))
->setSettings([
'file_directory' => 'imagesMenu'. '/' . $year . '/' . $month,
'alt_field_required' => FALSE,
'file_extensions' => 'png jpg jpeg',
])
->setDisplayOptions('view', array(
'label' => 'hidden',
'type' => 'default',
'weight' => 0,
))
->setDisplayOptions('form', array(
'label' => 'hidden',
'type' => 'image_image',
'weight' => 0,
))
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
}
return $fields;
}
Drush更新エンティティの後、フォーム上のフィールドを確認し、画像を追加できます。
今、私はこのフィールドを小枝に入れようとします。
キーでキントを使用すると、これは結果です:
menu--main.html.twig
フィールド画像が表示されません。
どのようにすれば私のフィールドをtempalteで取得できますか?メニューのhook_preprocess?
これは、カスタムイメージフィールドをメニューから小枝に取得する方法です。
function hook_preprocess_menu(&$variables, $hook) {
if($variables['theme_hook_original'] == 'menu__main'){
$items = $variables['items'];
foreach ($items as $key => $item) {
if(count($item['below'])>0)
{
foreach($item['below'] as $id=>$array)
{
$entity = \Drupal::entityTypeManager()->getStorage('menu_link_content')->loadByProperties(array('uuid'=>$array['original_link']->getDerivativeId()));
foreach($entity as $idMenu)
{
if($idMenu->get('image')->entity != null) {
$image = file_create_url($idMenu->get('image')->entity->getFileUri());
$items[$key]['below'][$id]['imageUrl'] = $image;
}
}
}
}
}
$variables['items']=$items;
}
}
アイテムメニューを操作して、 'imageUrl'を配列に追加します。最初に、メニュー項目フィールドにアクセスするためのUUIDを含むプロパティでエンティティを読み込みます。
このメソッドは私のサブメニュー専用です(私のメガメニュー内で、サブメニューの項目ごとに画像を追加したいだけです)
countをチェックする理由(item ['below']> 0)
今のところ、私はより良い方法を見つけることができません。