yiiext / nested-set-behavior

AR models behavior that allows to work with nested sets tree.
http://www.yiiframework.com/extension/nestedsetbehavior/
BSD 3-Clause "New" or "Revised" License
157 stars 64 forks source link

Добавьте noRoots noLeafs onlyLeafs scopes #22

Closed DrDeath72 closed 11 years ago

DrDeath72 commented 11 years ago

Чтоб не дергать лишние когда не надо

creocoder commented 11 years ago

Приведите пример использования.

DrDeath72 commented 11 years ago

Да банально, берем каталог товаров. С одним деревом не нужен Root ввиду его формальности для роста дерева. onlyLeaf нужны чтоб дернуть только конченые разделы в которые можно добавить товары, ну а noLeafs для полноты картины :)

creocoder commented 11 years ago

С одним деревом не нужен Root

Для одного дерева есть специальный режим работы расширения.

onlyLeaf и noLeafs "для полноты картины"

Слишком специфичная задача, чтобы добавлять это в расширение.

DrDeath72 commented 11 years ago

Для одного дерева есть специальный режим работы расширения.

Любое дерево растет из рута с left = 1, вот он то как раз при выборках и не нужен, он "системный"

Слишком специфичная задача, чтобы добавлять это в расширение.

Да не вопрос, мне не сложно 2 строчки у себя дописать, если вам не нужны возможности нужные мне

creocoder commented 11 years ago

вот он то как раз при выборках и не нужен

Его и так нет при выборках, к примеру при использовании метода descendants().

DrDeath72 commented 11 years ago

Зато есть при ancestors, да и просто при findAll order by left asc нафиг не нужен

creocoder commented 11 years ago

Зато есть при ancestors

Всё верно, потому что он там должен быть. Если он не нужен, то это частная задача и должна решаться на уровне приложения.

да и просто при findAll order by left asc нафиг не нужен

При просто findAll() тем более с таким критерием несложно ещё дописать lft!=1, если вдруг корень не нужен.

DrDeath72 commented 11 years ago

Всё верно, потому что он там должен быть. Если он не нужен, то это частная задача и должна решаться на уровне приложения.

Если бы она решалась расширением было бы гораздо удобнее

При просто findAll() тем более с таким критерием несложно ещё дописать lft!=1, если вдруг корень не нужен.

Это все приходится делать потому что по другому нельзя. А руками да, все можно, только для того оно и расширение, чтобы руками меньше писать аналоги всяких Cat::model()->noRoot()->getTree() и прочие $cat->isParent($cat2)

creocoder commented 11 years ago

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

$node->ancestors()->findAll('lft!=1');

И т.д. При желании в конкретной модели можно сделать withoutRoot() scope. Расширение не решает и не будет решать частных задач по причине их бесконечного множества. Общих задач всегда конечное количество.

P.S. Специфические задачи, которые вам кажутся типовыми другими пользователями как типовые могут не восприниматься.

DrDeath72 commented 11 years ago

Да не парьтесь, я уже привык что Yii кодеры неделю могут объяснять почему это никому не нужно, вместо пары строчек кода :)

creocoder commented 11 years ago

Это вопрос не пары строчек кода, а вопрос баланса и идеологии разработки расширений.

DrDeath72 commented 11 years ago

Ну для меня специфические задачи это дерни мне детей с названием "Утюг". А задачи дерни мне детей/родителей без/только корни/родители это 100% задачи расширения.