Как стать автором
Обновить

Комментарии 26

Спасибо за статью. Как раз недавно начал изучать Yii2 и сегодня мне надо было сохранять связь many-to-many.
У меня не захотел устанавливаться пакет. Поборол вот таким образом:
"require": {
    ...
    "voskobovich/yii2-many-many-behavior": "@dev"
}
Какая именно была ошибка? Можно попробовать разобраться.
Правильно ли я понял, что для каждого релейшна необходимо создавать дополнительный атрибут модели? Не думаю, что это удобно.
Ты правильно понял и я с тобой полностью согласен.
Через пару дней устраню это неудобство и сделаю поведение более гибкое)
Возможно, из аналогичного решения для YII1 удастся почерпнуть идеи. Был только полжительный опыт использования данного экстеншна.
К сожалению (или к счастью) Yii2 сильно отличается от первой Yii1. Другая реализация связей и перенимать от туда что-либо сложно)
Давайте я выкачу новую версию, а аудитория уже выскажет свое мнение)
А почему стиль фигурных скобок (вернее их отсутствие) из Yii1 +)?
Что ты имеешь ввиду?
да вообще никакие современные стандарты код стайла не используются. слившиеся со скобками if'ы, if'ы без скобок, переменные не по psr-2.
Мне не нравится современные кодстайлы. Читать такой код не совсем удобно.
Я считаю, что если PHP позволяет опустить скобки — значит этим нужно пользоваться.
Чем меньше символов в файле, тем быстрее и легче он анализируется глазами, разве не так?
Точно так же и пространство между строками кода. Чем просторнее и логичнее разделен на блоки код, тем меньше напрягается зрение для анализа и понимания алгоритма.

Когда я писал поведение, я не думал его публиковать вот и оформил не по стандартам.
Со следующим обновлением сделаю форматирование кода по стандарту)
Про отступы между строк согласен, про фигурные скобки нет. Даже Yii team перешли на скобки и на то есть причины.
А можно услышать эти самые причины по которым они перешли на скобки?

Я считаю, что если уж и ставить скобки, то только так, чтобы они были на одной вертикали.
Потому что искать открывающую скобку по диагонали при теле if`a в 20 и больше задача для глаз не из легких.
С вертикальным размещением все на порядок проще + IDE подсвечивает. Веди вверх взгляд и ищи светящуюся скобку)
Что скажешь?
Как минимум если в условие, записанное без фигурных скобок, потребуется добавить еще одно выражение (строку) — придется не забыть добавить те самые фигурные скобки, иначе можно долго ловить баги (проверено на практике). IDE подсвечивает фигурные скобки (парные) если даже все выражение записано в одну строку +)
Я лишь говорю что, если фигурные скобки расположены на одной вертикали, то проще найти их пару. Согласен?
Если взять во внимание, что условия это примерно 65% всего кода, то простота нахождения пары условий должна быть максимальной)

Про забывания поставить скобки и баги… не замечал. IDE же форматирует код так, что не заметить такую оплошность нельзя (PhpStorm).

Ты можешь писать как угодно и каким хочешь почерком, главное чтобы потом было удобно читать)
Я студент и мне знакома ситуация, когда на паре писал и было все понятно, а при подготовке к экзамену материшься на свой же почерк)
Я лишь говорю что, если фигурные скобки расположены на одной вертикали, то проще найти их пару. Согласен?

Неа. Не вижу особой разницы.

IDE же форматирует код так, что не заметить такую оплошность нельзя (PhpStorm).

Я вот про это:
if($a == 5)
    $b = 10;
    $c = 15;


главное чтобы потом было удобно читать)

На все 100 +)
Мой PhpStorm пишет вот так:
if($a == 100)
	$a = 300;
$b = 5;

если писать сперва первую строку, потом вторую строку и третью)

Дискуссия хороша, но не имеет смысла. Против общепризнанных стандартов я идти не собираюсь)
Я тоже бываю не прав и сейчас как раз такая ситуация.
Раз я пишу публичное расширение для проекта то должен соблюдать кодстайл принятый в проекте!
Не так. Текст воспринимается тем быстрее и легче, чем он будет более стандартен и, соотвественно, привысен. В китайском, например, символов очень мало. Но ведь это не делает тексты на китайском более простыми к восприятию для тех, кто на китайском не пишет.
Спасибо за начинание! Очень не хватает такого поведения, а раз за разом повторять один и тот же код не хочется.

А почему не github? Вероятность, того что вам помогут с разработкой на github'е гораздо выше чем на Bitbucket'e

Лучше скачать/обновить только новую зависимость, а не все зависимости:
# php composer.phar update voskobovich/yii2-many-many-behavior


Для новой версии лучше всего сделать отдельную ветку от master'а, и по готовности влить ее в масте. Сейчас я не могу скачать и начать пользоваться сразу — приходится тратить время на разбирательства почему не работает и откатываться к рабочему коммиту.

P.S. Жду рабочую новую версию :) Попробовал, что такое делать pull-реквесты на Bitbucket'е.
Не подумал, что мне могут помочь с разработкой. На Bitbucket у меня все приватные репо и по традиции…
Но, я перееду на github, раз такое дело)

И с версиями я тоже намудрил, делаю тэгами, а надо ветками.
Все исправлю!
Попытался использовать первую версию поведения, мне не хватает возможности сохранить пустой список — т.е. удалить текущие связи, а новых не создавать (т.к. пришел пустой массив id'шников). Также удобно было бы, чтобы была возможность для новых моделей иницализировать список связей вручную (например, я перешел по ссылке «создать продукт в этой категории»).
Не совсем понял, второй пункт «Также удобно было бы, чтобы была возможность для новых моделей иницализировать список связей вручную (например, я перешел по ссылке «создать продукт в этой категории»).» — можно еще пример?

Про удаление связей вообще — хорошая идея. Учтем.
Сейчас я работаю над поддержкой остальных типов связи: has many и has one.
Залью код в новую ветку.

Переехал на GitHub: ManyToManyBehavior. Буду ждать PullRequest`ов.
Usecase: Я нахожусь в списке категорий товаров (у меня товар может быть сразу в нескольких категориях, many-to-many), рядом с каждой категорией есть кнопка добавить новый товар в категорию, нажимая на которую, я попадаю на страницу заполнения сведений о новом товаре. В этой форме есть возможность указать категории, к которым будет принадлежать товар, т.к. при переходе по ссылке я указал номер «первой категории» я бы хотел ее сразу показать в этом списке (т.е. фактически, вручную добавить «первую категорию» в список категорий новой модели товара).
Отличный пример. Только как в этом может помочь поведение?
Передайте ID первой категории GET параметром и потом перед отображением формы, в контроллере, запишите его
$productModel->categories_list[] = $_GET['cat_id']

Это позволит сразу выделить первую категорию в мульти-select`e, а сохраниться она в базу уже после сохранения товара)
Я так это и хочу сделать, я это к тому, чтобы была возможность так делать.
Архитектура этого не запрещает)
Поведение просто сохраняет массив ID к нужной связи, а как его формировать — уже дело каждого)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации