Hi Martin,
I have a write up on possible migration issues over at:
http://blog.astrumfutura.com/archives/290-Having-a-bad-ViewRenderer-day-in-your-ZF-app.html
It looks like you are instantiating a private View without relying on any other
instantiation logic later on. It's likely the main change is to manually set
your View on the ViewRenderer using something like:
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer;
$viewRenderer->setView(self:$view); // your cloned View object
$viewRenderer->setViewScriptPathSpec(':controller_:action.:suffix'); // need to
adjust for your personal template naming convention
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
You'll need to adjust more than likely so that you clone the View for the
ViewRenderer and only then pass the clone as a Front controller param. Note,
the above assumes placement before the Front Controller is instantiated
(otherwise you need to get the Existing ViewRenderer object from the
HelperBroker).
From what I've read. Calling the Zend_Controller_Action::render() method as you
do below indirectly should prevent the ViewRenderer from automatically
rendering since render() now calls it directly. Not completely certain of that
so maybe someone else can chime in ;).
Paddy
Pádraic Brady
http://blog.astrumfutura.com
http://www.patternsforphp.com
----- Original Message ----
From: Martin Carpentier <[EMAIL PROTECTED]>
To: [email protected]
Sent: Wednesday, June 6, 2007 11:27:55 AM
Subject: [fw-general] Migration problem with viewRenderer
Hi,
I trying to migrate my application from using ZF 0.9.3 to ZF 1.0.0rc1 .
I've read the doc about the new helpers and the migration but I can't figure
out what I need to change in my code.
My code his heavily based on the ZF tutorial found on the dev wiki.
Here's what I have
in bootsrap.php
...
require 'Zend/Controller/Front.php';
$frontController = Zend_Controller_Front::getInstance(); // manages the
overall workflow
$frontController->addModuleDirectory($appDir . 'modules');
// Initialize views
//require 'Zend/View.php';
self::$view = new Zend_View($config->view->toArray());
self::$view->strictVars(); // enables tracking/detection of typos and
misspelled variables in views
// do not show sensitive logs to requests from non-local networks
if (self::isLocalRequest()) {
self::$view->showLog = $config->view->showLog;
}
self::$view->sectionName = basename($installDir); // e.g. "application"
self::$view->viewSuffix = 'phtml'; // file name suffix for view script
// default location shared by all modules
self::$view->setScriptPath($appDir . 'modules' . $ds . 'default' . $ds
. 'views' . $ds . 'scripts');
Simon_Log::log("scriptPaths=\n " . implode("\n ",
self::$view->getScriptPaths()));
self::$view->timezone = $config->timezone; // default timezone
self::$view->now = $now = date('Y-m-d H:i:s');
/////////////////////////////
// ==> SECTION: mvc <==
// Cause controllers to use private views, but with inheritance (i.e.
defaults in self::$view)
$frontController->setParam('view', clone self::$view); // make private
presentation model for controller
$frontController->setParam('registry', self::$registry); // alternative
to Zend_Registry::getInstance()
return $frontController;
then in application/lib/Controller/Action.php
<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';
abstract class Simon_Controller_Action extends Zend_Controller_Action
{
protected $_redirector = null;
/**
* Initialize the controller
*/
public function init()
{
parent::init(); // just good habit (nothing there currently)
// make the view available to action controllers for holding
presentation model
$this->view = $this->getInvokeArg('view');
$this->view->baseUrl = $this->_request->getBaseUrl();
if (!empty($this->view->viewSuffix)) {
// i.e. do not alter the view's filename suffix, if specified by
the application
$this->viewSuffix = $this->view->viewSuffix;
}
// now give the module a chance to initialize itself and the view used
by the module's controllers
$moduleName = $this->_request->getModuleName();
$class = 'ZFModule_' . ucfirst($moduleName);
if (!class_exists($class)) {
$registry = Zend_Registry::getInstance();
$moduleInit = $registry['appDir'] . 'modules' . DIRECTORY_SEPARATOR
. $moduleName . DIRECTORY_SEPARATOR . $moduleName .
'.php';
if (is_readable($moduleInit)) {
include_once $moduleInit;
}
}
if (class_exists($class, false) && method_exists($class, 'moduleInit'))
{
call_user_func(array($class, 'moduleInit'), $this->view);
}
// initialize the redirector
if ($this->_redirector === null) {
$this->_redirector = $this->_helper->getHelper('Redirector');
}
}
public function initView(array $newViewOptions = array())
{
require_once 'Zend/View/Interface.php';
if (!empty($this->view) && !($this->view instanceof
Zend_View_Interface)) {
throw new Zend_Controller_Exception("'" . (gettype($this->view) ===
'object'
? get_class($this->view) : $this->view) . _("' does not
implement Zend_View_Interface."));
}
$request = $this->getRequest();
$module = $request->getModuleName();
$dirs = $this->getFrontController()->getControllerDirectory();
if (empty($module) || !isset($dirs[$module])) {
$module = 'default';
}
$baseDir = dirname($dirs[$module]) . '/views';
if (!file_exists($baseDir) || !is_dir($baseDir)) {
throw new Zend_Controller_Exception(_('Missing base view directory
("%1$s"', $baseDir));
}
// if we don't have a view yet, create one
if (empty($this->view)) {
require_once 'Zend/View.php';
$options = array_merge(array('basePath' => $baseDir),
$newViewOptions);
$this->view = new Zend_View($options);
} else {
// This is our chance to automatically *prepend* paths for the
active module,
// without having side-effects for other modules that might become
active later
// via an internal reroute (see bootstrap.php's reroute() and
preDispatch()).
// Since the current view object "inherited" from the view object
setup in bootstrap.php,
// this view object already has default paths pointing to the
default module's
// script/helper/filter paths. Thus, the views in ZFDemo modules
can use default
// scripts, helpers, and paths shared via the default module.
$this->view->addScriptPath($baseDir . '/scripts')
->addHelperPath($baseDir . '/helpers')
->addFilterPath($baseDir . '/filters');
// We could support $newViewOptions here, but code would not be DRY
with respect
// to Zend_View_Abstract::__construct(), and the view was already
created elsewhere,
// so there was already an opportunity to supply options.
}
return $this->view;
}
/**
* Convenience method: render a view in <module
directory>/views/scripts/<controller name><action name>.<viewSuffix>
*
* @param string $segmentName OPTIONAL render view to named segment
*/
public function renderToSegment($segmentName = null, $script = null)
{
$this->render($script ? $script :
$this->getRequest()->getControllerName()
. ucfirst($this->getRequest()->getActionName()), $segmentName,
true);
}
}
and then finaly in application/modules/ged/DocumentsController.php
<?php
class Ged_DocumentsController extends Simon_Controller_Action
{
// document id requested (if any)
protected $documentId = false;
// documents model (list of documents)
protected $documents;
/**
* The default action is "indexAction", unless explicitly set to something
else.
* Show a list of all documents.
*/
public function indexAction()
{
$this->displayStage3_4();
$this->displayStage5();
}
/**
* STAGE 3: Choose, create, and optionally update models using business
logic.
* STAGE 4: Apply business logic to create a presentation model for the
view.
*/
protected function displayStage3_4()
{
// SimonModel_Document provides static methods that auto-instantiate
and manage the model
$this->view->documents =
SimonModel_Ged_Document::getPresentationModel();
$this->view->user = 'anonymous';
// Controller = 'index', Action = 'index', param name = 'document'
$this->view->documentUrl = 'index/index/document';
}
/**
* STAGE 5: Choose view and submit presentation model to view.
*/
protected function displayStage5()
{
// Hard way:
//$this->_response->appendBody($this->view->render('indexDocuments.phtml'));
$this->renderToSegment('body'); // initiate STAGE 6 in the view template
}
/**
* redirect bogus URLs back to the application's "home" page
*/
public function __call($name, $parameters)
{
$this->_redirect('/');
}
}
The problem I get is that once in the
view script, the view object has been reset by the viewRenderer helper
and I'm unable to display any data I assign to the view.
Thanks
--
Martin Carpentier
____________________________________________________________________________________
Need Mail bonding?
Go to the Yahoo! Mail Q&A for great tips from Yahoo! Answers users.
http://answers.yahoo.com/dir/?link=list&sid=396546091