?

Log in

Deflators в FormFu - Catalyst Web Framework
The elegant MVC framework

User: ru_catalyst (posted by cityfeet)
Date: 2010-04-05 14:51
Subject: Deflators в FormFu
Security: Public
Здравствуйте.

Моя задача:
В базе данных в таблице есть поле типа SET. Хочется иметь для каждого элемента этого множества свой checkbox, которые были бы объединены в checkboxgroup.

В конфиг-файле формы я сделал такое поле:
<elements>
    name        flags
    type        Checkboxgroup
    label       Flags
    deflators   "+xxx::yyy::flags"
    <options>
      value     r_view
      label     user can view
    </options>
    <options>
      value     r_create
      label     user can create
    </options>
</elements>

xxx::yyy:flags - мой класс дефлятора, наследует от HTML::FormFu::Deflator. В него в качестве параметра поступает строка с флагами (например, "r_view,r_create"), установленными для данного row таблицы. Дефлятор должен сделать каждый чекбокс помеченным/непомеченным в зависимости от флагов.

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

Core дефляторы, которые выполняют похожую функцию (например, CompoundSplit), используют для каждого поля, которое они меняют, функцию $field->default(...). Но в checkboxgroup каждый чекбокс - это не field и вообще не класс, а просто хеш (не blessed). Так что не получается вызвать для каждого чекбокса функцию default.

Может, есть готовый пример на эту тему? Или какие-нибудь соображения?
Возможно, я вообще не тем путём пошёл, и это нужно делать не через инфляторы/дефляторы, а как-то по-другому?
Post A Comment | 4 Comments | Share | Link






iMesto
User: imesto_service
Date: 2010-04-05 14:13 (UTC)
Subject: (no subject)
Может проще было бы заюзать HTML::FormFu::Model::DBIC ( если въехать, то сильно упрощает и ускоряет процесс ) и:

1) для юзера в БД сделать флаги типа:
can_edit UNSIGNED INT(1), etc?

или

2) создать таблицы role, user_role по типу: http://search.cpan.org/~mramberg/Catalyst-Runtime-5.7001/lib/Catalyst/Manual/Tutorial/Authentication.pod#Add_Users_and_Roles_to_the_Database
Reply | Thread | Link



User: cityfeet
Date: 2010-04-05 21:00 (UTC)
Subject: (no subject)
П.2 уже сделан, именно для аутентификации и авторизации. П.1 - это, фактически, эмуляция типа SET, только нерационально. Одна колонка типа SET позволит сделать до 64-х флагов, а так на каждый флаг отдельная колонка.

В принципе, любые флаги можно сделать по типу ролей. Одна таблица - записи, для которых требуются флаги (вместо юзеров). Другая - флаги (вместо ролей). И третья для их связи. Но это всё как-то чересчур громоздко. К тому же, не понятно, как просто искать записи по комбинации флагов (например, все записи, где выставлены одновременно флаги A и B) - только последовательно, флаг за флагом.
Reply | Parent | Thread | Link



iMesto
User: imesto_service
Date: 2010-04-05 21:19 (UTC)
Subject: (no subject)
Поиск это нужно просто почитать DBIx::Class::ResultSet, DBIx::Class::Cookbook и SQL::Abstract. Запросы можно составлять любой сложности: join, group_by, having, order_by. Если БД верно спроектирована, то про SQL в коде можно забыть.

Вы уже сделали роли для пользователей ввиде отдельной таблице, то в чем проблема аналогично сделать флаги для "записей" и не мучаться потом со "слепкой" разных подходов.

Проще же потом будет манипулировать флагами в их связи с теми же ролями.

Но дело Ваше конечно )
Reply | Parent | Thread | Link



User: cityfeet
Date: 2010-04-05 21:04 (UTC)
Subject: (no subject)
Кстати, вопрос уже решён, но по-другому. Достаточно было использовать дефлятор Callback и в в колбечной функции просто отсплитить строку в массив. Остальное делается автоматически, хотя я нигде в документации ничего на этот счёт не нашёл.

Но всё равно хочется понять, как изменить форму из дефлятора.
Reply | Parent | Thread | Link



browse
my journal
links
June 2011