Quel est le meilleur moyen d’enregistrer le code js dans la vue yii2?
<?php
$this->registerJs(
'$("document").ready(function(){ alert("hi"); });'
);
?>
<?php
$this->registerJs('alert("hi");', View::POS_READY);
?>
<?php
$script = "function test() { alert('hi');}";
$this->registerJs($script, View::POS_END, 'my-options');
?>
Yii2, écrit le code dans les vues
<h2>Content</h2>
<?php
$script = <<< JS
alert("Hi");
JS;
$this->registerJs($script);
?>
<?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
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 :)
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(); ?>