Версия 1,5 в значительной степени изменила всю организацию работы панели администратора: наконец-то AdminTabы были заменены нормальными контроллерами, добавлены удобные средства для их переопределения, а так же html вынесен во вьюхи.
О templates поподробнее.
Организация директорий для admin templates следующая:
- admin/themes/default/template/helpers/type_of_the_helper/
– здесь templates хелперов (типы: calendar, dataviz, form, kpi, list, modules_list, options, tree, uploader, view; наиболее популярные из них конечно же form и list) используются всегда по умолчанию, т.е когда нет перегруженных;
- admin/themes/default/template/controllers/name_of_the_controller/
: templates перегруженные в контроллере;
- override/controllers/admin/templates/name_of_the_controller
r директория для перегрузки родных(т.е. вышеописанных) templates;
Если заглянуть в контроллеры админки, то становится ясно как и когда используются эти templates.
О templates из хелперов:
Наиболее часто перегружаемые это list и form.
Список (list) используется дли вывода списка значений сущности (сама сущность, как мы помним, указывается в $this->className
). С помощью свойств и методов котроллера (например, таких как: fields_list, bulk_actions, addRowAction() и т.д.) вы можете управлять содержимым. В AdminController вызов хелпера для отрисовки списка происходит в методе renderList.
Form используется для отрисовки формы редактирования значения сущности – здесь ключевую роль играют свойства контроллера fields_form, tpl_form_vars и хелпера fields_value, submit_action и т.д.
О стандартных перегруженных темплейтах:
Достаточно большое количество темплейтов хелперов перегружено для отдельных контроллеров – это связано с необходимыми различиями в отображении сущностей.
Есть котроллеры, где совершенно по другому должны отображаться списки, заголовки, формы редактирования, как, например, products, orders – для них используются кастомно отрисованные templates. Соответственно перегружаются методы в которых происходят вызовы хелперов для прорисовки, поэтому в директории /amazing/themes/default/template/controllers/products/customization.tpl
можно увидеть огромное число темплейтов.
Перегрузка родных темплейтов:
Для перегрузки темплейтов из 2х ранее описанных пунктов используется директория override/controllers/admin/templates/name_of_the_controller/
Создается директория с именем котроллера без слов Controller и Core (на самом деле директорию можно называть и не по имени контроллера, а как-то по-другому, задав имя в свойстве tpl_folder контроллера, но лучше этого не делать).
Например, пути для перегрузки пары темплейтов AdminProductsController – admin/themes/default/template/controllers/name_of_the_controller/helpers/form/form.tpl
– для хелпера form и /override/controllers/admin/templates/products/informations.tpl
– для перегрузки информации о продукте.
Template может быть заменен полностью, а может частями. В 1м случае просто заменяется все содержимое родного файла; во 2м – перегружается какая-то часть: многие (но не все) template разделены на блоки с именами – именно эти блоки можно перегружать по отдельности или добавлять новые, например переопределение заголовка списка cms страниц:
1 2 3 4 |
{extends file="helpers/list/list_header.tpl"} // файл от которого наследуемся {block name="startForm"} // измененный блок <form method="post" action="{$smarty.server.REQUEST_URI}" class="form-horizontal clearfix" id="{$list_id}"> {/block} |
Или пример переопределения части form template в модуле: имеется кастомный контроллер для админки (потомок ModuleAdminController), в нем переопределяется часть формы редактирования стандартного шаблона form. Размещается файл с переопределением здесь _PS_MODULE_DIR_.module_name.'/views/templates/admin/'.$this->override_folder.$this->base_folder.$tpl_name
, поэтому в моем случае
/modules/module_name/views/templates/admin/module_name/helpers/form/form.tpl
(переопределяется блок отрисовки label и field):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{extends file="helpers/form/form.tpl"} {block name="label"} {if $input.type == 'text_label'} {if isset($input.label)}<h3 {if isset($input.class)}class="{$input.class}"{/if}>{$input.label}</h3>{/if} {else} {$smarty.block.parent} {/if} {/block} {block name="field"} {if $input.type == 'separator'} <hr /> {else} {$smarty.block.parent} {/if} {/block} |
Выбор темплейта (родной или перегруженный) осуществляется при его прорисовки здесь HelperCore::createTemplate()
, алгоритм выбора более чем простой.
Это всего лишь часть верхушки айсберга, применение остальных видов можно увидеть в контроллерах, но трудностей при перегрузки обычно не возникает.