Php – Creating a more flexible view in Zend Framework

model-view-controllerPHPzend-framework

Given an html/javascript 'widget' which needs to have certain fields customized before use. For example, the css class ids need to be unique as the widget may appear more than once on the same page.

Let's say I want to keep the markup (js/html) of the widget stored as a template so that I can fill in the values that need to be customized during resuse.

I know that Zend Framework's views give you at least part of this functionality, but each view is generally associated with a particular controller. Given that this widget could be created from any controller, yes still needs to be able to access some properties stored in a controller (or model). Where should I put the widget markup and how then do I fill in the custom values?

Can I create a custom view that can be reused within the same page (appear more than once) as well as on other pages? If so, how do I set that up?

Best Answer

Sounds like you need a ViewHelper http://framework.zend.com/manual/en/zend.view.helpers.html. Create a custom helper that will fetch the data from a model and just simply output it. This way it won't depend on any controller, can be called in either the layout or in any view script. Example:

// views/helpers/Widget.php
class Zend_View_Helper_Widget extends Zend_View_Helper_Abstract
{
protected $_model = null;

protected $_view = null;

public function widget()
{
    $data = $this->_getDataFromModel();

    return $this->_view->partial('widget.phtml', array('data' => $data));
}

public function setView(Zend_View_Interface $view)
{
    if($this->_view === null) {
        $this->_view = $view;
    }

    return $this->_view;
}

protected function _getDataFromModel()
{
     $this->_model = $this->_getModel();
     return $this->_model->getDataForWidget();
}

protected function _getModel()
{
     if($this->_model === null) {
         $this->_model = new Model_Widget(); // or whatever it's called
     }
     return $this->_model;
}

The partial script:

// views/scripts/widget.phtml
<div class="widget-class"><?php echo $this->data; ?></div>

And when you need it in your views just call it like <?php echo $this->widget(); ?>

Note that I'm rendering the widget in a separate partial view script, just to avoid having html/css in the helper itself.

Hope this helps to get you started :)

Related Topic