2013-07-30 14 views
5

In ZF1 ho usato per dichiarare le variabili in Application.iniZF2 Come utilizzare le variabili globali nella vista

brandname = "Example" 
weburl = "http://www.example.com/" 
assetsurl = "http://assets.example.com/" 

E nel Bootstrap ho fatto questo così ho potuto accedervi nella vista

define('BRANDNAME', $this->getApplication()->getOption("brandname")); 
define('WEBURL', $this->getApplication()->getOption("weburl")); 
define('ASSETSURL', $this->getApplication()->getOption("assetsurl")); 

cosa è il modo ZF2 per fare questo, io so che posso creare un array nel file di configurazione local.php come:

return array(
    'example' => array(
     'brandname' => 'Example', 
     'weburl' => 'http://www.example.com/', 
     'asseturl' => 'http://assets.example.com/', 
    ), 
); 

Quando ho Voglio accedere a tale variabile nel controller che posso fare

$config = $this->getServiceLocator()->get('Config'); 
$config['example']['brandname']); 

Fin qui tutto bene ... ma come faccio a accedere a questa variabile nella vista? Non voglio creare una variabile di visualizzazione per questo in ogni controller. E quando provo quanto sopra in una vista del file phtml ottengo un errore.

Zend\View\HelperPluginManager::get was unable to fetch or create an instance for getServiceLocator 

Qualche idea?

+0

Si potrebbe fare un semplice comando di visualizzazione per agire da scorciatoia per le opzioni di configurazione in poche righe di codice – Andrew

+0

Si sta ottenendo quell'errore perché non esiste un helper di visualizzazione del nome 'getServiceLocator'. – Andy0708

risposta

6

È possibile creare un helper di vista sinmple per fungere da proxy per la configurazione, (totalmente non testato).

Module.php

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'configItem' => function ($helperPluginManager) { 
       $serviceLocator = $helperPluginManager->getServiceLocator(); 
       $viewHelper = new View\Helper\ConfigItem(); 
       $viewHelper->setServiceLocator($serviceLocator); 

       return $viewHelper; 
      } 
     ), 
    ); 
} 

ConfigItem.php

<?php 

namespace Application\View\Helper; 

use Zend\View\Helper\AbstractHelper; 
use Zend\ServiceManager\ServiceManager; 

/** 
* Returns total value (with tax) 
* 
*/ 
class ConfigItem extends AbstractHelper 
{ 
    /** 
    * Service Locator 
    * @var ServiceManager 
    */ 
    protected $serviceLocator; 

    /** 
    * __invoke 
    * 
    * @access public 
    * @param string 
    * @return String 
    */ 
    public function __invoke($value) 
    { 
     $config = $this->serviceLocator->get('config'); 
     if(isset($config[$value])) { 
      return $config[$value]; 
     } 

     return NULL; 
     // we could return a default value, or throw exception etc here 
    } 

    /** 
    * Setter for $serviceLocator 
    * @param ServiceManager $serviceLocator 
    */ 
    public function setServiceLocator(ServiceManager $serviceLocator) 
    { 
     $this->serviceLocator = $serviceLocator; 
    } 
} 

È quindi possibile fare qualcosa di simile a suo avviso, sempre che abbiate metterli nella configurazione ovviamente :)

echo $this->configItem('config_key'); 
echo $this->configItem('web_url'); 

Personalmente preferirei passare semplicemente i valori alla vista ogni volta però, mantenendo e guarda il più stupido possibile.

+0

Ha funzionato bene! Grazie, l'unica cosa che posso aggiungere a questo è che non devi creare una matrice multidimensionale come nel mio esempio ma semplicemente inserire le "variabili" che vuoi dichiarare. – Peter

+0

si può sempre modificare in modo che possa usare un'altra notazione per ottenere array multi-dimensionali, come 'something.somethingelse' o 'something/somethingelse' – Andrew

+0

Nice answer, Ma non funziona per me :(Sto usando ZF2 (2.2) Per favore, spiegami di più spiegando passo per passo Voglio fare il modulo Helper in Application Qualsiasi aiuto è apprezzato –

1

Ho risposto prima su un altro post.

/* Inside your action controller method */ 
// Passing Var Data to Your Layout 
$this->layout()->setVariable('stack', 'overflow'); 

// Passing Var Data to Your Template 
$viewModel = new ViewModel(array('stack' => 'overflow')); 


/* In Either layout.phtml or {Your Template File}.phtml */ 
echo $this->stack; // Will print overview 

Questo è tutto ... Non c'è bisogno di fare casino con gli helper di vista, il gestore di eventi, il gestore di servizio o altro.

Divertiti!

+2

Questo funziona, certo. Ma il ragazzo ha detto nella sua domanda: "Non voglio creare una variabile di visualizzazione per questo in ogni controller". ... e la tua risposta è fondamentalmente "creala in ogni controller": - / – timdev