Dans Yii, passez les variables PHP vers JavaScript

Dans mon JavaScript (en utilisant jQuery), il existe un ensemble de variables PHP auxquelles j'ai besoin d'accéder. Alors que je l'ai travaillé en produisant simplement le fichier JavaScript comme vue, puis en utilisant renderPartial() pour faire écho au JavaScript dans la vue principale.

Cependant, ce n'est évidemment pas très élégant, alors j'aimerais connaître la manière de le faire. J'ai regardé le gestionnaire d'actifs, mais cela semble être pour les fichiers JavaScript statiques – vous ne pouvez pas inclure PHP ici (sauf si je me trompe).

Y a-t-il une autre façon de le faire?

Vous pouvez considérer registerScript . À mon avis, c'est mieux car il y a un paramètre nommé $ position, qui peut vous aider à contrôler la sortie du processus de rendu ().

Il n'y a rien intrinsèquement incorrect ou inelegant avec votre approche, et oui, les actifs sont du contenu statique (JS, CSS, etc.) – sans rapport avec le problème.

Fondamentalement, vous ne pouvez exposer que la valeur d'une variable PHP dans JS en l'écrivant dans le code PHP. Si vous n'avez besoin que de cette valeur dans une portée limitée, vous pouvez simplement l'écrire en tant que constante en ligne (c'est-à-dire, par exemple, certains widgets). Si vous avez besoin d'être disponible dans tout votre code JS, la seule option est de produire un code JS comme vous le faites maintenant.

Il n'est pas strictement nécessaire de créer une nouvelle vue partielle pour vos variables PHP-to-JS, mais ce n'est pas une mauvaise idée. Si vous êtes satisfait, utilisez-le.

L'une des approches consiste à définir une variable globale par un petit script et redisterScript (), puis utiliser cette variable en js réels

Définir vos variables dans une clé => tableau de valeurs et utiliser CJSON :: encode fonctionne vraiment bien. Vous pouvez accéder à toutes vos variables via l'objet créé par parseJSON de jQuery. Par exemple:

 $myVarList = array( 'nameOne'=>$valueFromAnotherVar, 'nameTwo'=>$object->coolValue, 'nameThree'=>$cat->hoursSleptToday() ); Yii::app()->clientScript->registerScript("myVarList", 'myVarList = jQuery.parseJSON('.CJSON::encode($myVarList).');' 

Vous pouvez alors accéder aux valeurs de la var globale.

 myVarList.nameOne || myVarList.nameTwo || myVarList.nameThree 

Reportez-vous à Yii2 – Client Scripts Documentation , vous pouvez utiliser la fonction registerJS pour transmettre des variables à javascipt. Par exemple:

 /* @var $this yii\web\View */ $this->registerJs( "var calenderEvents = ".Json::encode($calenderEvents).";", yii\web\View::POS_HEAD, 'calender-events-script' ); 

Essayez de le faire de cette façon:

$ MyVarList = tableau (
'NameOne' => $ valueFromAnotherVar,
'NameTwo' => $ object-> coolValue,
'NameThree' => $ cat-> hoursSleptToday ()
);

$ Json = addslashes (CJSON :: encode ($ myVarList));

Yii :: app () -> clientScript-> registerScript ("myVarList", 'myVarList = jQuery.parseJSON ("'. $ Json. '");');