Reputation: 99
variables from controller do not appear in a view and view-helpers do not work: for example I define a variable in controller:
$this->view->title = "Title";
and print it in a view:
echo $this->title;
The contents of the variable "titles" doesn't appear in the page.
Here is my bootstrap file:
use ZFBootstrap\View\Helper\Navigation\Menu;
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoload() {
require_once '../application/views/helpers/LoggedInAs.php';//need to include a view-helper
require_once '../application/plugins/AuthPlugin.php';
require_once '../application/configs/configAcl.php';
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin($auth = new AuthPlugin());
$frontController->getRouter()->addDefaultRoutes();
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
$this->bootstrap('layout');
$layout=$this->getResource('layout');
$view=$layout->getView();
$config = new Zend_Config_Xml(APPLICATION_PATH. '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$view->registerHelper(new Menu(), 'menu');
$view->navigation($container);
Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);
$auth = Zend_Auth::getInstance();
$identity = $auth->getIdentity();
$role = ($auth->hasIdentity() && !empty($auth->getIdentity()->role))
? $auth->getIdentity()->role : 'guest';
Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role);
$view->navigation()->menu()->render();
$view->navigation()->menu()->setMinDepth(1)->setUlClass('nav');
}
If instead I use this code
use ZFBootstrap\View\Helper\Navigation\Menu;
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoload() {
require_once '../application/plugins/AuthPlugin.php';
require_once '../application/configs/configAcl.php';
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin($auth = new AuthPlugin());
$frontController->getRouter()->addDefaultRoutes();
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
/*$this->bootstrap('layout');
$layout=$this->getResource('layout');
$view=$layout->getView();*/
$config = new Zend_Config_Xml(APPLICATION_PATH. '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
/*$view = Zend_Layout::startMvc()->getView();
$view->registerHelper(new Menu(), 'menu');
$view->navigation($container);//->setAcl($acl)->setRole($auth->getStorage()->read()->role);
*/Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);
$auth = Zend_Auth::getInstance();
$identity = $auth->getIdentity();
$role = ($auth->hasIdentity() && !empty($auth->getIdentity()->role))
? $auth->getIdentity()->role : 'guest';
Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role);
/*$view->navigation()->menu()->render();
$view->navigation()->menu()->setMinDepth(1)->setUlClass('nav');*/
}
everything works exept navigation. The question is, why my navigation doesn't work and how can I fix it.
Upvotes: 0
Views: 170
Reputation: 8519
To begin with your Bootstrap.php
is an utter mess. Start with some basic organization.
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/**
* initialize the session
*/
protected function _initsession()
{
Zend_Session::start();
}
/**
* initialize the registry and assign application.ini to config namespace of Zend_Registry
*/
protected function _initRegistry()
{
$config = new Zend_Config($this->getOptions());
Zend_Registry::set('config', $config);
}
When you want to manipulate the view object in your bootstrap you need to make sure to return the new view:
/**
* initialize the view and return it
* @return \Zend_View
*/
protected function _initView()
{
//Initialize view
$view = new Zend_View();
//add custom view helper path
$view->addHelperPath('/../library/My/View/Helper');
//set doctype for default layout
$view->doctype(Zend_Registry::get('config')->resources->view->doctype);
//set head meta data
$view->headMeta()->setCharset(Zend_Registry::get('config')->resources->view->charset);
//set css includes
$view->headlink()->setStylesheet('/bootstrap/css/bootstrap.min.css');
$view->headLink()->appendStylesheet('/css/main.css');
//add javascript files
$view->headScript()->setFile('/bootstrap/js/jquery.min.js');
$view->headScript()->appendFile('/bootstrap/js/bootstrap.min.js');
//add the view to the view renderer
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
'ViewRenderer');
$viewRenderer->setView($view);
//Return it, so that it can be stored by the bootstrap
return $view;
}
As far as navigation is concerned. You can initialize your navigation container in the bootstrap but the actual view components will typically bet setup in the layout:
/**
* The bootstrap part as example, yours will likely be similar but different
*/
protected function _initNavigation() {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/site.xml');
$container = new Zend_Navigation($config);
$registry = Zend_Registry::getInstance();
$registry->set('Zend_Navigation', $container);
}
Then in your layout file you may implement the navigation similar to:
<div id="nav">
<?php echo $this->navigation()->menu()
->renderMenu(null, array(
'minDepth' => null,
'maxDepth' => 1,
'onlyActiveBranch' => TRUE
)) ?>
</div>
One thing to keep in mind: The options we getting when we call $this->getOptions()
in the _initRegistry()
method come from the application.ini file. A large number of options are often initialize here.
//application.ini as example your settings will be somewhat different
[production]
;-------------------------------------------------------------------------------
;PHP
;-------------------------------------------------------------------------------
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
;-------------------------------------------------------------------------------
;Paths and Namespaces
;-------------------------------------------------------------------------------
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
autoloaderNamespaces[] = "My_"
;-------------------------------------------------------------------------------
;Front Controller
;-------------------------------------------------------------------------------
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.frontController.moduleControllerDirectoryName = "controllers"
resources.frontController.params.prefixDefaultModule = ""
resources.modules = ""
resources.frontController.baseurl = http://example.com
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
;-------------------------------------------------------------------------------
;plugins
;-------------------------------------------------------------------------------
pluginPaths.My_Application_Resource = APPLICATION_PATH "/../library/My/Resource"
resources.frontController.actionhelperpaths.My_Controller_Action_Helper = APPLICATION_PATH "/../library/My/Controller/Action/Helper"
;-------------------------------------------------------------------------------
;View Settings
;-------------------------------------------------------------------------------
resources.view[]=
resources.view.charset = "UTF-8"
resources.view.encoding = "UTF-8"
resources.view.doctype = "HTML5"
resources.view.language = "en"
;-------------------------------------------------------------------------------
;Database Settings
;-------------------------------------------------------------------------------
resources.db.adapter = "pdo_Mysql"
resources.db.params.username = "user"
resources.db.params.password = "xxxxxxx"
resources.db.params.dbname = "dbname"
resources.db.params.charset = "utf8"
resources.db.isDefaultTableAdapter = true
resources.db.params.profiler = true
;-------------------------------------------------------------------------------
;Layouts
;-------------------------------------------------------------------------------
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
[staging : production]
[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
If your page is blank and you think it shouldn't be. Set your environment to 'development' or just change the error display values from '0' to '1' in the 'production' section. If you do this the errors will display.
Good Luck
Upvotes: 1