View работает только с названием actionIndex()

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Sh1ft
Сообщения: 6
Зарегистрирован: 2016.04.28, 19:45

View работает только с названием actionIndex()

Сообщение Sh1ft »

Добрый вечер. Я только начал изучать yii2 framework. В связи с этим возник, может быть совсем глупый, вопрос такого характера:

Есть у меня MainController.php:

Код: Выделить всё

<?php
namespace app\controllers;
use Yii;

class MainController extends \yii\web\Controller
{
    public function actionIndex()
    {
        return $this->render('index', ['time' => date('H:i:s')]);
    }
}
Так же есть view index.php куда рендерится time. Вызов time выглядит так:

Код: Выделить всё

<?= $time ?>
Если все сделать так, то все прекрасно работает и ошибок нет.

А теперь, кроме даты, я хочу добавить еще один action. Называю его actionHello в MainController.php, код выглядит так:

Код: Выделить всё

<?php
namespace app\controllers;
use Yii;

class MainController extends \yii\web\Controller
{
    public function actionHello()
    {
        $hello = 'Hello World';
        return $this->render('index', ['hello' => $hello]);
    }

    public function actionIndex()
    {
        return $this->render('index', ['time' => date('H:i:s')]);
    }
} 
и напишу в index.php:

Код: Выделить всё

<?= $hello ?>
<?= $time ?>
То вылазит ошибка
Undefined variable: hello
.


Подскажите, пожалуйста, что я не так делаю? как обрабатывать все actions независимо от названия. И по какой причине получается, что view работает только с actionIndex() ?
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: View работает только с названием actionIndex()

Сообщение Евгений Емельянов »

Каждому action должен соответствовать свой view - если есть actionHello, то view должен быть создать в папке views/main/hello.php и уже в нем рендерьте <?= $hello ?>
В доках все подробно (если читать))
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: View работает только с названием actionIndex()

Сообщение Евгений Емельянов »

Код: Выделить всё

public function actionHello()
    {
        $hello = 'Hello World';
        return $this->render('index', ['hello' => $hello]);
    }
И кстати, рендерить нужно не index, а hello

Код: Выделить всё

public function actionHello()
    {
        $hello = 'Hello World';
        return $this->render('hello', ['hello' => $hello]); // здесь hello, не index!
    }
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: View работает только с названием actionIndex()

Сообщение TranceSmile »

Кто вам сказал что нельзя рендерить index в hello?
А ТС включите логику и подумайте.
Изображение
Rom
Сообщения: 81
Зарегистрирован: 2014.12.22, 11:56

Re: View работает только с названием actionIndex()

Сообщение Rom »

Sh1ft писал(а):Подскажите, пожалуйста, что я не так делаю?
Сдается мне что вы просто запутались в двух методах. Если из одного вы передаете $hello то во вьюшке и выводите только $hello. А то получается вы передаете один параметр а вывести хотите два. Ну и конечно укажите для каждого action свой view чтоб не путаться.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: View работает только с названием actionIndex()

Сообщение zelenin »

очевидно, что hello передает в одном экшне, а заходить продолжает на старом, где передан time.
плюс при заходе на разные экшны будет одна и та же ошибка с отсутствующими переменными, в каждом экшне своя.
Ну да, в разных экшнах нужны разные вьюшки.
Sh1ft
Сообщения: 6
Зарегистрирован: 2016.04.28, 19:45

Re: View работает только с названием actionIndex()

Сообщение Sh1ft »

Rom писал(а):
Sh1ft писал(а):Подскажите, пожалуйста, что я не так делаю?
Сдается мне что вы просто запутались в двух методах. Если из одного вы передаете $hello то во вьюшке и выводите только $hello. А то получается вы передаете один параметр а вывести хотите два. Ну и конечно укажите для каждого action свой view чтоб не путаться.
Насколько я понимаю, передаю я именно 2 параметра (time и hello) и хочу вывести 2 параметра (time и hello).

