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

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

Для начала зарегистрируем наш модуль в application.config.php:
[cc lang=»php»]
return array(
‘modules’ => array(
‘Application’,
‘ZfCommons’,
),
‘module_listener_options’ => array(
‘config_glob_paths’ => array(
‘config/autoload/{,*.}{global,local}.php’,
),
‘module_paths’ => array(
‘./module’,
‘./vendor’,
),
),
);
[/cc]

И создадим функцию в Module.php:
[cc lang=»php»]
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 */}
}
[/cc]

В Layout можете вызвать:
[cc lang=»php»]
Current Module Namespace is < ?php echo $this->modulenamespace; ?>
[/cc]

Как получить эту переменную в view:
[cc lang=»php»]
Current Module Namespace is < ?php echo $this->layout()->modulenamespace; ?>
[/cc]

Также можно установить эту переменную следующим образом:
[cc lang=»php»]
$e->getViewModel()->setVariable(‘modulenamespace’, $moduleNamespace);
[/cc]

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

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

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