Хочу научиться работать с yii2

Не относящиеся к фреймворку и программированию вопросы
Ответить
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.13, 23:58

Вкратце, уровень знаний html, php, sql слабый. Есть цель сделать сайт, немного двигаюсь в этом направлении, но очень медленно. Глубокие познания в программировании или верстке в общем и не нужны мне, т.к. работать в этой сфере пока не собираюсь (зарабатываю другим способом), сайт делаю чисто для личного удовольствия и из интереса смогу ли.
Вопрос, на этом форуме возможно получить ответы на возникающие в процессе моего хобби вопросы или здесь только махровые программисты? Если кого-то не испугают может быть глупые вопросы, то подскажите в каком разделе и в каком виде могу их задавать?
P.S. Пытаюсь научиться по видеоурокам, хочу сделать корпоративный сайт - интернет магазин.

Первый вопрос:
Столкнулся с такой проблемой, есть контроллер с экшеном:

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

public  function actionIndex()
    {
        $cat = Categories::find()->where(['parent_id' => ''])->limit(9)->all();
        $subcat = Categories::find()->where(['parent_id' => '1'])->all();
        $counts = Products::find()->where(['count'=> '1'])->limit(3)->all();
        return $this->render('index', compact('cat','subcat','counts'));
    } 
Есть вид, в котором хочу вывести в окне "Картинку категории", "Название категории", "Подкатегории"

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

<? if( !empty($cat)):?>

    <div class="block">


        <? foreach ($cat as $cats):?>
        <div class="preview"><a href="#"><?= Html::img("@web/pic/{$cats->category_img}", ['alt' => $cats->name]) ?></a>
            <br><a href="#" ><strong><?= $cats->name ?></strong></a>
            <ul>
                <? foreach ($subcat as $subcats) :?>
                <li><a href="#"><?= $subcats->name ?></a></li>
                <? endforeach; ?>
            </ul>
        </div>

        <? endforeach; ?>
        </div>
    <? endif;?>