Евгений Емельянов писал(а):Каждому action должен соответствовать свой view - если есть actionHello, то view должен быть создать в папке views/main/hello.php и уже в нем рендерьте <?= $hello ?>
В доках все подробно (если читать))
Последовал вашему примеру и сделал так в MainController:

Код: Выделить всё

<?php

namespace app\controllers;
use Yii;

class MainController extends \yii\web\Controller
{
    public function actionHello()
    {
        $hello = 'Hello World';
        return $this->render('hello', ['hello' => $hello]);
    }
    
    public function actionIndex()
    {
        return $this->render('index', ['time' => date('H:i:s')]);
    }
} 
И создал /view/main/hello.php:

Код: Выделить всё

<?= $hello ?>
index.php выглядит так:

Код: Выделить всё

<?= $time ?>

В итоге ошибок нет, но выводится только time. А надписи Hello World нет. Я так понял, что view подключать не надо нигде или все же я должен где-то указать, что нужно использовать hello.php?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: View работает только с названием actionIndex()

Сообщение ElisDN »

В строке $this->render('hello') это и есть hello.php.
Sh1ft
Сообщения: 6
Зарегистрирован: 2016.04.28, 19:45

Re: View работает только с названием actionIndex()

Сообщение Sh1ft »

ElisDN писал(а):В строке $this->render('hello') это и есть hello.php.
Спасибо! правда, я имел ввиду немного другое. Я думал, что еще где-то нужно подключать hello.php
По какой-то причине не показывает Hello World
Последний раз редактировалось Sh1ft 2016.04.29, 12:03, всего редактировалось 1 раз.
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: View работает только с названием actionIndex()

Сообщение Евгений Емельянов »

TranceSmile писал(а):Кто вам сказал что нельзя рендерить index в hello?
А ТС включите логику и подумайте.
А где я сказал, что нельзя??!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: View работает только с названием actionIndex()

Сообщение zelenin »

Sh1ft писал(а):В итоге ошибок нет, но выводится только time. А надписи Hello World нет. Я так понял, что view подключать не надо нигде или все же я должен где-то указать, что нужно использовать hello.php?
значит вы открываете экшн index.
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: View работает только с названием actionIndex()

Сообщение Евгений Емельянов »

Sh1ft писал(а):
Rom писал(а):
Sh1ft писал(а):Подскажите, пожалуйста, что я не так делаю?
Сдается мне что вы просто запутались в двух методах. Если из одного вы передаете $hello то во вьюшке и выводите только $hello. А то получается вы передаете один параметр а вывести хотите два. Ну и конечно укажите для каждого action свой view чтоб не путаться.
Насколько я понимаю, передаю я именно 2 параметра (time и hello) и хочу вывести 2 параметра (time и hello).

Евгений Емельянов писал(а):Каждому action должен соответствовать свой view - если есть actionHello, то view должен быть создать в папке views/main/hello.php и уже в нем рендерьте <?= $hello ?>
В доках все подробно (если читать))
Последовал вашему примеру и сделал так в MainController:

Код: Выделить всё

<?php

namespace app\controllers;
use Yii;

class MainController extends \yii\web\Controller
{
    public function actionHello()
    {
        $hello = 'Hello World';
        return $this->render('hello', ['hello' => $hello]);
    }
    
    public function actionIndex()
    {
        return $this->render('index', ['time' => date('H:i:s')]);
    }
} 
И создал /view/main/hello.php:

Код: Выделить всё

<?= $hello ?>
index.php выглядит так:

Код: Выделить всё

<?= $time ?>

В итоге ошибок нет, но выводится только time. А надписи Hello World нет. Я так понял, что view подключать не надо нигде или все же я должен где-то указать, что нужно использовать hello.php?
Создал /view/main/hello.php? или /views/main/hello.php? - надо views.
Вообще описали бы в чем задача? На разные роуты разные данные выводить? или в одном (index) вывести и дату и Hello World?
Если первый вариант, то я написал правильно - разные action открываются по разным роутам, а если в index надо было добавить к выводу времени еще и Hello World, то делаете в контроллере так:

