У меня есть следующие таблицы:
users (id, username, ... )
roles (id, name)
roles_users (user_id, role_id)
Мне интересно, как я могу создать хороший вид сетки user-role из того, что администратор может использовать для эффективного администрирования ролей для пользователей. Мне бы хотелось, в основном, таблица с полными ячейками вроде:
Login Editor Admin
Alice ■ ■ ■
Bob ■ □ □
Carol ■ ■ □
[Apply]
Генерация таблицы не слишком важна, но я очень не уверен, как ее обрабатывать, когда речь идет о том, как назвать все флажки и особенно читать и обновлять базу данных не слишком неуклюжим способом. У кого-нибудь есть хороший совет или указатели на то, как это сделать в основном чистым способом?
Я использую структуру Kohana 3, если есть что-то там, что может сделать это еще проще, но я, конечно, приветствую любой ответ.
roles
содержит
оба поля name
и description
,
используйте его для создания флажков.
Login Editor Admin
Alice ■ □ ■ [Apply]
ORM в Ko3 не поддерживает "волшебство"
HABTM и обеспечить
add()
/has()
/remove()
методы работы
с отношениями "многие ко многим". Так что вы
должен сначала вызвать remove(), чтобы удалить
старые настройки (здесь мой fix для remove()
метод для удаления всех ролей одновременно),
а затем вызовите add()
для каждой новой роли. Другой способ
перебирать роли и
проверьте каждую роль с помощью
$user->has('role', $role)
.
Слишком много запросов для меня:) Вы можете
хранить оригинальные роли пользователей и
рассчитать diffs ($removed_roles
и
$new_roles
) перед сохранением. Использовать БД
Query Builder для удаления
$removed_roles
и добавьте $new_roles
(2 запроса max).
PS. Да, мой английский сосет, я это знаю;)
Я сделал что-то подобное с Kohana2. Используя свои модели для пользователя и роли, настройка роли для пользователя была такой же простой, как $user->roles = $rolesArray
. Тогда $user->save()
знал, что нужно обновлять/вставлять автоматически.
Способ присвоения флажков - name="userid[]" value="roleid"
, поэтому name="1[]" value="2"
. Они будут отображаться в виде php-массивов в форме для каждого пользователя. Затем вы можете сделать их в массивы и назначить их каждому пользовательскому объекту.
array_diff()
) и удалите или вставьте соответственно.