如何扩展Zend View以实现具体功能?

时间:2009-04-29 03:41:28

标签: php zend-framework localization

我想让设计师尽可能轻松地在视图中本地化字符串,这意味着我想这样做:

...
<p><?php echo $this->_("Hello, world!"); ?></p>
...

这里的下划线表示法是必要的,以允许Poedit自动提取所有字符串以进行本地化。实施是微不足道的:

public function _($string)
{
    return Zend_Registry::get('Zend_Translate')->_($string);
}

目前,我已将此直接放在Zend_View_Abstract中,这很糟糕(我不想通过修改任何Zend库来实现此目的)。理想情况下,我会扩展Zend_View_Abstract以允许我实现我们需要的其他具体功能,但我不知道如何设置它。另一种方法可能是实现View Helper,但我知道如何执行此操作的唯一方法是使视图中的代码更加冗长。任何指针(不,不是那种)将非常感激。谢谢!

4 个答案:

答案 0 :(得分:14)

显然忽略了我自己的路径......

  1. 延长Zend_View
  2. 将您的方法放在此扩展类
  3. 实例化该类(例如在您的引导程序中)
  4. 将其分配给ViewRenderer
  5. 将该viewrenderer传递给Zend_Controller_Action_HelperBroker's addHelper方法
  6. 在您的视图中使用
  7. 在/ library / MegaHAL / Zend / create View.php:

    class MegaHAL_Zend_View extends Zend_View
    {
        public function _($string)
        {
        return Zend_Registry::get('translate')->_($string);
        }
    }
    

    在你的引导程序中:

    require_once APPLICATION_PATH.'../library/MegaHAL/Zend/View.php';
    
    $view = new MegaHAL_Zend_View();
    
    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    

    在您看来:

    <p><?php echo $this->_("Hello");?></p>
    

    我相信会做你想做的事,是吗?

答案 1 :(得分:2)

我认为您正在寻找创建custom view helpers的方法。

示例:

class My_View_Helper extends Zend_View_Helper_Abstract
{
    public function translate($string)
    {
        //...
    }
}

...

$view->setHelperPath('/path/to/helpers', 'My_View_Helper');

...

然后在你的观点中你可以使用它:

echo $this->translate("Hello, World!");

答案 2 :(得分:1)

虽然我认为使用视图帮助程序是正确的“Zend-Framework” - 这样做,你可以扩展Zend_View并实现你想要的所有其他方法 - 这样你就不会t松散了Zend_View

的功能
class My_View extends Zend_View
{
    public function _($string)
    {
        return Zend_Registry::get('Zend_Translate')->_($string);
    }
}

然后,您只需确保实例化新视图类并将其注册为controller中的默认视图(将Zend_Controller_Action::$view实例变量设置为您的类的实例)并在您的Zend_Layout(使用布局时;在不使用view时使用键ViewRenderer传递视图作为配置选项)或使用ViewRendererViewRenderer使用Zend_Controller_Action_Helper_ViewRenderer::setView()

答案 3 :(得分:0)

如果配置正确,Poedit可以自动从_()。

以外的函数中提取字符串