Я получил два модуля.
Макет установлен в модуле приложения, в макете есть определенные элементы навигации модуля, которые мне нужно отобразить, вот что я пытаюсь сделать.
Это частичное, я звоню в расположение / расположение модуля приложения.
//file: module/Application/view/layout/container/layout.phtml
<?php echo $this->partial('toolbar'); ?>
Это мое toolbar.phtml
//file: module/Application/view/layout/chunks/toolbar.phtml
<div class="new-top-menu">
<div class="navbar-header">
<a class="navbar-brand sidebar-toggle-box" href="#">
<div class="sidebar-left-trigger">
<span class="fa fa-align-right"></span>
</div>
</a>
</div>
<ul class="nav navbar-nav">
<?php echo $this->placeholder('notification/top-menu'); ?>
</ul>
<ul class="nav navbar-nav navbar-right">
<?php echo $this->placeholder('toolbar/search'); ?>
<?php echo $this->placeholder('toolbar/right-position1')->set($this->position1); ?>
<?php echo $this->placeholder('toolbar/right-position2')->set($this->position2); ?>
<?php echo $this->placeholder('toolbar/right-position3')->set($this->position3); ?>
</ul>
</div>
В основном я хочу прочитать еще один частичный с именем toolbar/user-menu.phtml
из пользовательского модуля и установите его в качестве содержимого этого заполнителя $this->placeholder('toolbar/right-position3');
Я попытался сделать это в Module.php модуля пользователя.
namespace User;
public function onBootstrap(MvcEvent $e)
{
$viewModel = $e->getViewModel();
$viewModel->setVariable('position1', 'test string');
}
Это работает абсолютно нормально, проблема в том, что я хочу заменить «тестовую строку» контента частичным, который находится в file: module/User/view/toolbar/user-menu.phtml
Любые указания на то, как это можно сделать в ZF2, приветствуются.
Благодарю.
Я смог сделать это, используя следующий код, и я с нетерпением жду, если это можно будет улучшить, во всяком случае.
В User / Module.php я обновил со следующим.
use Zend\View\Renderer\PhpRenderer;
use Zend\View\Resolver;
public function onBootstrap(MvcEvent $event)
{
$application = $event->getApplication();
$eventManager = $application->getEventManager();
$serviceManager = $application->getServiceManager();
//create a Template Stack
$stack = new Resolver\TemplatePathStack(array('script_paths' => array(__DIR__ . '/view/user/toolbar')));
//create a Resolver
$resolver = new Resolver\AggregateResolver();
$resolver->attach($stack);
//create a Renderer
$renderer = new PhpRenderer();
$renderer->setResolver($resolver);
$viewHelperManager = $serviceManager->get('ViewHelperManager');
$urlViewHelper = $viewHelperManager->get('url');
$partial = $renderer->partial('user-menu', array(
'signOutUrl' => $urlViewHelper('user-account-sign-out')
));
$viewModel = $event->getViewModel();
$viewModel->setVariable('position1', $partial);
}
Вот и все, теперь я могу поместить содержимое HTML в заполнитель, единственная проблема, с которой я сейчас сталкиваюсь, — это доступ к помощнику вида в файле user-menu.phtml, в настоящее время я генерирую его в Module.php и передаю его просмотр файла.
Я думаю, что вы на правильном пути, потому что вы начинаете смотреть на нативные помощники вида, но вы не должны манипулировать ими непосредственно в модуле, и вы не должны пытаться изменить состав панели инструментов в ваших скриптах вида.
Вместо этого создайте свой собственный помощник вида панели инструментов, внедрите зависимости через фабрику (включая частичный шаблон), и тогда вы можете просто echo $this->toolbar()
в вашем сценарии просмотра макета.
Кроме того, вы можете взглянуть на Spiffy Navigation, если не сказать больше, просто на то, как реализован помощник вида. https://github.com/spiffyjr/spiffy-navigation
Других решений пока нет …