web-dev-qa-db-fra.com

yii2 enregistrement de fichiers JS dans une vue

J'ai un fichier de vue A.php dans le dossier /views/A/. Et j'ai le fichier js A.js dans le dossier /views/A/ Veuillez m'aider à enregistrer le fichier js dans le fichier de visualisation.

Si je comprends bien, je dois écrire $this->registerJsFile('path/to/file.js'); dans le fichier de vue.

Mais (Question A), je reçois un message method registerJsFile is not found in a class De PHPStorm.

Aussi (Question B) que dois-je écrire dans le chemin d'accès étant donné que les deux fichiers se trouvent dans le même dossier /views/A/?

19
David

y a-t-il une raison spécifique d'inclure le fichier manuellement plutôt que de créer un ensemble d'actifs?

Dans tous les cas, si vous avez lu la documentation concernant les actifs , vous auriez remarqué qu'il y a une distinction claire concernant la source , actifs publiés et externes .

La partie la plus importante étant que source et publié les ressources utilisent différentes options pour déterminer si et comment un fichier doit être publié.

Dans votre cas, vous avez un élément source qui doit être copié dans le répertoire des éléments.

L'invocation de registerJsFile as suggéré dans la documentation , attendra un atout publié.

Ici, vous avez spécifiquement deux options, dont la première est probablement plus rapide et cohérente:

  1. déplacez l'actif dans le dossier web/, comme dans web/js/ ou tout ce que vous préférez et continuez à utiliser registerJsFile()
  2. ajoutez un nouvel ensemble d'actifs pour les actifs source , en spécifiant les différentes options détaillées dans la page liée ci-dessus.

J'espère que cela clarifie les choses.

6
Mr Peach

Ce n'est pas élégant, mais fonctionne si vous avez besoin d'enregistrer votre fichier js après jquery (comme vu dans le doc Yii2)

<?php $this->registerJsFile(Yii::$app->request->baseUrl.'/js/youFile.js',['depends' => [\yii\web\JqueryAsset::className()]]); ?>
16
xav

Si vous enregistrez un fichier js par:

$this->registerJsFile("@web/js/all.js");

Cela fonctionnera mais vous ne pourrez pas utiliser jQuery. Parce que ce fichier all.js est chargé avant jQuery. Pour charger après jQuery nous le faisons dépendre de 'yii\web\YiiAsset' ou le \yii\web\JqueryAsset. Il sera donc chargé après jQuery.js. Exemple:

$this->registerJsFile("@web/js/all.js",[
    'depends' => [
        \yii\web\JqueryAsset::className()
    ]
]);

Alors, quelle est la différence entre \yii\web\JqueryAsset et \yii\web\YiiAsset?

Dans jQueryAsset le fichier js se chargera après jQuery.js et dans YiiAsset le fichier js se chargera après yii.js fichier.

Si vous souhaitez créer votre propre ensemble d'actifs personnalisé:

<?php 
namespace frontend\components;
use yii;

use yii\web\AssetBundle;
class CustomAssets extends AssetBundle
{
    public $css = [
        "path/to/css/file.css"
    ];
    public $js = [
        "path/to/js/file.js"
    ];
    public $depends = [
    ];
}
7
Ilyas karim

Enregistrez votre fichier js sur un bien donné

$this->registerJsFile('path/to/file.js', ['position' => \yii\web\View::POS_END]);

Le premier argument est le code JS réel que nous voulons insérer dans la page. Le deuxième argument détermine où le script doit être inséré dans la page. Les valeurs possibles sont:

Voir :: POS_HEAD pour la section de tête.

Voir :: POS_BEGIN pour juste après l'ouverture.

Voir :: POS_END juste avant la fermeture.

View :: POS_READY pour exécuter le code sur l'événement prêt pour le document.

Cela enregistrera jQuery automatiquement. View :: POS_LOAD pour l'exécution de code lors d'un événement de chargement de document. Cela enregistrera jQuery automatiquement. Le dernier argument est un ID de script unique qui est utilisé pour identifier le bloc de code et remplacer celui existant par le même ID au lieu d'en ajouter un nouveau. Si vous ne le fournissez pas, le code JS lui-même sera utilisé comme ID.

Un script externe peut être ajouté comme suit:

$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]);

Les arguments de registerJsFile () sont similaires à ceux de registerCssFile (). Dans l'exemple ci-dessus, nous enregistrons le fichier main.js avec la dépendance sur JqueryAsset. Cela signifie que le fichier main.js sera ajouté APRÈS jquery.js. Sans cette spécification de dépendance, l'ordre relatif entre main.js et jquery.js ne serait pas défini.

5
Vikram Pote

R: D'après la documentation: http://www.yiiframework.com/doc-2.0/yii-web-view.html Votre code semble correct.

Enregistrez-vous les js à partir du fichier de vue lui-même? pas le contrôleur? La méthode registerJsFile () provient de la classe view.

Il est fort possible que votre IDE ne trouve pas la méthode, l'avez-vous essayée dans un environnement Apache?

B: utilisez un alias

1
Jørgen