Как с помощью MvcEvent получить __NAMESPACE__ / ModuleName в Layout

Для примера создадим модуль с именем ZfCommons, который будет инициализировать переменную в Layout содержащую namespace модуля…

Для начала зарегистрируем наш модуль в application.config.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
return array(
    'modules' => array(
        'Application',
        'ZfCommons',
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);

И создадим функцию в Module.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace ZfCommons;
 
use Zend\ModuleManager\Feature\AutoloaderProviderInterface,
    Zend\ModuleManager\Feature\ConfigProviderInterface,
    Zend\Mvc\MvcEvent;
 
class Module implements
    AutoloaderProviderInterface,
    ConfigProviderInterface
{
 
    public function onBootstrap($e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
    }
 
    public function loadConfiguration(MvcEvent $e)
    {
        $controller = $e->getTarget();
        $controllerClass = get_class($controller);
        $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\'));
 
        //set '
variable' into layout...
        $controller->layout()->modulenamespace = $moduleNamespace;
    }
 
    public function getAutoloaderConfig(){ /* common code */ }
    public function getConfig(){/* common code */}
}

В Layout можете вызвать:

1
Current Module Namespace is <?php echo $this->modulenamespace; ?>

Как получить эту переменную в view:

1
Current Module Namespace is <?php echo $this->layout()->modulenamespace; ?>

Также можно установить эту переменную следующим образом:

1
$e->getViewModel()->setVariable('modulenamespace', $moduleNamespace);

Ссылка на оригинал

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *