Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何扩展Zend View以实现具体功能?_Php_Zend Framework_Localization - Fatal编程技术网

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

Php 如何扩展Zend View以实现具体功能?,php,zend-framework,localization,Php,Zend Framework,Localization,我想让我们的设计师尽可能容易地在视图中本地化字符串,这意味着我想这样做: ... <p><?php echo $this->_("Hello, world!"); ?></p> ... 目前,我已将其直接放入Zend\u View\u Abstract,这很糟糕(我不想通过修改任何Zend库来实现这一点)。理想情况下,我会扩展Zend\u View\u Abstract,以实现我们需要的其他具体功能,但我不知道如何设置。另一种方法可能是实现视图帮助器,

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

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

目前,我已将其直接放入
Zend\u View\u Abstract
,这很糟糕(我不想通过修改任何Zend库来实现这一点)。理想情况下,我会扩展
Zend\u View\u Abstract
,以实现我们需要的其他具体功能,但我不知道如何设置。另一种方法可能是实现视图帮助器,但我知道的唯一方法是使视图中的代码更加冗长。任何指点(不,不是那种)都将不胜感激。谢谢

我认为你在寻找一种创造的方式

例如:

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

然后,您可以在视图中使用它:

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

如果配置正确,Poedit可以自动从函数中提取字符串,而不是从函数中提取()。

尽管我认为使用视图帮助程序是正确的“Zend Framework”方法,您可以扩展
Zend_View
并实现您想要的所有其他方法-这样您就不会失去
Zend_View
的功能

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

然后,您只需确保在中(将
Zend\u Controller\u操作::$view
实例变量设置为类的实例)和中(使用布局时;使用键
view
将视图作为配置选项传递)实例化并注册为默认视图即可当不使用
ViewRenderer
或使用
Zend\u Controller\u Action\u Helper\u ViewRenderer::setView()使用
ViewRenderer
时,显然忽略您自己的路径

  • 扩展
    Zend\u视图
  • 将您的方法放在这个扩展类中
  • 实例化类(例如在引导程序中)
  • 将其指定给ViewRenderer
  • 将该viewrenderer传递给Zend\u Controller\u Action\u HelperBroker的
  • addHelper方法
  • 在你的视野中使用它
  • 在/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>
    


    我相信这会满足您的要求,是吗?

    我不想使用助手,因为由于类命名和文件命名的要求(在您链接的文档中提到),我似乎无法在助手中实现名为“\u1”的函数。正如我在问题中所说,下划线符号对于简洁性、与gettext的一致性以及Poedit automagic字符串提取都很重要。我想我要做的是扩展Zend_View_Abstract,并使用新的自定义视图代替ViewRenderer使用的视图,在Zend的最新版本中,没有关于如何以非黑客方式实现这一点的信息。Zend文档毫无帮助地提到“许多开发人员发现他们想要扩展Zend_View_Abstract以添加自定义功能”,但没有提到如何做。是的,你说得很对-但我仍然想向所有视图公开一个具体的帮助器函数。有可能吗?谢谢,我相信这正是我想要的。真是一种享受——谢谢你的帮助。我接受这一点而不是其他答案,因为这是一个循序渐进的过程,并且是针对我在ViewRenderer中遇到的问题。没问题,很乐意提供帮助。我倾向于更详细的解释,因为像Zend框架文档中那样的“一、二略过几”类型的指令,最终似乎总是忽略了将它们联系在一起的一个小金块。。。让我发疯。
    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>