Код: Выделить всё

public function actionIndex()
    {
        return $this->render('index', [
            'time' => date('H:i:s'),
            'hello' => 'Hello World'
        ]);
    }
в виде index.php так:

Код: Выделить всё

echo $time . '<br>';
echo $hello;
Sh1ft
Сообщения: 6
Зарегистрирован: 2016.04.28, 19:45

Re: View работает только с названием actionIndex()

Сообщение Sh1ft »

Евгений Емельянов писал(а):
Sh1ft писал(а):
Rom писал(а): Сдается мне что вы просто запутались в двух методах. Если из одного вы передаете $hello то во вьюшке и выводите только $hello. А то получается вы передаете один параметр а вывести хотите два. Ну и конечно укажите для каждого action свой view чтоб не путаться.
Насколько я понимаю, передаю я именно 2 параметра (time и hello) и хочу вывести 2 параметра (time и hello).

Евгений Емельянов писал(а):Каждому action должен соответствовать свой view - если есть actionHello, то view должен быть создать в папке views/main/hello.php и уже в нем рендерьте <?= $hello ?>
В доках все подробно (если читать))
Последовал вашему примеру и сделал так в MainController:

Код: Выделить всё

<?php

namespace app\controllers;
use Yii;

class MainController extends \yii\web\Controller
{
    public function actionHello()
    {
        $hello = 'Hello World';
        return $this->render('hello', ['hello' => $hello]);
    }
    
    public function actionIndex()
    {
        return $this->render('index', ['time' => date('H:i:s')]);
    }
}
И создал /view/main/hello.php:

Код: Выделить всё

<?= $hello ?>
index.php выглядит так:

Код: Выделить всё

<?= $time ?>

В итоге ошибок нет, но выводится только time. А надписи Hello World нет. Я так понял, что view подключать не надо нигде или все же я должен где-то указать, что нужно использовать hello.php?
Создал /view/main/hello.php? или /views/main/hello.php? - надо views.
Вообще описали бы в чем задача? На разные роуты разные данные выводить? или в одном (index) вывести и дату и Hello World?
Если первый вариант, то я написал правильно - разные action открываются по разным роутам, а если в index надо было добавить к выводу времени еще и Hello World, то делаете в контроллере так:

Код: Выделить всё

public function actionIndex()
    {
        return $this->render('index', [
            'time' => date('H:i:s'),
            'hello' => 'Hello World'
        ]);
    } 
в виде index.php так:

Код: Выделить всё

echo $time . '<br>';
echo $hello;
 

Спасибо за ответ, буду знать как это выводить в один файл. Файл создан по адресу /views/main/hello.php
Я хочу сделать так. Чтобы я написал 2 разных экшна и вывел их на страницу. Страница, где описан html скрипт - basic.php. в web.php это все указал.

В basic.php есть <?= $content ?> который и должен мне вывести 2 экшна. Т.е собрать 2 вьюшки (index и hello) и вывести на страницу. Но выводится только index, а hello в стороне.

Как правильно заметил zelenin, я использую только actionIndex, но как открыть actionHello я не понимаю
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: View работает только с названием actionIndex()

Сообщение zelenin »

вам надо начать действовать по документации и различным урокам. у вас пока нет понимания как это работает. а без опыта самостоятельного изучения базовых вещей далеко вы не продвинетесь.
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: View работает только с названием actionIndex()

Сообщение Евгений Емельянов »

Все понятно..., я полагал, что Вы отличаете Представление от Действия контроллера. Вот, можно почитать - http://yiiframework.domain-na.me/doc/gu ... ontrollers
Sh1ft
Сообщения: 6
Зарегистрирован: 2016.04.28, 19:45

Re: View работает только с названием actionIndex()

Сообщение Sh1ft »

Большое спасибо всем за ответы и ссылки, буду дальше разбираться в доках и понимать всю кухню :)
Я стараюсь совмещать обучение с видеоуроками, но, очевидно, плохо получается
Ответить