Подтвердить что ты не робот

Как передать переменные в layout.phtml глобально в ZF2?

Я хочу передать ряд переменных в мой layout.phtml по всему приложению (глобально). И я имею в виду, что я не хочу использовать

$this->layout()->someVar = someValue;

в каждом действии, которое у меня есть, так как это будет много дополнительной работы и кода. Так есть ли способ сделать это только в одном месте? Или то, что я упомянул, это все, что у меня есть! Надеюсь, нет:)

Может быть, сеансы? - Реми Томас

Спасибо за решение. Пока что то, что я использую. Для зарегистрированных пользователей, параметров системы и макета и списка ACL. Но проблема в том, что я должен определить новый объект в layout.phtml, который, как я считаю, не подходит, не так ли? Я где-то читал, что любые данные, которые нам нужны для использования в моделях, должны быть переданы ему с использованием действий контроллера. И особенно я не поклонник резки углов, поэтому, если есть чистый способ сделать это, я бы предпочел не делать этого таким образом. И недавно я должен получить количество непрочитанных сообщений для каждого пользователя и использовать его в layout.phtml. Поэтому, если я делаю это в layout.phtml, это LOT php script внутри модели представления или макета.

Спасибо

4b9b3361

Ответ 1

Лучший и самый чистый способ - использовать ViewHelper, как предлагает Орочи. Вот несколько инструкций по созданию собственного ViewHelper: http://framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html. Это не слишком сложно;)

Однако ваша проблема может быть решена и по-другому. Предположим, что требуемые переменные содержат значения, предоставляемые службами, уже присутствующими в вашем приложении (и затем открытыми ZF2 ServiceManager), вы можете добавить некоторые строки в функцию onBoostrap внутри вашего модуля Module.php(например, в модуле Application).

Вот пример:

public function onBootstrap($e) {

    $serviceManager = $e->getApplication()->getServiceManager();
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel();

    $myService = $serviceManager->get('MyModule\Service\MyService');

    $viewModel->someVar = $myService->getSomeValue();

}

Таким образом вы пишете задание только в одном месте. Затем переменная доступна как обычно:

$this->layout()->someVar;

Ответ 2

Это именно то, что вы хотите...

// Do this inside your Controller before you return your ViewModel
$this->layout()->setVariable('stack', 'overflow');

// Then inside your layout.phtml
echo $this->stack;

Нет помощников просмотра, нет диспетчера событий, нет диспетчера служб или другого метода манипуляции с классом. Почему люди в Stack иногда заставляют вещи так затмевать?

Ответ 3

Создайте свой собственный ViewHelper для этого.

EDIT:

Как я это делаю: внутри вашей папки src модуля я создаю новую папку "Просмотр", а затем в этой папке "Вид" создаю еще одну папку под названием "Помощник". В этой папке я создаю свои вспомогательные классы. Так, например, я создаю файл Navigation.php. В этом файле я создаю класс под названием Navigation, который простирается от AbstractHelper (используйте Zend\View\Helper\AbstractHelper). Затем я пишу код внутри публичной функции __invoke(), которая также возвращает некоторый результат. Вы также должны добавить свой класс вспомогательного представления в 'view_helpers' внутри модуля config/module.config.php, что-то вроде этого:

'view_helpers' => array(
    'invokables' => array(
        'nav' => 'Application\View\Helper\Navigation',
    ),
),

Затем вы можете называть свой "nav" как метод в любом месте вашего вида или макета, например nav();? >

Ответ 4

В вашем приложении /Module.php 1) Создайте событие отправки для платформы zend следующим образом:

public function onBootstrap(MvcEvent $e)
{ 
    $eventManager        = $e->getApplication()->getEventManager();
    $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
}    
public function loadConfiguration(MvcEvent $e)
{           
      $controller = $e->getTarget();
      $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
}

2) Теперь вы можете получить доступ к своей определенной переменной в своем макете следующим образом:   $ This- > YOUR_VARIABLE_NAME;

Ответ 5

Почему бы не использовать наследование абстрактной повторяемой конфигурации через базовый контроллер, который устанавливает переменные макета. Так как основное внимание здесь уделяется повторному использованию, базового ООП должно быть достаточно. Zend не нужно делать все:).

Ответ 6

Вы можете передать глобальную переменную в ваш макет из приложения /Module.php в ZendFramework 2 с помощью ModuleManager, как показано ниже:

В вашем приложении /Module.php

Шаг 1:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;

Шаг 2:

class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{    
    public function onBootstrap(MvcEvent $e)
    { 
        $eventManager        = $e->getApplication()->getEventManager();
        $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
    }    
    public function loadConfiguration(MvcEvent $e)
    {           
          $controller = $e->getTarget();
          $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
    }


  // Your remaining code here....

}

Шаг 3:

В файле layout.phtml используйте переменную $this->YOUR_VARIABLE_NAME

Надеюсь, это поможет.