С первыми двумя задачами справился(Картинка и категории в цикле из базы выводятся, а вот как правильно подкатегории вывести не соображу. Если задаю значение в контроллере как сейчас $subcat = Categories::find()->where(['parent_id' => '1'])->all(); , то выводится все прилично, т.е. нужные подкатегории, но только из одной категории в каждом окне. Понимаю, что дело в том, что цикл начинается с заданного параметра 1, проходит, выводит все подкатегории со значением 1, возвращается и опять с 1 подкатегории начинается. Если сильно нарушил правила и написал не в тот раздел, просьба не судить строго, а перенести куда нужно. Заранее спасибо, надеюсь на ваше понимание все когда-то с чего-то начинали.

Аватара пользователя
ElisDN
Сообщения: 5430
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Хочу научиться работать с yii2

Сообщение ElisDN » 2016.09.14, 09:43

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

<? foreach ($cat->subcats as $subcat) :?>

Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.14, 15:20

ElisDN писал(а):

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

<? foreach ($cat->subcats as $subcat) :?>
Большое спасибо. Но хоть пара слов комментария ой как не помешали бы. Я же написал, что не волшебник, а только учусь. Методом научного тыка конечно дойду до понимания, но небольшая помощь не помешала бы.
Как я понял, то что сам написал: $cat содержит в себе весь массив значений таблицы categories конкретно поля parent_id (пустое значение ключа parent_id мне выдаст все значения, но я ограничил их 9 шт.
В виде: Делаю проверку не пустой ли массив $cat далее прохожусь циклом по $cat и записываю полученный результат в $cats. Вывожу картинку с альтом и вторым параметром название категории. Далее списком хочу вывести названия подкатегорий для этого прохожусь циклом по $subcat и записываю полученный результат в $subcats. Вывожу название категорий, но ограниченных значением 1 поля parent_id. Дальше заканчиваются циклы. Можете пояснить, так же человеческим языком, что написано в Вашем сообщении для того, чтобы я понял куда мне это вставить? Заранее благодарен.

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Хочу научиться работать с yii2

Сообщение za4me » 2016.09.14, 15:25

Igor346 писал(а):Методом научного тыка конечно дойду до понимания
Зачем метод тыка если у yii2, есть отличная русская документация?

Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.14, 18:26

za4me писал(а):Зачем метод тыка если у yii2, есть отличная русская документация?
И, то верно. Единственное, что могу ответить, это то, что наверное думаю, что спросить и получить ответ на форуме быстрее будет.

Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.14, 19:49

Если не сложно тыкнете носом где в документации почитать о подобном. Глядишь и документацией научусь пользоваться.


Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.14, 22:36

Не совсем понятно, что я должен узнать по приведенной ссылке. Два файла моделей(Categories и Products) я создал по всем правилам описанным на гитхабе. Имена категорий из таблицы Categories выводятся, вывод популярных товаров из таблицы Products тоже. У меня задача организовать вывод подкатегорий из таблицы Categories, чтобы выводились названия подкатегорий (Category_id(1), что соответствует строкам с параметрами id(11, 12, 13, 14) происходил выход, далее чтобы выводились названия подкатегорий (Category_id(2), что соответствует строкам с параметрами id(15, 16, 17, 18) происходил выход и так по всем 10 категориям - Category_id. Или я не, то что-то прочитал?

Аватара пользователя
ElisDN
Сообщения: 5430
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Хочу научиться работать с yii2

Сообщение ElisDN » 2016.09.14, 23:48

По ссылке пункт про связи. В модели категории сделайте связь getSubcats() как hasMany по полю parent_id и выводите через foreach ($cat->subcats as $sub).

Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.15, 11:52

Извиняюсь за свою тупость, но все же прошу еще немного пояснить. Насколько я понял алгоритм дальнейших действий следующий:
- В модели Categories я создаю метод:

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

public function getSubcats()
    {
        return $this->hasMany(Subcats::className(), ['parent_id' => '?']);
    }
Далее создаю новую модель Subcats, в ней соответственно создаю метод:

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

class Products extends ActiveRecord
{
               public function getCategories()
               {
                    return $this->hasOne(Categories::className(), ['?' => 'parent_id']);
               }
}
- В контроллере

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

public  function actionIndex()
    {
        $cat = Categories::find()->where(['parent_id' => ''])->limit(9)->all();
        $subcat = Categories::find()->where(['parent_id' => ''])->all();
        $counts = Products::find()->where(['count'=> '1'])->limit(3)->all();
        return $this->render('index', compact('cat','subcat','counts'));

        /*$counts = Products::find()->where(['count'=> '1'])->limit(3)->all();
        return $this->render('index', compact('counts'));*/
    }
- В виде

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

<? if( !empty($cat)):?>

    <div class="block">


        <? foreach ($cat as $cats):?>
        <div class="preview"><a href="#"><?= Html::img("@web/pic/{$cats->category_img}", ['alt' => $cats->name]) ?></a>
            <br><a href="#" ><strong><?= $cats->name ?></strong></a>
            <ul>
                <? foreach ($cats->subcat as $subcats) :?>
                <li><a href="#"><?= $subcats->name ?></a></li>
                <? endforeach; ?>
            </ul>
        </div>

        <? endforeach; ?>
        </div>
    <? endif;?>
Вопрос в том, что таблицы Subcats у меня нет и соответственно полей, которые мне необходимы связать с полем parent_id в таблице Categories тоже нет.
Категории и подкатегории разделяются в таблице Categories полем parent_id т.е. Категории 10 шт - 'id' ->'1-10', 'parent_id' -> '0', подкатегории 'id' ->'11-44' 'parent_id' -> '1-10'. В результате получаю сообщение об ошибке:

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

Unknown Property – yii\base\UnknownPropertyException
Getting unknown property: app\models\Categories::subcat



    1. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\Component.php at line 143
    134135136137138139140141142143144145146147148149150151152

                foreach ($this->_behaviors as $behavior) {
                    if ($behavior->canGetProperty($name)) {
                        return $behavior->$name;
                    }
                }
            }
            if (method_exists($this, 'set' . $name)) {
                throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
            } else {
                throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
            }
        }
     
        /**
         * Sets the value of a component property.
         * This method will check in the following order and act accordingly:
         *
         *  - a property defined by a setter: set the property value
         *  - an event in the format of "on xyz": attach the handler to the event "xyz"

    2. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\db\BaseActiveRecord.php at line 252 – yii\base\Component::__get('subcat')
    3. in D:\OpenServer\domains\mebel.local\views\categories\index.php at line 35 – yii\db\BaseActiveRecord::__get('subcat')
    29303132333435363738394041

     
     
            <? foreach ($cat as $cats):?>
            <div class="preview"><a href="#"><?= Html::img("@web/pic/{$cats->category_img}", ['alt' => $cats->name]) ?></a>
                <br><a href="#" ><strong><?= $cats->name ?></strong></a>
                <ul>
                    <? foreach ($cats->subcat as $subcats) :?>
                    <li><a href="#"><?= $subcats->name ?></a></li>
                    <? endforeach; ?>
                </ul>
            </div>
     
            <? endforeach; ?>

    4. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\View.php at line 325 – require('D:\OpenServer\domains\mebel.loca...')
    5. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\View.php at line 247 – yii\base\View::renderPhpFile('D:\OpenServer\domains\mebel.loca...', ['cat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories, ...], 'subcat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories], 'counts' => [app\models\Products, app\models\Products, app\models\Products]])
    6. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\View.php at line 149 – yii\base\View::renderFile('D:\OpenServer\domains\mebel.loca...', ['cat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories, ...], 'subcat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories], 'counts' => [app\models\Products, app\models\Products, app\models\Products]], app\controllers\CategoriesController)
    7. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\Controller.php at line 378 – yii\base\View::render('index', ['cat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories, ...], 'subcat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories], 'counts' => [app\models\Products, app\models\Products, app\models\Products]], app\controllers\CategoriesController)
    8. in D:\OpenServer\domains\mebel.local\controllers\CategoriesController.php at line 24 – yii\base\Controller::render('index', ['cat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories, ...], 'subcat' => [app\models\Categories, app\models\Categories, app\models\Categories, app\models\Categories], 'counts' => [app\models\Products, app\models\Products, app\models\Products]])
    18192021222324252627282930

     
        public  function actionIndex()
        {
            $cat = Categories::find()->where(['parent_id' => ''])->limit(9)->all();
            $subcat = Categories::find()->where(['parent_id' => '1'])->all();
            $counts = Products::find()->where(['count'=> '1'])->limit(3)->all();
            return $this->render('index', compact('cat','subcat','counts'));
     
            /*$counts = Products::find()->where(['count'=> '1'])->limit(3)->all();
            return $this->render('index', compact('counts'));*/
        }
     
        public function actionView($id)

    9. app\controllers\CategoriesController::actionIndex()
    10. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\InlineAction.php at line 55 – call_user_func_array([app\controllers\CategoriesController, 'actionIndex'], [])
    11. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\Controller.php at line 154 – yii\base\InlineAction::runWithParams([])
    12. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\Module.php at line 454 – yii\base\Controller::runAction('index', [])
    13. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\web\Application.php at line 87 – yii\base\Module::runAction('', [])
    14. in D:\OpenServer\domains\mebel.local\vendor\yiisoft\yii2\base\Application.php at line 375 – yii\web\Application::handleRequest(yii\web\Request)
    15. in D:\OpenServer\domains\mebel.local\web\index.php at line 13 – yii\base\Application::run()
    78910111213

    require(__DIR__ . '/../vendor/autoload.php');
    require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
     
    $config = require(__DIR__ . '/../config/web.php');
    require_once __DIR__ . '/../functions.php';
     
    (new yii\web\Application($config))->run();

$_COOKIE = [
    '_ym_uid' => '1473366303873874295',
    '__utma' => '97770499.2012353620.1473366303.1473887075.1473927775.14',
    '__utmz' => '97770499.1473366303.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)',
    '_ym_isad' => '2',
    '_csrf' => 'aa663cae4c92f4fa0d6e8942ea884ccaf4ae165bf11c6a9ff1523b60997dc890a:2:{i:0;s:5:"_csrf";i:1;s:32:"Fu3lX_plr6duGYqI5Hh913vuVOivALjC";}',
    '__utmb' => '97770499.2.10.1473927775',
    '__utmc' => '97770499',
    '__utmt' => '1',
];

Аватара пользователя
ElisDN
Сообщения: 5430
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Хочу научиться работать с yii2

Сообщение ElisDN » 2016.09.15, 14:36

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

['parent_id' => 'id'] 

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

<? foreach ($cats->subcats as $subcat) :?>

Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Хочу научиться работать с yii2

Сообщение Igor346 » 2016.09.15, 22:55

Спасибо Вам большое! Все заработало! Только в своей записи нашел ошибку небольшую
return $this->hasMany(Categories::className(), ['parent_id' => 'id']);
вместо
return $this->hasMany(Subcats::className(), ['parent_id' => 'id']);
Также по-мелочи еще, сабкат->сабкатс имена кое-где перепутаны.

Ответить