====== Шаг3.4 Управление списком пользователей ====== Одна из основных функций пакета CMS, это панель управления. Попасть в нее можно по адресу http://sitename/admin (логин: admin, пароль: secret). На этом шаге мы построим CRUD-интерфейс для управления пользователями. ===== Создание контроллера для панели управления ===== Для начала создадим контроллер для нашей страницы. Все контроллеры панели управления будут иметь префикс Admin - это позволяет использовать встроенный в пакет CMS функционал по ограничению доступа (см. lmbCmsAccessPolicyFilter). Файл shop/src/controller/AdminUserController.class.php: По суди единственное, что нам нужно сделать - указать класс, с которым работает контроллер. Остальная функциональность уже содержится в lmbAdminObjectController и работает на основе соглашений: * Список объектов doDisplay(): * коллекция объектов подставляется в шаблон в переменную 'items' * сортировка задается параметром 'sort' запроса, направление - параметром 'direction' * Создание и редактирование объекта doCreate(), doEdit(): * объект подставляется в шаблон в переменную 'item' * форма называется 'object_form' (перекрывается свойством $_form_name) * запрос является POST-запросом * все пришедшие данные импортируются в объект, как обычные строки * Удаление объекта doDelete(): * идентификаторы удаляемых объектов приходят в параметре 'ids' ===== Шаблоны ===== Пожалуй, мы начнем с изучения шаблонов, которые будут использоваться на многих других шаблонах в панели управления и на фронтальной части. Это шаблоны: * **pager.phtml** - пейджер для постраничного вывода (limb/cms/template/_admin/pager.phtml) * **form_errors.phtml** - список ошибок валидации форм (limb/cms/template/_admin/form_errors.phtml) Подробнее о тегах pager и paginate можно прочитать разделе [[limb3:ru:packages:macro:pagination|"Постраничный вывод данных в MACRO-шаблонах"]]. ==== Шаблон списка пользователей ==== {{wrap with="admin_page_layout.phtml" in="content_zone"}} {{include file="_admin/selectors.phtml"/}} {{include file="_admin_object/actions.phtml"/}}
{{list using="{$#items}" as="$item" counter="$counter" parity='$parity'}}
{{list:item}} {{/list:item}} {{list:empty}}
Empty
{{/list:empty}}
#ID Name Login Email Address Actions
{$item.id} {$item.name} {$item.login} {$item.email} {$item.address|raw|nl2br} {{apply template="object_action_edit" item="{$item}"/}} {{apply template="object_action_delete" item="{$item}"/}}
{{/list}}
{{/wrap}}
Поясним некоторые моменты: * $#items (алиас к $this->items) добавлен в шаблон базовой реализацией экшена doDisplay(), описанной в файле **lmbAdminOjectController**. * Чтобы не писать лишний раз пейджер для панели управления, мы воспользовались имеющимся в пакете CMS, передав туда коллекцию продуктов. Сам файл с пейджером (_admin/pager.phtml) мы подключили при помощи тега [[limb3:ru:packages:macro:tags:core_tags:include_tag| {{include}}]]. * Для создания ссылок мы используем тег [[limb3:ru:packages:macro:tags:lmb_request_tags:lmb_route_url_tag| {{route_url}}]] * При помощи тега [[limb3:ru:packages:macro:tags:list_tags:list_tag| {{list}}]] и [[limb3:ru:packages:macro:tags:list_tags:list_item_tag| {{list:item}}]] выводятся списковые данные. * Фильтр [[limb3:ru:packages:macro:filters#raw|raw]] в выражении {$item.address|raw|nl2br} применяется для того, чтобы отменить действие фильтра html, который применяет фунцию htmlspecialchars для значения выводимой переменной. Фильтр [[limb3:ru:packages:macro:filters#nl2br|nl2br]] используется для применения функции nl2br (new line to %%
%%) к выводимой переменной {$item.description}. * Для вывода возможных действий(редактирование и удаление) мы воспользовались тегом [[limb3:ru:packages:macro:tags:core_tags:apply_tag| {{apply}}]]. Использованные нами "куски" шаблонов можно посмотреть в файле **limb/cms/template/_admin_object/actions.phtml**. Основная их особенность в том, что вместо перезагрузки всей страницы, они выводят модальное окно. Дополнительная информация о том, как данные из %%ActiveRecord%%-ов попадает в шаблоны доступна в разделе [[limb3:ru:packages:active_record:in_macro_templates|Использование ACTIVE_RECORD в шаблонах MACRO]]. Предупреждение: некоторые вещи пока вам могут быть незнакомыми! ==== Шаблоны для создания и редактирования пользователей ==== {{wrap with="admin_modal_page_layout.phtml" into="content_zone"}} {{form id='object_form' name='user_form' method='post' enctype="multipart/form-data"}}

Create user

{{include file='_admin/form_errors.phtml'/}} {{include file='admin_user/include/form_fields.phtml'/}} {{include file='_admin/form_buttons.phtml'/}} {{/form}} {{/wrap}}
Обратите внимание, что в качестве базового шаблона мы используем не admin_page_layout, а admin_modal_page_layout, который адаптирован для вывода внутри модального окна. Файл shop/admin_user/edit.phtml: {{wrap with="admin_modal_page_layout.phtml" into="content_zone"}} {{form id='object_form' name='object_form' method='post' enctype="multipart/form-data" runat='server'}}

User «{$this->item.name}»

{{include file='_admin/form_errors.phtml'/}} {{include file='admin_user/include/form_fields.phtml'/}} {{include file='_admin/form_buttons.phtml'/}} {{/form}} {{/wrap}}
Подробнее об тегах форм в разделе [[limb3:ru:packages:macro:form_tags|"Теги форм и элементов форм"]]. Так как поля для обоих форм одинаковые, мы решили вынести их в общий шаблон **form_fields.phtml** Файл shop/template/admin_user/include/form_fields.html:
{{include file="user/include/form_fields.phtml"/}}
{{label for="name"}}Password:{{/label}}
{{input name='password' type='text' title='Password'/}}
Некоторые особенности форм на панели управления: * Мы использовались автогенерацией вкладок. Элементы списка внутри div, с классом 'tabs', преобразуются во вкладки. Так, например, вкладка с id=properties берет содержимое из div с id=tab_properties. * вместо hashed_password у нас есть поле password, которое, как мы помним хэшируется перед сохранением объекта ==== Добавление ссылки в навигацию ==== Чтобы добавить ссылку в панель создадим файл **shop/settings/navigation.conf.php** со следующим содержимым: "Users", "url" => "/admin_user/", "icon" => "/shared/cms/images/icons/user.png", ); ===== Далее ===== Следующий шаг - [[.step4|"Шаг4. Создание и отображение списка товаров для администраторов"]]. Мы создадим для администраторов сайта список товаров с разделением на страницы, сделаем формы для создания нового товара и редактирования старых, реализуем действие для удаления товаров.