• Как работают relation property в YII2?

    qonand
    @qonand
    Software Engineer
    Если реляция вызывается как метод - возвращается ActiveQuery, если как свойство - возвращается результат выполнения ActiveQuery
    В BaseObject есть метод __get()

    А BaseObject тут причем? ActiveRecord содержит приличную цепочку наследования, Вы лучшее ее изучите, например вот
    Ответ написан
    Комментировать
  • Как сделать сложную форму из нескольких полей + Ajax?

    qonand
    @qonand
    Software Engineer
    В общем случае:
    1. Получаете количество блоков, для каждого блока с помощью JS клонируете инпуты, инициализируете виджеты, добавляете новые инпуты в js-объект формы
    2. А тут в чем проблема?
    3. Для сохранения реализовываете табличный ввод
    Ответ написан
  • Если бы в интерфейсе можно было реализовывать желаемые методы без необходимости реализации в наследниках, то были бы тогда нужны абстрактные классы?

    qonand
    @qonand
    Software Engineer
    Что бы понять в чем разница между абстрактными классами и интерфейсами для начала стоит немного отойти от их реализации для конкретного языка программирования и понять их суть.
    Что такое интерфейс? это спецификация взаимодействия внешнего мира с объектом. Обратите внимание именно ВЗАИМОДЕЙСТВИЯ, а не реализации.
    Возьмем для примера обычный класс, описывающий какой нибудь выключатель (т.е. задача такого класса включать или выключать какое-то устройство):
    public class Switch 
    {
        public void On()
        {
            // тут предполагается куча кода для включения устройства
        }
    	
        public void Off()
        {
            // тут предполагается куча кода для выключения устройства
        }
    }

    Что входит в состав данного класса:
    1. РЕАЛИЗАЦИЯ функционала включения/выключения устройства (т.е. куча кода который управляет устройством)
    2. ИНТЕРФЕЙС (сигнатура методов On и Off), с помощью которого клиенты класса взаимодействуют с ним.
    Вы можете спокойно управлять объектом этого выключателя, опираясь на его интерфейс, зная что есть метод On отвечающий за включение и метод Off отвечающий за выключение. Но теперь представьте что у Вас десятки разных типов выключателей с разной реализацией и над классом для каждого типа работает отдельный разработчик. Как сделать Ваш алгоритм управления универсальным и независимым от конкретного типа выключателя? Для этого нужно что бы у выключателя в независимости от его типа был одинаковый интерфейс (грубо говоря присутствовал метод On и метод Off). Но как разработчикам классов-выключателей знать что Вам нужен именно такой интерфейс? а если они и знают как заставить их его в точности соблюсти? Согласитесь было бы удобно, если бы была возможность, где-то отдельно описать интерфейс (формализовать его), на который можно было бы опираться при взаимодействии с выключателями, а другие разработчики просто бы его подключали и реализовывали. Вот тут на помощь уже и приходить отдельная конструкция interface, которая позволяет этого добиться. Вы можете сделать так:
    public interface ISwithable
    {
        public void On()
    	
        public void Off()
    }

    это позволит Вам работать исключительно с интерфейсом, не парясь о конкретных реализациях, а так же сторонним разработчикам четко соблюдать необходимые Вам правила.
    Теперь давайте обсудим что же такое класс. Как видно из примера класс это реализация определенного интерфейса и непосредственно конкретного функционала. А чем отличается абстрактный класс от обычного? тем что он позволяет сделать отложенную реализацию части функционала, т.е. переложить ответственность за реализацию на своих потомков. Но тем не менее он по прежнему не только реализовывает интерфейс но описывает функционал. Конечно можно с помощью абстрактного класса сделать некую имитацию только интерфейса сделав все методы абстрактными, но это не совсем правильно т.к. задачи абстрактного класса в первую очередь - это создание возможностей отложенной реализации конкретного функционала.
    Ответ написан
    Комментировать
  • Как произвести выборку из двух таблиц с условием?

    qonand
    @qonand
    Software Engineer
    если правильно понял задачу тогда так:
    SELECT prod_name,
           prod_description
    FROM tb_product
    WHERE prod_nomenclature IN
        (SELECT comm_product_nomenc
         FROM tb_comm
         WHERE comm_user_id=1)

    где 1 это идентификатор текущего пользователя
    Ответ написан
    Комментировать
  • Как избежать коллизии access_token?

    qonand
    @qonand
    Software Engineer
    Нужно ли добавлять к это методу логин или это проблемы можно как то избежать?

    Аутентификация по токену для того и нужна что бы передавать только один токен без всяких логинов. Поэтому добавлять к методу логин явно нет смысла. Есть смысл разработать алгоритм генерации токена уменьшающий вероятность коллизий и предусмотреть варианты их решения (например производить перегенерацию токена в случае коллизии)
    Ответ написан
    Комментировать
  • Не найден класс Yii2?

    qonand
    @qonand
    Software Engineer
    И вот сел на Yii2. 3й день пытаюсь подключить - безрезультатно. Накачал кучу классов, накомпозил кучу проектов - то namespacы вылазят, то класс не находит. Если кто знает верное решение - поделитесь плиз

    Так может стоит перед тем как садиться документацию полистать? в которой четко сказано

    Yii relies on the class autoloading mechanism to locate and include all required class files. It provides a high-performance class autoloader that is compliant with the PSR-4 standard
    ознакомится с стандартом автозагрузки классов и разобраться как работают пространства имен?
    Ваши ошибки связаны с незнанием этого, некоторые решение уже предложили slo_nik и Андрей Саныч . Но тем не менее Вам все равно стоит почитать и разобраться с пространствами имен, если не хотите сталкиваться с подобными проблемами на каждом шагу
    Ответ написан
    Комментировать
  • Как правильно изменить модель User (IdentityInterface) в Yii2?

    qonand
    @qonand
    Software Engineer
    мне необходимо сделать способ авторизации через другую таблицу, не используя RBAC

    RBAC ни каким образом не влияет на авторизацию
    Т.е. каким способ подключить вторую таблицу для проверки, наличия оплаты у этого пользователя?

    Через обычную реляцию. В Вашем случае User это наследник стандартного ActiveRecord, просто реализующий методы определенные в интерфейсе IdentityInterface. Поэтому никто Вам не запрещает работать с классом как с обычным ActiveRecord
    Ответ написан
    1 комментарий
  • Как написать запрос для поиска совпадений в одной таблице?

    qonand
    @qonand
    Software Engineer
    SELECT 
        think_id, 
        count(*) as cnt 
    FROM 
        tablename 
    GROUP BY 
        think_id 
    HAVING 
        cnt > 1
    Ответ написан
    Комментировать
  • Скажите, какие(ая) есть книги(а) по основам программирования (алгоритмы, структура данных, ООП и т.д.)?

    qonand
    @qonand
    Software Engineer
    ООП
    Бертран Мейер. "Объектно-ориентированное проектирование программных систем"
    Гради Буч “Объектно-ориентированный анализ и проектирование с примерами приложений”

    Алгоритмы / структуры данных
    Томас Кормен "Алгоритмы построение и анализ"
    Генри Уоррен "Алгоритмические трюки для программистов"
    Николас Вирт "Алгоритмы и структуры данных"
    Дональд Кнут "Искусство программирования"
    Ответ написан
    Комментировать
  • Yii2. Как подключить модель?

    qonand
    @qonand
    Software Engineer
    Что я делаю не так? =)

    Все... Вам не мешало бы разобраться с ООП хотя бы на уровне PHP
    public function getLangPosts()
    {
        return $this->find();
    }

    тут Вы вызываете статический метод find, как обычный это не правильно. Да и вообще не понятно зачем этот метод существует
    public function getDataPosts(){
        $language = Yii::$app->language;
        $data_lang = $this->getLangPosts()->where(['lang'=>$language])->one();
        return $data_lang;
    }

    а тут Вы обращаетесь к методу getLangPosts() модели LangPost, при чем делаете это из модели Post через псевдо-переменную $this. $this хранить текущий объект, а в Вашем случае это объект класса Post который не имеет метода getLangPosts().

    Сделайте getLangPosts статическим методом и работайте с ним как с статическим методом, например:
    app\models\LangPost
    public static function getLangPosts()
    {
        return static::find();
    }

    app\models\Post
    public function getDataPosts(){
        $language = Yii::$app->language;
        $data_lang = LangPosts::getLangPosts()->where(['lang'=>$language])->one();
        return $data_lang;
    }
    Ответ написан
  • Yii2 gridview: как сделать вывод через rightjoin?

    qonand
    @qonand
    Software Engineer
    1. Для начала реализуйте связь между таблицами
    2. Загружайте данные с помощью жадной загрузки
    3. Атрибут для нужной колонки определяйте в формате <Название связи>.<Название атрибута связанной модели> например: 'BannerCourses.course_id'
    Ответ написан
  • Почему не работает timestamp в behaviors время создания и изменения?

    qonand
    @qonand
    Software Engineer
    Это с какого файла кусок кода? Такое впечатление что Вы подключаете TimestampBehavior к контроллеру а ждете что он примениться к модели
    Ответ написан
  • Как сделать в GridView редактирование в таблице?

    qonand
    @qonand
    Software Engineer
    Скорее всего у Вас ошибки в экшене сохранения. Смотрите в Firebag и логи Yii.
    Ответ написан
  • Как узнать файл и номер строчки с ошибкой в консоли?

    qonand
    @qonand
    Software Engineer
    Смотрите в логе Yii, там содержится более подробная информация о возникших исключениях. А в консоль не выводиться скорее всего из-за того что у Вас dev-режим включен или какие-то проблемы с настройками логирования, более подробно сказать сложно не видя конфигов приложения
    Ответ написан
    Комментировать
  • Какой шаблон проектирования больше подходит для загрузки связанных сущностей?

    qonand
    @qonand
    Software Engineer
    1. Как-то у Вас сущности живут отдельной жизнью друг от друга. По сути сейчас Вы перенесли структуру своей базы данных на объекты, а это не правильно. Сущность заказа должна агрегировать в себя сущности позиций заказа и покупателя, а не просто содержать их идентификаторы. Например:
    class OrderEntity
    {
        /**
         * @var integer Идентификатор заказа
         */
        protected $id;
        
        /**
         * @var MemberEntity Объект покупателя
         */
        protected $member;
        
        /**
         * @var ItemEntity Массив позиций заказа
        protected $items = [];
    }

    2. Получение данных из базы данных в объект должно быть реализовано в каком-нибудь репозитории или в каком-нибудь датамаппере. Почитайте про эти паттерны. Но вообще лучше взять какую-нибудь вменяемую ORM что бы избежать кучи гемора.
    3. По названиям классам - не добавляйте в них суфикс Entity, код становиться из-за этого более нагроможденным, лучше используйте пространства имен
    Ответ написан
    3 комментария
  • КАк организовать панельку новичку в Yii2?

    qonand
    @qonand
    Software Engineer
    Для реализации навигации по таблицам (а насколько я понимаю Вы именно ее пытаетесь сделать) лучше использовать не кнопки, а стандартный Tabs или какой-нибудь его аналог позволяющий делать Ajax-загрузку
    Ответ написан
    2 комментария
  • В какой сущности хранить результаты игры?

    qonand
    @qonand
    Software Engineer
    Результат игры это часть информации о игре, а не пользователе. Результат игры в свою очередь состоит из информации о том сколько очков у каждого пользователя. Соответственно результат игры должен быть отдельной сущностью входящую в состав сущности "Игра"
    Ответ написан
    Комментировать
  • Как получить ссылку вида /action/slug, а не action?slug=slug через URL::to(0 в Yii2?

    qonand
    @qonand
    Software Engineer
    Ваши проблемы вызваны приоритетом выполнения url-правил. Для решения проблемы просто измените их порядок:
    'rules' => [
        '' => 'site/index',
        '/album/<slug:[a-z0-9_\-]+>' => '/site/album',
        '<action>' => 'site/<action>',
        '<controller>' => '<controller>/index',
    ],
    Ответ написан
    1 комментарий
  • Используются ли паттерны-проектирования при написании бизнес-логики в MVC-фреймворке?

    qonand
    @qonand
    Software Engineer
    Вот я думал, что в фреймворках уже ты не можешь писать паттерны-проектирования, так как ты уже пишешь в MVC-паттерне, но услышал что можно и других использовать.

    Без разницы используется ли MVC или нет, это такой же паттерн как и остальные. А практически любые паттерны можно комбинировать. Поэтому использовать можно и нужно (если есть необходимость)
    Так ли это и какие обычно используются?

    Паттерн это готовый способ решения какой-то задачи. Соответственно какой паттерн где использовать зависит только от задачи.
    Ответ написан
    Комментировать
  • Как заставить работать swiftmailer из консольного контроллера в Yii2?

    qonand
    @qonand
    Software Engineer
    скорее всего у Вас в конфигурации консольного приложения (в файле config/console.php) не определен или не правильно настроен компонент mailer
    Ответ написан
    2 комментария