如何通过 Yii2 中的 Assets 在布局中正确包含 js- 和 php- 代码?

德米特里

我需要将谷歌标签管理器(Gtag)添加到项目的所有页面(模块)中。Gtag-code 由 3 个文件组成:

- 2 files with js-code, that needs to be included in <head> tag,
- 1 file with <noscript> tags that need to be included in <body> tag.

我项目的每个模块都包含layout.phpAppAsset.php. 这些布局中的 .js 文件需要包含在<body>标签中。

所以,我创建了GlobalAppAsset.php$js在那里定义了-property:

class GlobalAppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';

    public $js = [
        'js/gtag_script1.js',
        'js/gtag_script2.js',
    ];

    public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
}

AppAsset.php对于我继承的项目中的每个模块,GlobalAppAsset.php现在我需要将其$js$js.property 中的 -property合并GlobalAppAsset.php我怎样才能正确地做到这一点?

另外,我需要将AppAsset.php的 js 文件包含在<body>布局的 -section 中,并将GlobalAppAsset.php的 $js 文件包含在<head>-section 中。我怎么能这样

最后,我需要将 Gtag 的 php 文件与<nonscript>-part of gtag in <body>. 可以用资产来做吗?

米哈尔·亨西卡

在您的情况下,最好$depends在 AppAsset 中使用属性而不是扩展 GlobalAppAsset。

您可以保持 GlobalAppAsset 不变,AppAsset 应如下所示:

class AppAsset extends AssetBundle
{
    //... other app assets configuration

    public $jsOptions = ['position' => \yii\web\View::POS_BEGIN];
    public $depends = [
        //... some other dependencies
        \fully\qualified\GlobalAppAsset::class
    ];
}

至于包含 noscript 片段,资产不是如何做到这一点的最佳方式。可能有一些方法,例如覆盖register()注册方法,yii\web\View::EVENT_BEGIN_BODY然后在注册的事件处理程序中输出代码片段。

class GlobalAppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';

    public $js = [
        'js/gtag_script1.js',
        'js/gtag_script2.js',
    ];

    public $jsOptions = ['position' => \yii\web\View::POS_HEAD];

    public static function register($view) {
        parent::register($view);
        $view->on(
            \yii\web\View::EVENT_BEGIN_BODY,
            function($event) use ($view) {
                echo $view->render('the-view-with-noscript');
            }
        )
    }
}

此解决方案可能有效,但由于此解决方案并不完全标准,因此可能会导致以后维护代码出现问题。

更好的解决方案是使用小部件,但您需要在每个布局文件中运行小部件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Sublime Text 3中正确格式化/缩进HTML和PHP代码

Yii2 $ this-> registerJs($ js); 如何在$ js中传递php变量

yii2在main.php布局中创建表单如何使用$ model

如何在Yii2中访问css / js文件以进行模块布局

覆盖yii2中的包和布局

如何在yii2中正确指定迁移名称空间类?

如何在yii2中的布局文件main.php中查找所有条件

使用PHP解析数组-YII2内的JS变量解析JS文件中的PHP数组

如何在Yii2模块中包含图像

如何通过Spring MVC在JSP中包含js和CSS

如何检查 Yii2 代码标准中的解析或语法错误?

如何在yii2中覆盖或编辑供应商目录的代码?

在Yii2高级模板中制作持久的CSS和JS

PHP Yii2框架使用单个核心代码和一个服务器运行多个网站

$this 如何在 yii2 的布局文件中引用 yii\web\View 类的实例?

如何在我的 Yii2 项目中安装和运行 yii2-code-sniffer 或 Php Code Sniffer?

我如何通过Yii2中的hasMany获取表?

如何通过Yii2 Api中的错误消息?

如何在 URL 中包含 PHP 代码

PhpStorm,Yii2基础和代码接收

yii2在视图中注册js代码

Yii2如何将布局文件拆分为单独的页眉和页脚?

如何在Yii2中使用join和indexBy?

如何在Yii2中仅显示ActiveField的标签和错误

如何在Yii2中配置全局uploadPath和uploadUrl?

如何让用户在Yii2和DbManager中担任特定角色?

如何在Yii2 GridView中启用和禁用排序?

如何在Yii2 GridView和DetailView中显示有很多关系记录?

如何在gridview和detailview yii2中检索其他参数而不是id?