2012-11-13 21 views
24

Mam układ używany przez wszystkie moje widoki i muszę przypisać zmienną ze sterownika do tego układu, jeśli użyję tej metody na kontrolerze to nie działa:Zend Framework 2 - Układ i zmienna

public function indexAction() 
{ 
    return new ViewModel(array(
     'testvar' => 'bla', 
    )); 
} 

ktoś może mi pomóc?

dzięki

+0

to będzie działać, jak można próbować uzyskać dostęp do 'testVar'? – Sam

+0

Używam $ testvar, ale zapomniałem powiedzieć, że układ znajduje się w folderze Application/view/layout, a mój kontroler jest w innym module. Może to jest problem .. Myślałem, że układy w aplikacji mogą być używane gdziekolwiek. – Juck

+2

Ah, chcesz użyć var ​​w layout.phtml, a nie w skryptach widoku akcji? – Sam

Odpowiedz

39

Rob Allen opublikował great article o tym, jak uzyskać dostęp do widoku zmiennych w innym modelu widzenia (np: Układ)

Zasadniczo poniższy kod, umieszczony wewnątrz layout.phtml, będzie pasował do Twoich potrzeb :

<?php 
$children = $this->viewModel()->getCurrent()->getChildren(); 
$child = $children[0]; 
?> 
<!-- some HTML --> 
<?php echo $this->escape($child->myvar);?> 
+4

Dziękuję za tę sugestię, działa - ale nadal wygląda na skomplikowaną:/* blaming-zf2 * – MonkeyMonkey

+1

@MonkeyMonkey To dlatego, że takie rzeczy nie powinny zwykle być konieczne. Są lepsze sposoby (takie jak ViewHelpers/Widgets) niż robienie tego rodzaju rzeczy.Ale może być użyteczny, jeśli naprawdę masz przypadek użycia. – Sam

+0

Widzę, jak to nie powinno być konieczne, ale jak sugerowałbyś zrobić to we właściwy sposób? Ponieważ dostęp do widoków przez menadżera pluginów jest również sprzeczny z regułami semantycznymi, tak jak można przeczytać w całym Internecie. Często zdarza się, że ustawiamy opis nagłówka/specyficzny dla akcji tytuł - lub ładujemy niektóre części javascript/dom w oparciu o to, jakiego interfejsu API potrzebujesz (facebook), którego możesz potrzebować tylko w konkretnej akcji. –

1

Zobacz dodaj widok zmiennym przekroju poniżej

dodać go w pliku Module.php.

Można to również zrobić za pomocą pomocnika widoku.

/** 
    * Remember to keep the init() method as lightweight as possible 
    * 
    * @param \Zend\ModuleManager\ModuleManager $moduleManager 
    */ 
    public function init(ModuleManager $moduleManager) 
    {   
     $events = $moduleManager->getEventManager(); 
     $events->attach('loadModules.post', array($this, 'modulesLoaded')); 
     $events->attach('onBootstrap', array($this, 'bootstrap')); 

     $sharedEvents = $events->getSharedManager(); 
     $sharedEvents->attach(__NAMESPACE__, 'bootstrap', array($this, 'bootstrap'), 100); 
     $sharedEvents->attach(__NAMESPACE__, 'bootstrap', array($this, 'initializeView'), 100); 
     $sharedEvents->attach(__NAMESPACE__, 'dispatch', array($this, 'addViewVariables'), 201);   
    } 


/** 
* 
* @param \Zend\Mvc\MvcEvent $e 
*/ 
public function loadConfiguration(MvcEvent $e) 
{   
    $e->getApplication()->getServiceManager() 
      ->get('ControllerPluginManager')->get('AclPlugin') 
      ->checkAcl($e); //Auth/src/Auth/Controller/AclPlugin  
} 

/** 
* 
* @param \Zend\EventManager\EventInterface $e 
*/ 
public function bootstrap(Event $e) { 

    $eventManager = $e->getParam('application')->getEventManager(); 
    //$app->getEventManager()->attach('dispatch', array($this, 'checkAcl'), 100); 
} 

/** 
* pass variables to layout 
* 
* @param \Zend\EventManager\EventInterface $e 
*/ 
public function addViewVariables(Event $e) 
{ 
    $route = $e->getRouteMatch(); 
    $viewModel = $e->getViewModel(); 
    $variables = $viewModel->getVariables(); 
    if (false === isset($variables['controller'])) { 
     $viewModel->setVariable('controller', $route->getParam('controller')); 
    } 
    if (false === isset($variables['action'])) { 
     $viewModel->setVariable('action', $route->getParam('action')); 
    } 

    $viewModel->setVariable('module', strtolower(__NAMESPACE__));   
} 

/** 
* 
* @param \Zend\Mvc\MvcEvent $e 
*/ 
public function initializeView(Event $e) 
{ 

} 

iw układzie można łatwo uzyskać dostęp do tych zmiennych za pomocą ich nazwy takie jak $ module $ action, $ sterownika według powyższego przykładu

8

Czy próbowałeś:

$this->layout()->testvar = 'bla'; 

Używanie Wtyczka kontrolera layout umożliwia pobranie obiektu ViewModel, który jest używany w layout.phtml.

3

Ponieważ ZF2 ViewModel jest strukturą drzewa, układ faktycznie jest węzłem głównym ViewModel, ViewModel w kontrolerze zostanie dodany jako węzeł podrzędny układu.

Można uzyskać dostęp do układu ViewModel przez dostępu MvcEvent, spróbuj tego w kontrolerze:

public function indexAction() 
{ 
    $events = $this->getServiceLocator()->get('Application')->getEventManager(); 
    $events->attach(MvcEvent::EVENT_RENDER, array($this, 'setVariableToLayout'), 100); 
} 

public function setVariableToLayout($event) 
{ 
    $viewModel = $this->getEvent()->getViewModel(); 
    $viewModel->setVariables(array(
     'testvar' => 'bla', 
    )); 
} 
64

Istnieją trzy sposoby osiągnięcia tego celu w ZF2 (w kontrolerze):

pierwszy:

$this->layout()->someVariableName = 'Some value for the variable'; 

drugie:

$this->layout()->setVariable('someVariableName', 'Some value for the variable'); 

trzecie:

$this->layout()->setVariables(array(
    'someVariableName' => 'Some value for the variable', 
    'anotherVariable' => 'Some value for another variable', 
); 
+2

To jest poprawna odpowiedź. – Joe

+3

To powinna być akceptowana odpowiedź. – dualmon

+0

Jak miałbyś do nich dostęp? –