Hi Pádraic, Thanks for your reply.
I've tried what you suggested but it did not fix, at first, the problem I was having but after a few other changes (mainly the calls to $this->render() ) it<s working again ! :D Also from what I understand of this new viewRenderer helper, it basicaly does (among many other things) what the Simon_Controller_Action::initView() method was doing so I don<t need it anymore ! Thank you very much for your help Martin On 6/6/07, Pádraic Brady <[EMAIL PROTECTED]> wrote:
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: fw-general@lists.zend.com 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 ------------------------------ TV dinner still cooling? Check out "Tonight's Picks"<http://us.rd.yahoo.com/evt=49979/*http://tv.yahoo.com/>on Yahoo! TV.
-- Martin Carpentier