Yii2 регистрация JS файлов в представлении
У меня есть файл просмотра A.php в папке /views/A/
.
И у меня есть файл A.js js в папке /views/A/
Пожалуйста, помогите мне зарегистрировать файл js в файле.
Как я понимаю, я должен написать
$this->registerJsFile('path/to/file.js');
в файле вида.
Но (вопрос A) Я получаю сообщение method registerJsFile is not found in a class
из PHPStorm.
Также (вопрос B), что я должен писать в пути, учитывая, что оба файла находятся в одной папке /views/A/
?
Ответы
Ответ 1
Есть ли какая-то конкретная причина для включения файла вручную, а не для создания пакета активов?
В любом случае, если вы прочитали документацию относительно активов, вы заметили бы четкое различие в источнике, опубликованные и внешние.
Наиболее важной частью этого является то, что источники и опубликованные активы используют разные параметры для определения того, должен ли и как файл публиковать.
В вашем случае у вас есть исходный актив, который необходимо скопировать в каталог ресурсов.
Вызов registerJsFile
как намеченный в документации, ожидает опубликованный актив.
Здесь у вас есть два варианта, которые, вероятно, первые более быстрые и последовательные:
- переместите актив в папку
web/
, как в web/js/
, или что вы предпочитаете, и продолжайте использовать registerJsFile()
- добавьте новый пакет активов для ресурсов source, указав различные параметры, как описано на приведенной выше странице.
Надеюсь, это прояснит ситуацию.
Ответ 2
Это не изящно, но работает, если вам нужно, чтобы ваш js файл зарегистрировался после jquery (как видно из документа Yii2)
<?php $this->registerJsFile(Yii::$app->request->baseUrl.'/js/youFile.js',['depends' => [\yii\web\JqueryAsset::className()]]); ?>
Ответ 3
Если вы зарегистрируете файл 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
файл js будет загружаться после jQuery.js
и в YiiAsset
файл js будет загружаться после yii.js
файла.
Если вы хотите создать свой собственный набор Asset Bundle:
<?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 = [
];
}
Ответ 4
A: Из документов: http://www.yiiframework.com/doc-2.0/yii-web-view.html
Ваш код выглядит правильно.
Вы регистрируете js из самого файла просмотра? а не контроллер?
Метод registerJsFile() относится к классу вида.
Возможно ли, что ваша среда IDE не находит этот метод, попробовали ли вы его в среде apache?
B: Используйте псевдоним
Ответ 5
Зарегистрируйте свой js файл при заданном выполнении
$this->registerJsFile('path/to/file.js', ['position' => \yii\web\View::POS_END]);
Первым аргументом является фактический код JS, который мы хотим вставить на страницу. Второй аргумент определяет, где script следует вставить на страницу. Возможные значения:
Просмотр:: POS_HEAD для раздела главы.
Просмотр:: POS_BEGIN для сразу после открытия.
Просмотр:: POS_END перед закрытием.
View:: POS_READY для выполнения кода в событии готовности документа.
Это автоматически зарегистрирует jQuery.
View:: POS_LOAD для выполнения кода при загрузке документа. Это автоматически зарегистрирует jQuery.
Последний аргумент - это уникальный идентификатор script, который используется для идентификации блока кода и замены существующего с тем же идентификатором вместо добавления нового. Если вы не предоставите его, сам код JS будет использоваться как идентификатор.
Внешний script можно добавить следующим образом:
$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 будет undefined.