【问题标题】:Modifying page content before rendering in Zend?在 Zend 中渲染之前修改页面内容?
【发布时间】:2012-07-07 04:51:29
【问题描述】:

我想根据用户的喜好在页面中使用不同的货币。用户可以将其默认货币设置为英镑、欧元或美元。但是所有页面都已经写了以英镑为单位的价格,即'£'

我不知道如何解决这个问题。首先,我想在使用preDispatch() 或类似的东西渲染之前获取页面内容,修改它,然后渲染修改后的视图。我可以在控制器中获取视图,但只能像对象一样。另一个问题是我也有从控制面板写的报价,它们不包含在视图对象中。当我var_dump($view); 时,视图是一个对象,但控制面板中的报价就像普通的 HTML 一样显示在屏幕上。

我不想编辑所有创建的页面。这将非常费力。 我也查看了Zend_Currency helper,但我认为在那种情况下它无济于事。 任何建议如何解决问题?

【问题讨论】:

    标签: php zend-framework helper helpers


    【解决方案1】:

    您可以向视图添加过滤器。 Matthew Turland 的This article 解释了该过程并提供了一个示例。

    另请参阅 this question,其中有 Bill Karwin 的回答。

    也就是说,更好的方法是使用Zend_Locale 从一开始就生成正确的输出。但是在输出已经创建之后添加过滤器 - 但在它被发送到客户端之前 - 听起来像是一种处理您的特定情况的方法。

    【讨论】:

    • 谢谢你,大卫。我明天将尝试这种视图过滤器并将结果写出来。我认为 Matthew Turland 的文章会解决这个问题。
    • 唯一的问题是我无法使过滤器工作。我不知道该放在哪里。尝试了不同的地方,如图书馆、视图/过滤器等,但仍然出现 500 服务器错误。例如,我在init()class Minify { public function filter($string) { return $string."TEST"; } } 中尝试$this->_helper->layout->getLayoutInstance()->getView() ->addFilterPath(APPLICATION_PATH.'/views/filters') ->addFilter('Minify'); 作为过滤器。
    • 我通常在postDispatch()插件中添加过滤器,但控制器init()应该没问题。我会打开错误和 throwExceptions 以查看确切的错误是什么。
    【解决方案2】:

    假设:我假设如果您根据用户偏好更改货币,其他内容也可能会略有变化。本质上,您允许您的用户做的是根据他们的具体情况定制语言环境。

    getTranslationList() 使您可以访问多种类型的本地化信息。如果您想在无需翻译的情况下向客户显示本地化数据,这些信息将非常有用。它们已经可供您使用。

    以下代码将为您提供大量可以使用的语言环境设置(请认真查看本文底部的链接):

    $list = Zend_Locale::getTranslationList('language', 'de_AT');
    print_r ($list);
    

    最重要的是,你可以获得的一些值:

    • 货币符号
    • NameToCurrency
    • CurrencyToName
    • 货币四舍五入
    • 货币分数
    • CurrencyToRegion
    • RegionToCurrency

    参考:http://framework.zend.com/manual/1.11/en/zend.locale.functions.html#zend.locale.getdata

    【讨论】:

    • 感谢getTranslationList(),弗朗西斯。但有了它,我应该编辑应用程序中的所有现有页面,对吗?
    • 让我先说一下,我从来没有在我的任何应用程序中使用过区域设置信息。但是,我将如何设置它是通过在 Bootstrap.php 文件中使用用户的语言环境信息('language', 'USERS_SETTING') 调用 getTranslationList()(预分配 + 会话加载后)将值保存为常量或使用 Zend_Registry。在您的应用程序中您想使用这些值的任何地方,从注册表调用或使用常量
    【解决方案3】:

    您不想通过后期处理来做到这一点。相反,在输出货币时使用视图助手来反映用户的区域设置。

    【讨论】:

    • 你好,迈克。我为此写了一个助手。这是解决问题的正确方法:stackoverflow.com/questions/11366810/…?助手现在崩溃了,但它可以成为一个解决方案吗?不好的一面是我应该编辑应用程序中的所有页面,这有点难。
    【解决方案4】:

    我不熟悉 Zend 框架的内部结构,但您应该能够只使用输出缓冲区并覆盖实际呈现结果的任何函数,然后 str_replace 覆盖缓冲区的内容。不过可能不是一个特别优雅的解决方案。

    【讨论】:

    • 这是我的第一个想法,但正如我所说,在 View 渲染之前我无法获得纯 html。我只能从控制面板(后端)获取视图对象和优惠不在其中,只有这些来自前端。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2020-05-30
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多