За последние 24 часа нас посетили 17813 программистов и 1719 роботов. Сейчас ищут 900 программистов ...

Маленькая проблема с yii2

Тема в разделе "PHP для новичков", создана пользователем Alien_php, 14 авг 2016.

  1. Alien_php

    Alien_php Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    38
    Симпатии:
    1
    Люди, которые разбираются, смогут помочь за 2 секунды). Проблема детская, но я уже просидел 2 часа, но так и не понял ничего.

    Смотрите: я создал свой ВИД show.php, в нем я подключаю простой файл scripts.js используя метод
    registerJsFile, который, как вы знаете, принадлежит Class yii\web\View.

    То есть, в файле ВИДА я пишу
    Код (Text):
    1. <h1>Show Action</h1>
    2. <?php $this->registerJsFile('@web/js/scripts.js') ?>
    и файл подключается. Теперь вопрос, почему он подключается? Я ведь не указывал пространство имен ни в контроллере, ни в виде. И даже в AppAsset.php я ничего не указал.
     
  2. Anhk

    Anhk Активный пользователь

    С нами с:
    13 дек 2015
    Сообщения:
    219
    Симпатии:
    11
    автозагрузка?
     
  3. Alien_php

    Alien_php Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    38
    Симпатии:
    1
    Да я без понятия. Я вызываю метод класса, но при этом не указываю его пространства имен. Как yii2 понимает, что нужно запустить именно этот метод этого класса?
     
  4. Anhk

    Anhk Активный пользователь

    С нами с:
    13 дек 2015
    Сообщения:
    219
    Симпатии:
    11
    подожди, я что-то провмыкал. твой вид наследуется от класса View?
    ну тогда просто ищется метод в данном объете, если его там нет, то по цепочке вверх по родителями идёт поиск.
     
  5. Alien_php

    Alien_php Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    38
    Симпатии:
    1
    Нет, в нем только те 2 строки кода, которые я указал.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @Alien_php ты show.php запускаешь через render?
     
  7. Alien_php

    Alien_php Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    38
    Симпатии:
    1
    Разумеется!
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Alien_php нравится это.
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Он подключается, когда в layout вы вызываете <?php $this->head(); ?> и
    <?php $this->endBody() ?>, а также когда вьюха выводится через вызов renderAjax
    В Yii2 вывод так построен, что к моменту, когда выводится layout, все остальные вьюхи уже отработали, и соответственно, все вызовы registerJsFile произошли
     
    Anhk нравится это.
  10. Alien_php

    Alien_php Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    38
    Симпатии:
    1
    хм.... действительно, я убрал <?php $this->head(); ?> и <?php $this->endBody() ?> после чего скрипт уже не подключился... Получается, что render здесь не при чем?
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Почему непричём? А кто подключает, по вашему, layout?
    --- Добавлено ---
    Причём тут вообще пространства имён?
     
  12. Alien_php

    Alien_php Новичок

    С нами с:
    4 мар 2016
    Сообщения:
    38
    Симпатии:
    1
    ну мы когда импортируем пространство имен , например так, use yii\helpers\Html;, можем пользоваться этим классом
    --- Добавлено ---
    Ок, я выяснил, что в ВИДЕ в строке
    Код (Text):
    1. <?php $this->registerJsFile('@web/js/scripts.js') ?>
    $this является объектом yii\web\View. тогда все ясно, мы вызываем метод этого объекта, передаем путь и все у нас подключается. Осталось, чтобы до меня дошло, как попал в Вид этот объект. Через render? через layout?
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Какой объект? Если show.php работает в классе view метода render, а head и endBody методы как уже выше писали вызываются в том же экземпляре view класса в котором и show.php, только после show.php ещё если настроено происходит render layout в котором вызов head и endBody происходит
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Очень просто всё. Вьюхи подрубаются (require или include) внутри одного из методов класса View, поэтому внутри и доступна переменная $this. Упрощённо это выглядит так:
    PHP:
    1. class View {
    2.     /* ...... */
    3.    function render($fname, $params)
    4.    {
    5.          extract($params);
    6.          include $fname;
    7.    }
    8. }
    В реале всё, конечно, посложнее немного, но суть такая
    --- Добавлено ---
    А вообще, что, код Yii2 никак не почитать?
    --- Добавлено ---
    Вон и ссылку @denis01 дал, там как раз почти один в один код с моим, только ещё идёт буферизация вывода, чтоб потом можно было спокойно всё собирать в общий вывод
     
    denis01 и Alien_php нравится это.