Переназначить шаблон в произвольном пути к каталогу - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь обновить шаблон модели представления до шаблона в пользовательской структуре.

Сначала я слил следующее view_manager config в service manager config с этим кодом:

$config = ArrayUtils::merge($config,$selConf);
$this->serviceManager->setAllowOverride(true);
$this->serviceManager->setService('Config',$config);
$this->serviceManager->setAllowOverride(false);

Это то, что было объединено, с запросом publicweb в качестве модуля, index в качестве контроллера и index в качестве действия:

 array (size=1)
  'view_manager' => 
    array (size=2)
      'template_map' => 
    array (size=1)
      'publicweb/index/index' => string '/srv/app/client/design/gopher/publicweb/index/index/template.phtml' (length=95)
      'template_path_stack' => 
    array (size=1)
      0 => string '/srv/app/client/design/gopher' (length=58)

Наконец, я выполнил этокод:

$view = $e->getViewModel();
$view->setTemplate('publicweb/index/index');

И результаты не верны.

Я также пытался:

$view = $e->getViewModel();
$view->setTemplate('publicweb/index/index/template');

И результаты не верны, выбрасывая исключение Unable to render template

Я поместил стек шаблонных путей /srv/app/client/design/gopher в начало template_stack_path array, чтобы он мог сначала найти его, и он все еще работает неправильно.

Не уверен, чтопродолжается.Также следует отметить, что это выполняется как событие с:

$events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
        MvcEvent::EVENT_DISPATCH,[$this,'assignTemplates'],500);

из Application Module

Следует отметить, что я также добавляю файлы JS и CSS из помощника вида вСредство визуализации в viewhelperpluginmanager из этого события:

 $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
        MvcEvent::EVENT_DISPATCH,[$this,'hydrateJsAssets'],500);

И также id необходимо убедиться, что я также могу использовать пользовательский макет из этого каталога.

ОБНОВЛЕНИЕ

Мне удалось заставить его работать:

    public function onMergeConfig(ModuleEvent $event){
        parent::onMergeConfig($event);  
        $configListener = $event->getConfigListener();
        $sm = $event->getParam('ServiceManager');
        $config = $configListener->getMergedConfig(false);
        $selConf = [
            'view_manager' => [
                'template_map'=>[
                    'publicweb/index/index' => '/srv/app/client/design/gopher/publicweb/index/index/template.phtml',
                ]
            ]
        ];
        $config = ArrayUtils::merge($config,$selConf);
        $configListener->setMergedConfig($config);
        $event->setConfigListener($configListener);
        $sm->setAllowOverride(true);
        $sm->setService('Config',$config);
        $sm->setAllowOverride(false);
    }

Через

 public function init(ModuleManager $moduleManager) {
    $events = $moduleManager->getEventManager();
    $events->attach(ModuleEvent::EVENT_MERGE_CONFIG,[$this,'onMergeConfig']);        
}

Но проблема в том, что это жестко закодировано, и у меня нет доступа к запросу, поэтому я не могуполучить модуль, контроллер, действие

1 Ответ

0 голосов
/ 15 октября 2018

Ваше обновленное решение не требуется, вы можете предоставить конфигурацию из модуля с помощью функции провайдера конфигурации, оно будет подхвачено менеджером модулей и объединено при событии слияния конфигурации:

namespace Foo;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Mvc\MvcEvent;

class Module
{
    public function getConfig()
    {
        return [
            'view_manager' => [
                'template_map' => [
                    // change to application root relative paths
                    'publicweb/index/index' => '/srv/app/client/design/gopher/publicweb/index/index/template.phtml',
                ],
            ],
        ];
    }

    /**
     * Register layout listener
     */
    public function onBootstrap(MvcEvent $e)
    {
        $e->getApplication()
            ->getEventManager()
            ->getSharedManager()
            ->attach(AbstractActionController::class, 'dispatch', function($e) {
                $controller = $e->getTarget();
                $controllerClass = get_class($controller);
                $config = $e->getApplication()
                    ->getServiceManager()
                    ->get('config');
                // do your logic here, you have controller class and config
                if ($logic) {
                    $controller->layout($layout);
                }
            }, 100);
    }
}

Niceстатья об изменении макетов, также относится к zf3 https://www.masterzendframework.com/views/change-layout-controllers-actions-zend-framework-2/

...