В моем личном проекте я использую:
v7.1.6
v3.3.6
dev-master / 2.2.x-dev
[ссылка 1], [ссылка 2], [ссылка 3] для того, чтобы управлять меню.v3.3.7
Для настройки я использовал документацию в [2], [3] и примеры кода [4]. Мое меню работает, интеграция между Bootstrap
а также KnpMenuBundle
тоже работает.
Пакет меню работает нормально, просто переводные работы и интеграционные работы тоже.
мой ProfileMenu
Пример кода:
public function profileMenu(array $options)
{
$menu = $this->factory->createItem('root');
$menu->setChildrenAttribute('class', 'nav navbar-nav navbar-right');
$menu->addChild('Profile', array('label' => 'menu.profile'))
->setExtras(array('dropdown' => true, 'icon' => 'fa fa-user'))
->setLinkAttribute('class', "dropdown-toggle")
->setLinkAttribute('data-toggle', "dropdown")
->setExtra('translation_domain', 'menu');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Logged in as', array('label' => 'layout.logged_in_as'))
->setExtra('divider_append', true)
->setExtra('translation_domain', 'FOSUserBundle');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('My data', array('label' => 'menu.profile.myData', 'route' => 'fos_user_profile_show'))
->setExtra('translation_domain', 'menu');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Edit data', array('label' => 'menu.profile.editMyData', 'route' => 'fos_user_profile_edit'))
->setExtra('translation_domain', 'menu');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Change password', array('label' => 'menu.profile.changePassword', 'route' => 'fos_user_change_password'))
->setExtra('translation_domain', 'menu');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Exit', array('label' => 'menu.profile.logout', 'route' => 'fos_user_security_logout'))
->setExtra('divider_prepend', true)
->setExtra('translation_domain', 'menu');
return $menu;
}
рендеринг меню показан на следующем изображении
Как я могу передать параметры перевода (а именно %username%
) в меню (питание от KnpMenuBundle) и заставить его отображать как задумано?
Как можно привести аргументы:
|trans({'%username%': app.user.username}
в MenuBuilder
?
Блок кода в вопросе
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Logged in as', array('label' => 'layout.logged_in_as'))
->setExtra('divider_append', true)
->setExtra('translation_domain', 'FOSUserBundle');
а именно label
строка
Переводя строки с параметрами обычно, можно привести аргументы, например, так:
<li><a href="#">{{ 'layout.logged_in_as'|trans({'%username%': app.user.username}, 'FOSUserBundle') }}</a></li>
Тем не менее, я не могу понять, как пройти их в случае использования KnpMenuBundle
а также Bootstrap
интеграция.
Пожалуйста, порекомендуйте.
Спасибо за ваше время и знания.
Вы можете объявить свой MenuBuilder как сервис как этот
#services.yml
app.menu_builder:
class: AppBundle\Menu\MenuBuilder
arguments:
- @knp_menu.factory
- @security.token_storage
- @translator.default
Обновить MenuBuilder
конструктор по зависимостям от приведенного выше определения
Благодаря этому у вас есть доступ ко всем вещам, которые вам необходимы для выполнения традукции
$user = $this->tokenStorage->getToken()->getUser(); // If you are under a path protect by security.yml access_constrol
$yourLoggedInTraduction = $this->translator->trans(
'layout.logged_in_as', [
'%username%' => $user->getUsername()
],
'FOSUserBundle',
'yourlocale'
);
dump($yourLoggedInTraduction);
Вы должны иметь свою тягу, а затем сопоставить ее с вашим profileMenu(...)
функциональная логика
Я не использую ту же версию symfony / knpMenu, чем вы, поэтому, возможно, этот код не будет работать напрямую, но вам просто нужно адаптироваться к вашим потребностям
Задайте вопрос, если хотите, если неясно
Я надеюсь, что помог вам, если да, пожалуйста, отметьте этот пост как решенный! 🙂
Просто переведите метку, переданную addChild
:
$label = $this->translator->trans('layout.logged_in_as', ['%user%' => $username ]);
$menu->addChild('Logged in as', array('label' => $label);
$this->translator
это \Symfony\Component\Translation\TranslatorInterface
который вводится в сервис, создающий меню. Я получил это мимоходом "@translator"
в качестве аргумента для конструктора в services.yml
,
Для полноты картины я также отмечу, что у каждого дочернего меню должно быть свое имя. Поэтому, если вы хотите создать несколько меню с разными параметрами, убедитесь, что вы не копируете / вставляете первую строку, не изменяя также имя меню.
Или используйте что-то вроде этого:
$idx = 0;
$menu->addChild("Language_".$idx++, array('label' => $label_lang1);
$menu->addChild("Language_".$idx++, array('label' => $label_lang2);
Или, если все дочерние меню создаются в одном файле:
$menu->addChild("Language_".__LINE__, array('label' => $label_lang1);
$menu->addChild("Language_".__LINE__, array('label' => $label_lang2);
Если вы не используете разные имена, отображается только последнее меню.
При использовании вышеуказанного решения панель инструментов Symfony и журнал сообщают о предупреждениях о пропущенных сообщениях. Это связано с тем, что указанная метка не может быть найдена в домене перевода (в messages.yml
или что вы используете для своих переводов).
Чтобы избежать ложных срабатываний, добавьте следующую строку после addChild
вызов:
$menu->addChild('Logged in as', array('label' => $label)
->setExtra('translation_domain', false);