Estoy intentando registrar lo siguiente de los documentos de Google Analytics:

<!-- Google Analytics -->
<script>
  window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
  ga('create', 'UA-XXXXX-Y', 'auto');
  ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<!-- End Google Analytics -->

Entonces hice lo siguiente en mi widget:

$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,
    ]
);

Pero el archivo JS registrado salió ANTES de Inline JS. ¿Hay alguna forma de hacer que los guiones respeten el orden?

Pensé en usar un AssetBundle y el protocolo 'depende', pero no hay nada en Yii2 Docs sobre Inline JS en un AssetBundle.

Puede darle una clave al Inline JS, pero lamentablemente el protocolo 'depende' requiere un nombre de clase.

1
Arth 14 nov. 2017 a las 19:46

2 respuestas

La mejor respuesta

Desafortunadamente, la única manera fácil de hacerlo es no usar AssetBundle en este caso particular e incrustar manualmente el código en su archivo parcial / de diseño, después de <?php $this->head() ?>

1
Ravenous 14 nov. 2017 a las 17:25

Puede mover el primer bloque de código a un archivo js y usarlo en un paquete de activos. Luego, para la segunda url js, use ese activo como dependencia

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 = [
   ];
}

Dentro de tu widget

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']);
}
2
ck_arjun 14 nov. 2017 a las 17:11