Задать вопрос
  • Как исправить ошибку "Call to a member function isAttributeRequired() on null" при открытии формы связных таблиц?

    myks92
    @myks92 Куратор тега Yii
    Михаил Балагура, дак в этом и суть. По первых во view не должно быть логики. Во вторых вы можете в этом методе сделать if (city_id) тогда выводим...

    Форма выводится независимо от наполняемости полей. Она наоборот заполняется данными.

    Select2 отличается от dropdownlist только внешним оформлением и js скриптами. И там и там нужен массив ключ значение.

    У вас именно то в чем проблема? В выводе списков городов или что? Можете подробней описать проблему. Если отвечать по вопросу, то такая ошибка возникает когда поле равно пусто
  • Как исправить ошибку "Call to a member function isAttributeRequired() on null" при открытии формы связных таблиц?

    myks92
    @myks92 Куратор тега Yii
    Михаил Балагура, вариантов много. Если правильно, то в репозитории, который подключается к форме. Если более менее удобно в самой форме используя метод getCity(). Пример тут. Метод категорий https://github.com/ElisDN/yii2-demo-shop/blob/mast...
  • Yii2. Как реализовать реферальную систему?

    myks92
    @myks92 Куратор тега Yii
    Но я вам сразу скажу это не хороший код))) Это лишь пример. Делайте свой код по правилам Хотябы DDD и ООП. Не надо делать такую кашу кода в контроллере))
  • Как исправить ошибку "Call to a member function isAttributeRequired() on null" при открытии формы связных таблиц?

    myks92
    @myks92 Куратор тега Yii
    Михаил Балагура, сделайте проверку. Если города нет в базе выдавайте сообщение об ошибке, что вашего города ещё нет в базе. Или добавляйте на лету новый город.
  • Архитектура приложения. Как сделать независимые модули (сервисы)?

    myks92
    @myks92 Куратор тега Yii
    vitaly_74, да вовсе не профи. Просто нужно изучать вопросы по архитектуре. Это удобнее и понятнее. Поэтому я пользуюсь этим. Вы сначала прочитайте то, что послал. Разберитесь. Потому что сразу реализовать не получится. Будут вопросы.

    Путь архитектуры примерно такой:
    ОПП->DDD->CQRS.

    Если проект не сложный там можно использовать минимум - ООП или вообще без него.

    Если проект с более сложной логикой и побольше - DDD.

    Если у вас совсем сложный проект - CQRS.

    Следующий этап это разделение на две базы данных (или денормализация данных в отдельные таблицы)

    Это лично моё мнение, а не основа) Выявил для себя такие подходы. Но никто не мешает всегда работать по DDD или CQRS. Вторая не всегда подходит всем и не для всех задач. Почитайте. Однако CQRS стоит изучить для понимания и масштабирования. Такая система может масштабироваться столько угодно. Можно даже выделить отдельную команду на COMMAND и QUERY. В общем плюсов от такой архитектуры не перечесть. Но есть и минусы.
  • Архитектура приложения. Как сделать независимые модули (сервисы)?

    myks92
    @myks92 Куратор тега Yii
    vitaly_74, Ваше право как строить архитектуру)) Можете хоть в View весь код писать вместе с HTML. Вы же спросили как сделать. Я вам ответил. А как вы будете делать - ваше решение)

    Но есть хороший паттерн CQRS. В нём как раз говорится о том, как работать в таких ситуациях. Модель делится на две Command (команда) и Query (чтение). Если говорить о папках, то есть Model, а есть ReadModel.

    Model - это сущности и весь независимый код. Эта часть должна быть полностью независима. И она используется только для изменения поведения системы. Если говорить о CRUD, то Model - это CUD.
    ReadModel - это R - чтение. Она не изменяет поведение системы.

    Что это дает? В модели мы работаем как обычно, но не используем этот слой для чтения. А в ReadModel мы используем только для чтения. Репозитории для записи и для чтения разные. В ReadModel мы можем сделать запрос хоть на голом SQL без использования объектов. А если нагрузки очень большие, то можем вынести в плоскую базу данных данные для чтения (redis), вместо СУБД.

    Таким образом мы не лезем сущностью user в billing. а для вывода у пользователя историю платежей формируем в ReadModel. Которая возвращает либо массив:

    user => [
           'ID' => 
           'username' => 'asdasd'
          'billing' => [
                      'id' => 1,
                      .....
          ]
    ]

    либо View Model - специальная модель для отображения.

    При таком подходе у вас код будет в модели всегда независимый и его можно копировать без опаски. Кроме того действует правило SOLID. Каждая часть отвечает за своё.

    Пример такой структуры есть у Дмитрия Елисеева:
    На Yii2: https://github.com/ElisDN/yii2-demo-shop
    На Simfony: https://github.com/ElisDN/demo-project-manager

    Чтобы понять о чём я говорю почитать статью:
    https://blog.byndyu.ru/2014/07/command-and-query-r...
  • Как правильно вызвать виджет со следующими данными в yupe?

    myks92
    @myks92 Куратор тега Yii
    on_click, вот) хорошо что разобрались) Тут ещё надо видеть код)

    Ответ вряд ли кому пригодится. Это типовой вопрос, который легко ищется в документации. А у вас просто ещё юпи, которая накладывает свою логику.
  • Как правильно вызвать виджет со следующими данными в yupe?

    myks92
    @myks92 Куратор тега Yii
    <?php
      $this->widget('application.modules.user.widgets.UsersList', array(
        'condition' => array(
          'limit' => 12, 
          'together' => true, 
          'group' => 't.id',
          'category.id = 159'
        ),
        'type' => ''
      ));
    ?>

    Может так. Не понимаю почему тут array(). По идее тут можно вставить обычный SQL запрос. . Не знаком с yii1 дак сложно) Ещё с телефона...)
  • Как правильно вызвать виджет со следующими данными в yupe?

    myks92
    @myks92 Куратор тега Yii
    on_click, сложно так советовать на yii1)) тем более с телефона. Я вам скинул ссылку. Там вполне понятно написано. Попробуйте andCondition(...). Я сейчас не могу написать код с телефона. Могут быть запятые не так))

    У вас сдожности будут. На yii1 мало кто работает. Помогать мало кто сможет. Он схож с yii2, но есть отличия. А если вы уж не знаете первую версию, то надо садиться и разбираться. Потому что вы потратите много времени и зададите много простых вопросов. Прочитайте Всю документацию. Попробуйте полагаться на неё. А уже если совсем не можете просите помощи. Ну а если сложно даётся - откажитесь или попросите помочь за оплату кого-то. Это будет и быстрее и проще. Меньше нервов и не будете учиться устарелым вещам. Зачем забивать мозг этой ерундой.

    Вопросы так же лучше задавать на официальном форуме русскоязычном. Раздел первой версии. Там люди сидят именно использующие этот фреймворк. Где-то даже профи. https://www.yiiframework.ru/forum/viewforum.php?f=3
  • Как правильно вызвать виджет со следующими данными в yupe?

    myks92
    @myks92 Куратор тега Yii
    on_click, сложно же вам будет))

    <?php
      $this->widget('application.modules.user.widgets.UsersList', array(
        'condition' => array(
          'limit' => 12, 
          'together' => true, 
          'group' => 't.id',
          'category.id’ => ‘cid’ //159
        ),
      ));
    ?>


    Condition обычный sql запрос.

    https://touchit.com.ua/post/primery-ispolzovanija-...
  • Как правильно вызвать виджет со следующими данными в yupe?

    myks92
    @myks92 Куратор тега Yii
    У вас в виджета нет cid. Его нужно передавать в condition. cid Это ID contest как я понял. Надо его применять в запросе из базы. Но я не понимаю зачем он нужен. У вас в запросе он никак не фигурирует. Попробуйте без него. Выдаст ли ошибку
  • Как правильно вызвать виджет со следующими данными в yupe?

    myks92
    @myks92 Куратор тега Yii
    on_click, а где сам то запрос. Как его вызываете? Виджет это совмещение контроллера, отображение и бизнес логики. Грубо говоря вся суть MVC в одном месте.

    В вашем случае это может выглядеть так:
    Передаём конфигурацию. Например нам нужно вывести 6 статей.

    В бизнес логике виджета делаем запрос с лимитом 6 . Получаем 6 строк из базы. Перебираем массив и отображаем данные через view или return.

    У вас вроде бы все правильно реализовано на первый взгляд.

    Теперь об ошибке:
    Она пишет вам то что есть. Не определено свойство. Покажите весь виджет или его свойства. Вам помогут. Возможно это свойство по другому как-то передаётся в виджет.
  • Архитектура приложения. Как сделать независимые модули (сервисы)?

    myks92
    @myks92 Куратор тега Yii
    vitaly_74, поверьте. То что требовалось) Модуль - независимый пакет. Он должен быть независим. А это реализуется чаще всего абстракцией и сосредоточением кода в одной папке без торчания наружу.
  • Как провести сохранение связанных моделей?

    myks92
    @myks92 Куратор тега Yii
    Михаил Балагура, у вас же написано в ошибке accept_id не может быть null. Передаётся null значение.
  • Как правильно реализовать передачу данных в gridview yii2?

    myks92
    @myks92 Куратор тега Yii
    У вас сам массив не очень хороший. Ключи с названиями русскими так себе тема. И зачем вам вложенный массив со значением string(29) "(не установлено)".

    Чтобы избавится от такого лучше использовать классы
  • Как правильно реализовать передачу данных в gridview yii2?

    myks92
    @myks92 Куратор тега Yii
    freshik312, всё не правильно))
    1. attributes - есть только в DetalView. В GrigView нет такого. Это был пример из проекта, а не конкретно под ваш случай.
    2. У вас массив имеет вложение.
    3. Ваш массив не ассоциативный. У вас нет ключа $attribute['id'].

    Вместо атрибутов у вас должно быть "columns". Если работать только с вашим массивом, то выглядеть это может так:
    <?=
    
                $columns = [
                    [
                        'attribute' => 'discipline_id',
                        'value' => 'discipline.name',
                        'contentOptions' => ['class' => 'align-middle'],
                    ],
                    [
                        'attribute' => 'title_number',
                        'contentOptions' => ['class' => 'align-middle'],
                    ],
                ];
    
                echo GridView::widget([
                    'dataProvider' => $dataProvider,
                    //'filterModel' => $searchModel,
                    'tableOptions' => ['class' => 'table table-sm'],
                    'headerRowOptions' => ['class' => 'text-center'],
                    'rowOptions' => function (Registration $model, $key, $index, $grid) {
                        return array_merge(['class' => 'text-center']);
                    },
                    'columns' => array_merge($columns, array_map(function (array $attribute) {
                        return [
                            'label' => $attribute['Срок гарантии (лет.)'], /// выведет 15 
                        ];
                    }, $data['attributes'][0])),
                ]); ?>


    Но для таких вещей вообще лучше отказаться от GridView и рисовать обычные таблицы. Вот как это может выглядеть, только с применением twig шаблонизатора. Точно так же можно сделать без него. Используя foreach if...

    <div class="box">
            <div style="overflow: auto">
                <table class="table table-bordered table-hover mb-0">
                    <thead>
                        <tr>
                            <th></th>
                            {% for role in roles %}
                                <th style="text-align: center">
                                    <a href="{{ path('work.projects.roles.show', {'id': role.id}) }}">{{ role.name }}</a>
                                    ({{ role.memberships_count }})
                                </th>
                            {% endfor %}
                        </tr>
                    </thead>
                    <tbody>
                        {% for permission in permissions %}
                            <tr>
                                <td>{{ permission|trans({}, 'work_permissions') }}</td>
                                {% for role in roles %}
                                    <td style="text-align: center">
                                        {% if permission in role.permissions %}
                                            <span class="fa fa-check"></span>
                                        {% endif %}
                                    </td>
                                {% endfor %}
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>


    Я вам показал два способа решения вашей проблемы. А код за вас уже писать некто не будет))
  • Как правильно реализовать передачу данных в gridview yii2?

    myks92
    @myks92 Куратор тега Yii
    freshik312, дак вы не спрашивайте, а попробуйте..)) Я вам показал пример с AR. Если у вас просто массив данных использование будет так:
    'attributes' => array_map(function (array $attribute) {
        return [
            'label' => $attribute['id'],
            'value' => $attribute['name'],
        ];
    }, $data['attributes']),
  • CQRS. Как выводить созданную запись?

    myks92
    @myks92 Автор вопроса
    Иван Шумов, кстати. Сейчас в голову пришла одна мысль по этому решению. Можно ведь использовать UUID, который генерируется заранее и уже передается в команду, а потом делается редирект на этот UUID