从视图(phtml)访问local.php或global.php?

时间:2013-12-03 16:53:31

标签: zend-framework2

我想在整个应用程序的每次更新中将google分析帐号放入local或global.php。但是,我无法弄清楚如何从视图中访问它。我是否会犯这个错误,或者有办法做到这一点?我想避免的是将东西放入每个控制器以传递它。我只是希望布局能够抓住它。

如果有更好的解决方案,我会全力以赴。

谢谢!

1 个答案:

答案 0 :(得分:3)

如果您只有所有页面的代码,可能您可以在布局视图中对所有分析代码进行硬编码,因此它将用于模块视图。

如果您不想对其进行硬编码,或者您不希望在所有页面中都有代码,或者您有一组不同的布局文件,那么我认为您可以做的最好的事情就是创建一个ViewHelper。

我试着从头开始解释它,以防这是你第一次这样做。

首先,创建一个模块,我称之为 Utils

在模块src中,您可以创建一个文件夹 Utils \ View \ Helper ,然后使用类Analytics创建一个文件 Analytics.php ,如下所示: / p>

<?php

namespace Utils\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\Mvc\Controller\Plugin\FlashMessenger as FlashMessenger;

class Analytics extends AbstractHelper
{
    var $code = null;

    public function setCode($code)
    {
        $this->code = $code;
    }

    public function __invoke()
    {
        ob_start();
        ?>
    <!-- analytics-->
    <script type="text/javascript">
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', '<?=$this->code?>']);
        _gaq.push(['_trackPageview']);

        (function () {
            var ga = document.createElement('script');
            ga.type = 'text/javascript';
            ga.async = true;
            ga.src = 'http://www.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0];
            s.parentNode.insertBefore(ga, s);
        })();

    </script>
    <!-- end analytics-->
    <?php

        return ob_get_clean();
    }

}

?>

在您的 module.php 创建函数 getViewHelperConfig ,您可以在其中为您要创建的viewhelper定义工厂,likethis

public function getViewHelperConfig()
{
    return array(
        'factories' => array(   
            'analytics' => function($sm) {

                            $config = $sm->getServiceLocator()->get('Config');
                            //now in config, you have all your configurations (local, global, etc) as an asociative array
                            $add = new \Utils\View\Helper\Analytics();
                            //you asign here the code from your merged configuration 
                            //(replace *analytics_account_number* with whatever you called it)
                            $add->setCode($config["analytics_account_number"]);
                    return $add;
        }
));
}

现在,在视图中,您只需拨打

即可
echo $this->analytics();

并且框架将搜索工厂,创建对象,指定值,并调用invoke方法,以将完整代码返回到视图。就这样。写一次,随处运行!