• Где задает layout в basic приложении YII2?

    qonand
    @qonand
    Software Engineer
    main.php - это слой используемый по умолчанию приложением, в случае если он не задан в конфиге или контроллере. Соответственно задается в компонентах Yii
    Ответ написан
    Комментировать
  • Фильтрация товаров на Yii2. Как?

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

    qonand
    @qonand
    Software Engineer
    И нужно через супер класс одним махом выводить содержание всех листов в наследниках

    Это нарушает один из основных принципов наследования: наследники должны знать о своих родителях, родители о наследниках нет. По всей видимости Вы не совсем правильно спроектировали систему если возникают задачи подобного рода. Было бы проще Вам что-то порекомендовать, если бы Вы более подробно описали суть этой части системы
    Ответ написан
    8 комментариев
  • Как сделать выборку через hasMany?

    qonand
    @qonand
    Software Engineer
    во первых: Вы неудачно подобрали названия таблиц и полей в них (и соответственно моделей)
    1. shop_city - в комментария Вы пишите что это список филиалов, а судя по названию просто таблица связей. Уж лучше заменить ее название на что-то более подходящее, например (первое что пришло в голову): shop_office
    2. shop_product_price - по названию можно сказать что это цены товаров в магазине, но если вникнуть, то оказывается что это цены товаров в ФИЛИАЛАХ МАГАЗИНА.

    во вторых: связь выбирающая магазин должна находиться не в модели Product а в модели филиалов, да и с сами названия связей выбраны не удачно - только путают.
    Т.е. в модели Товаров должна быть связь выбирающая филиалы, в модели филиала - связь выбирающая магазин

    в третьих: когда Вы наведете порядок в связях, мы можете получить необходимую информацию либо с помощью запроса
    Product::find()->with(['<название связи с филиалом>.<название связи филиала с магазином>'])

    либо, если Вам нужно вывести товары у которых есть все связи
    Product::find()->joinWith(['<название связи с филиалом>.<название связи филиала с магазином>'], true, 'RIGHT JOIN')
    Ответ написан
    1 комментарий
  • Зачем так сделано, что дальше можно сделать с кодом?

    qonand
    @qonand
    Software Engineer
    Чего именно хотел добиться предыдущий разработчик таким кодом(отсутствием связей, внешних ключей и т.д.)?

    Ничего, он просто хотел сделать и сдать свою работу. Да это полнейший говнокод, но как сказал Виталий Хоменко код скорее всего вышел таким из за опыта и возможностей разработчика. Мы все делаем проекты на основе своего опыта и навыков - то что сейчас кажется сделанным идеально, через год нам же покажется говнокодом. И тут уж ничего не поделаешь

    Опыта у меня не очень много, поэтому хотелось бы узнать мнение более опытных людей, что с этим кодом делать?
    Оставить как есть и вносить мелкие правки или всё таки предложить переписать?

    Таких проектов полным полном и нужно уметь с ними работать. Взять и переписать все с нуля для таких проектов не вариант, т.к.:
    1. Как бы код не был написан, в данный момент он выполняет свою задачу - приносит деньги клиенту
    2. Переписывание кода всегда несет за собой кучу рисков - нет гарантии что переписанный проект по коду будет лучше чем существующий (объективно, даже опытные программисты не могут это гарантировать, а если у Вас мало опыта тем более ни о каких гарантиях речи идти не может), нет гарантий что Вы учтете все тонкости предметной области (известные предыдущему разработчику)
    3. Переписывание кода всегда всегда занимает много времени, мало просто написать новый код, нужно еще протестировать что бы после этого ничего не сломалось в системе, а это порой очень проблематично

    Что бы решать что с кодом делать - нужно понимать объем правок который в него предполагается внести. Если правки мелкие - вносить их без переписывания кода, если правки прям глобальные - тогда переписывать конкретный кусок кода

    Что мне сказать заказчику по поводу правок?

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

    qonand
    @qonand
    Software Engineer
    Одним запросом Вы никак не решите эту задачу. У Вас такая модель хранения дерева категорий что здесь можно использовать только рекурсию. Хотите выбирать все одним запросом изменяйте модель хранения дерева, например на Nested Sets
    Ответ написан
    1 комментарий
  • Какой паттерн лучше использовать при необходимости реализации методов из разных классов?

    qonand
    @qonand
    Software Engineer
    Предположим, мне надо создать класс D, в котором M1 содержит реализацию класса A, а метод M2 реализацию класса B.

    Подобные проблемы возникают как правило из-за неверно спроектированных классов, в частности когда классы "берут на себя слишком много". Вам стоит описать хотя бы в общих словах что у Вас за классы и методы
    Ответ написан
    1 комментарий
  • Как правильно работать с исключениями?

    qonand
    @qonand
    Software Engineer
    Что такое исключение? это грубо говоря оповещение о том что что-то пошло не так и программный код не может полноценно отработать. Соответственно и выбрасываться оно должно в коде где произошла проблема - т.е. в вызываемом методе, а уже вызывающий код должен как-то на нее реагировать - перелавливать с помощью try-catch и что-то делать (например как-то пытаться исправить ситуацию) либо пробрасывать ее дальше...
    Ответ написан
    Комментировать
  • Как правильно реализовать метод вывода списка?

    qonand
    @qonand
    Software Engineer
    1. Для поиска одной записи по ID было бы логичным и удобным реализовать отдельный метод, например какой нибудь findOne($id). Что касается метода getAll - что содержит массив Options? Набор параметров по которым необходимо выбирать записи? если да тогда передавать это массивом, не очень хорошая практика, лучше сделать какой-нибудь объект критерию. Да и само название $options не особо удачно...
    2. Лучше называть подобные методы например find()
    Ответ написан
    2 комментария
  • Пример метода __call в PHP?

    qonand
    @qonand
    Software Engineer
    Эмуляция множественного наследования с помощью метода __call если когда-то и была - то осталась в прошлом. Большинство задач множественного наследования вполне можно решить с помощью трейтов и интерфейсов
    Ответ написан
    Комментировать
  • Правильно ли я использую класс?

    qonand
    @qonand
    Software Engineer
    Бегло посмотрев:
    1. Зачем в классе объявлены публичные атрибуты id и text если они нигде не используются?
    2. Вы везде используете $db->prepare, но локальная переменная $db не инициализирована. В этом коде Вы должны обращаться к атрибуту класса, т.е. $this->db->prepare
    3. Зачем в каждом методе делать проверку эту проверку
    if($stmt->execute(array($text))){
       return true;
    }else{
       return false;
    }

    но какой в ней смысл если $stmt->execute и так возвращает boolean, проще написать просто
    return $stmt->execute();
    4. Да и вообще в случае возникновения ошибки лучше что бы метод не false возвращал а исключение бросал, а клиенты класса уже на него как-то реагировали
    5. В методе getAll у параметра $id лучше поставить значение по умолчанию null
    Ответ написан
    1 комментарий
  • Как из конструктора класса вернуть массив?

    qonand
    @qonand
    Software Engineer
    Само по себе наличие классов еще не означает что Вы применяете ООП-подход. Ваш код как и сам вопрос говорит о полном не понимании ООП-парадигмы. Поэтому лучше разберитесь с ней, почитайте соответствующие статьи/книги, вместо того что бы "с ходу" писать кучу подобного кода. Не хотите разбираться - тогда вообще не стоит строить проект на объектах и всем что с ними связано
    Ответ написан
    Комментировать
  • Правильно ли использовать метод который не создан в данный момент?

    qonand
    @qonand
    Software Engineer
    Да это вполне нормальный подход с точки зрения ООП. Если бы Вы привели код можно было бы дать более подробный комментарий
    Ответ написан
    Комментировать
  • Как обновить запись в промежуточной таблице?

    qonand
    @qonand
    Software Engineer
    Используйте ManyToMany Behavior он решает необходимые Вам задачи
    Ответ написан
    Комментировать
  • Возможно ли удалить id из строки запроса?

    qonand
    @qonand
    Software Engineer
    Тут все зависит от того можно ли по параметрам переданным в запросе однозначно идентифицировать нужную запись. Если можно - тогда стоит написать собственное URL-правило которое будет хавать переданные параметры и на основе их определять идентификатор записи. Но стоит позаботится о кэшировании этого дела т.к. подобное правило выйдет довольно сложным
    Ответ написан
  • Свойства для getter и setter в PHP?

    qonand
    @qonand
    Software Engineer
    Это фишка Yii, связанная с тем что геттеры и сеттеры вызываются с помощью "магических" методов при обращении к атрибуту
    Ответ написан
    Комментировать
  • Зачем нужны абстрактные свойства?

    qonand
    @qonand
    Software Engineer
    Вы изначально не верно сформулировали вопрос - поэтому и не понятна его суть. Что такое свойства класса? Свойства класса - это характеристики которые его описывают. Для примера возьмем обычный класс стека, какие свойства у него есть?
    1. Он хранить в себе множество объектов
    2. У него есть информация о количестве хранимых объектов, реализуемая как правило с помощью атрибута(поля) класса
    3. У него есть возможность получение объекта по принципу "Первый вошел - последний вышел", реализуемая как правило с помощью метода

    Судя по комментариям, Вы спрашиваете про атрибуты(поля) класса - компоненты которые, описывают хранимые данные. Абстрактные атрибуты имеют такое же предназначение как и абстрактные методы, т.е. их задачи:
    - декларировать наличие атрибутов которые должны обязательно присутствовать в дочерних классах
    - "перелаживать" подробности реализации на дочерние классы. Стоит не забывать что атрибуты классов, как и методы, так же могут иметь разную реализацию - их данные могут храниться в памяти либо вычисляться на лету (и некоторые языки программирования соответственно предусматривают такие варианты реализации)
    Ответ написан
    Комментировать
  • Почему нельзя наследоваться от класса БД?

    qonand
    @qonand
    Software Engineer
    Уж извините, никого не хочу обидеть, но подобное желание наследоваться от всего подряд и отсутствие понимая почему так нельзя делать говорит о полном не понимании концепции ООП. Полноценно ответить на Ваши вопросы не возможно - не хватит поста, тут целую лекцию можно написать. Да и ответы породят только дополнительные вопросы. Поэтому лучше уделите недельку другую - и прочтите пару книг по ООП, и сразу все станет на свои места..
    Ответ написан
    Комментировать
  • Как построить запрос SELECT совмещенно с двух таблиц?

    qonand
    @qonand
    Software Engineer
    используйте join
    например:
    SELECT * FROM table1
    LEFT JOIN table2 ON table1.owner_id = table2.id
    Ответ написан
    2 комментария
  • Как получить title родителя категории в Yii2?

    qonand
    @qonand
    Software Engineer
    Что бы получить тайтл родительской категории сначала нужно получить саму запись категории. Это можно сделать с помощью еще одного джойна с таблицей категорий
    Ответ написан
    Комментировать