开发者

Creating a more flexible view in Zend Framework

开发者 https://www.devze.com 2022-12-18 20:24 出处:网络
Given an html/javascript \'widget\' which needs to have certain fields customized before use. For 开发者_StackOverflow中文版example, the css class ids need to be unique as the widget may appear more t

Given an html/javascript 'widget' which needs to have certain fields customized before use. For 开发者_StackOverflow中文版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?


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 :)


Zend_View_Helper_Partial

Example:

<?php echo $this->partial('partial.phtml', array(
   'css_id' => 'foobar')); ?>

To run this from any other module:

<?php echo $this->partial('partial.phtml', 'partials_module', array(
   'css_id' => 'foobar')); ?>

In your partial view script (partial.html) you would then have access to $this->css_id.

0

精彩评论

暂无评论...
验证码 换一张
取 消