2017-11-14 2 views
1

에서 JS 파일 및 인라인 JS의 혼합을 등록 Yii2내가이 (가) <a href="https://developers.google.com/analytics/devguides/collection/analyticsjs/" rel="nofollow noreferrer">Google Analytics docs</a>에서 다음 등록하려고 해요 위해

$this->view->registerJs(' 
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; 
    ga(\'create\', \'UA-XXXXX-Y\', \'auto\'); 
    ga(\'send\', \'pageview\'); 
', View::POS_HEAD); 

$this->view->registerJsFile(
    'https://www.google-analytics.com/analytics.js', 
    [ 
     'async'=>'async', 
     'position' => View::POS_HEAD, 
    ] 
); 

그러나 등록 된 JS 파일은 Inline JS 이전에 나왔습니다. 스크립트가 주문을 존중할 수있는 방법이 있습니까?

AssetBundle과 'depends'프로토콜을 사용하려고 생각했지만 AssetBundle의 Inline JS에 대한 Yii2 문서에는 아무 것도 없습니다.

인라인 JS에 키를 줄 수는 있지만 슬프게도 'depends'프로토콜에는 클래스 이름이 필요합니다.

+1

Analytics 구현 (async)의 특별한 경우에 위치가 중요합니까? 그냥 물어 보는 건데. – Ravenous

+1

@Ravenous 그게 좋은 질문입니다! 나는 모른다. .. 나는 그것이 그것을 가지지 않으면 나는 단지 놓고 갈 것이다 고 생각한다. 그러나 그것은 나를 크게 괴롭힌다 :) – Arth

+1

그것은 정말로 중요하지 않아야한다. 논리적으로 말하면 브라우저는 다음에 나오는 스크립트가로드 될 때까지 "window.ga"가 무엇인지 알지 못합니다. – Ravenous

답변

1

불행하게도 위젯 내부 의존성으로

google_analytics.js

window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; 
ga('create', 'UA-XXXXX-Y', 'auto'); 
ga('send', 'pageview'); 

GoogleAnalyticsAsset.php

<?php 

namespace app\assets; 

use yii\web\AssetBundle; 

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

    public $jsOptions = ['position' => \yii\web\View::POS_HEAD]; 
    public $css = [ 
    ]; 
    public $js = [ 
     'js/google_analytics.js', 
    ]; 
    public $depends = [ 
    ]; 
} 

을 그 자산을 사용하는 유일한 쉬운 이를 수행하는 방법은이 특별한 경우에 AssetBundle을 사용하지 않고 수동으로 삽입하는 것입니다. e 코드를 입력하십시오. <?php $this->head() ?>

+0

위젯에서 코드를 래핑 한 후이 작업을 끝내고 실제로 스크립트를 등록하는 것이 더 좋다고 생각합니다. – Arth

2

첫 번째 코드 블록을 js 파일로 옮기고 애셋 번들에서 사용할 수 있습니다. 그런 다음 두 번째 JS URL에 대한

use app\assets\GoogleAnalyticsAsset; 
public function init() { 
    GoogleAnalyticsAsset::register($this->getView()); 
    parent::init(); 
} 

public function run() 
{ 
    $this->registerJsFile('https://www.google.com/jsapi',['position' => \yii\web\View::POS_HEAD,'depends' => 'app\assets\GoogleAnalyticsAsset']); 
} 
+0

고마워, 그래도 조금 지나치게 보이지만 .. 팀이 코드베이스에서 찾기가 더 어려워진다. – Arth

+0

예 해결 방법. 코드가 작동하기에 충분합니다. 이상하지 않습니다. –

+0

JS 파일과 인라인 JS가 별도의 배열로 들어가기 때문에 파일 배열이 먼저 렌더링되면 렌더링됩니다. – Arth

관련 문제