web-dev-qa-db-ja.com

yii2ビューへのJSファイルの登録

_/views/A/_フォルダーにA.phpビューファイルがあります。 _/views/A/_フォルダーにA.js jsファイルがあります。jsファイルをビューファイルに登録してください。

私が理解しているように、ビューファイルに$this->registerJsFile('path/to/file.js');を書かなければなりません。

しかし(質問A)PHPStormから_method registerJsFile is not found in a class_メッセージを受け取ります。

また、(質問B)両方のファイルが同じフォルダー_/views/A/_にあることを考慮して、パスに何を書き込む必要がありますか?

19
David

アセットバンドルを作成するのではなく、手動でファイルを含める特定の理由はありますか?

いずれにせよ 資産に関するドキュメント を読んだ場合、sourceについて明確な区別があることに気付くでしょう。 publishedおよびexternalアセット。

その最も重要な部分は、sourceおよびpublishedアセットが異なるオプションを使用して、ファイルを公開するかどうかと公開する方法を決定することです。

あなたのケースでは、sourceアセットがあり、これをアセットディレクトリにコピーする必要があります。

registerJsFileドキュメントにヒント として呼び出すと、publishedアセットが期待されます。

ここには特に2つのオプションがありますが、おそらく最初のオプションはより迅速で一貫性があります。

  1. _web/_などのように_web/js/_フォルダー内のアセットを移動し、registerJsFile()を使用し続けます
  2. sourceアセットの新しいアセットバンドルを追加し、上記のリンクページで説明されているようにさまざまなオプションを指定します。

これで問題が解決することを願っています。

6
Mr Peach

これはエレガントではありませんが、jqueryの後にjsファイルを登録する必要がある場合は機能します(Yii2のドキュメントを参照)

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

次の方法でjsファイルを登録する場合:

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

これは機能しますが、jQueryを使用することはできません。このファイルall.jsはjQueryの前にロードされるためです。 jQueryの後に読み込むには、'yii\web\YiiAsset'または\yii\web\JqueryAssetに依存させます。したがって、jQuery.jsの後にロードされます。例:

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

\yii\web\JqueryAsset\yii\web\YiiAssetの違いは何ですか?

jQueryAssetでは、jQuery.jsの後にjsファイルがロードされ、YiiAssetでは、yii.jsファイルの後にjsファイルがロードされます。

独自のカスタムアセットバンドルを作成する場合:

<?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

指定された場所にjsファイルを登録します

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

最初の引数は、ページに挿入する実際のJSコードです。 2番目の引数は、スクリプトをページのどこに挿入するかを決定します。可能な値は次のとおりです。

ヘッドセクションのView :: POS_HEAD。

View :: POS_BEGINを開いた直後。

を閉じる直前のView :: POS_END.

ドキュメント準備イベントでコードを実行するためのView :: POS_READY。

これにより、jQueryが自動的に登録されます。ドキュメントロードイベントでコードを実行するためのView :: POS_LOAD。これにより、jQueryが自動的に登録されます。最後の引数は、コードブロックを識別し、新しいIDを追加する代わりに同じIDで既存のものを置き換えるために使用される一意のスクリプトIDです。指定しない場合、JSコード自体がIDとして使用されます。

外部スクリプトは次のように追加できます。

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

RegisterJsFile()の引数は、registerCssFile()の引数に似ています。上記の例では、main.jsファイルをJqueryAssetに依存して登録します。これは、main.jsファイルがjquery.jsの後に追加されることを意味します。この依存関係の指定がないと、main.jsとjquery.jsの相対的な順序は未定義になります。

5
Vikram Pote

A:ドキュメントから: http://www.yiiframework.com/doc-2.0/yii-web-view.html コードは正しいようです。

ビューファイル自体からjsを登録しますか?コントローラーではない? registerJsFile()メソッドは、ビュークラスからのものです。

あなたのIDEがメソッドを見つけられない可能性が高い、Apache環境で試してみましたか?

B:エイリアスを使用する

1
Jørgen