web-dev-qa-db-fra.com

yii2 enregistrer le code js dans une vue

Quel est le meilleur moyen d’enregistrer le code js dans la vue yii2?

1

<?php
    $this->registerJs(
    '$("document").ready(function(){ alert("hi"); });'
    );
  ?>

2

<?php 
     $this->registerJs('alert("hi");', View::POS_READY);
?>

3

<?php 
  $script = "function test() { alert('hi');}";    
  $this->registerJs($script, View::POS_END, 'my-options'); 
?>
8
Muhammad Shahzad

Yii2, écrit le code dans les vues 

<h2>Content</h2>
<?php
$script = <<< JS
    alert("Hi");
JS;
$this->registerJs($script);
?>
15
user_ivanp
<?php 
$this->registerJs( <<< EOT_JS_CODE

  // JS code here

EOT_JS_CODE
);
?>

Donc vous ne devez pas échapper au code js

https://www.yiiframework.com/doc/guide/2.0/en/output-client-scripts

3

J'ai créé un widget trivial qui me permet de garder le code propre et de permettre une analyse correcte par l'EDI.

common/widget/InlineScript.php

<?php namespace common\widgets;

/**
 * Easily add JS to the end of the document.
 */
class InlineScript {

    /**
     * Open output buffer.
     */
    public static function listen() {
        ob_start();
    }

    /**
     * Capture the output buffer and register the JS.
     *
     * @param   yii\web\View    $view   The view that should register the JS.
     */
    public static function capture($view) {
        $view->registerJs(preg_replace('~^\s*<script.*>|</script>\s*$~ U', '', ob_get_clean()));
    }

}

exemple d'utilisation (dans la vue)

<?php ob_start(); ?>
    <script>
        alert('asd');
    </script>
<?php $this->registerJs(preg_replace('~^\s*<script.*>|</script>\s*$~ U', '', ob_get_clean())) ?>

Comme vous le voyez, cela utilise des tampons de sortie, il faut donc être prudent. Si chaque listen() n'est pas suivi d'un seul capture(), vous pourriez vous retrouver dans le cauchemar du débogage :)

1
Sabo

Je préfère utiliser le widget de richardfan:

use richardfan\widget\JSRegister;

 <?php JSRegister::begin(['position' => static::POS_BEGIN]); ?>
        <script>
           alert('Hello world');
        </script>
<?php JSRegister::end(); ?>
0
Leonardo Sapuy