web-dev-qa-db-ja.com

プログラムでメニューフィールドをテンプレートに取り込む方法は?

メインメニューにプログラムで画像フィールドを追加して、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

enter image description here

フィールド画像が表示されません。

どのようにすれば私のフィールドをtempalteで取得できますか?メニューのhook_preprocess?

3
Kevin

これは、カスタムイメージフィールドをメニューから小枝に取得する方法です。

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)

enter image description here

今のところ、私はより良い方法を見つけることができません。

5
Kevin