Админка и закрытые зоны

Зайдите в админку вашего сайта по адресу /admin/ (закрывающий слэш обязателен!). Для доступа используется HTTP/Basic авторизация.

Прежде всего бросается в глаза, что в админке два меню. Одно горизонтальное, изначально содержащее только один пункт - «Настройки». Это меню будем называть главным. Второе - оранжевое выпадающее с надписью «Компоненты». Это девелоперское меню.

Главное меню видно всем, имеющим доступ в админку. Оно управляется через настройки (Настройки системы администрирования -> Структура навигации), это - обычная навигация как и на основном сайте, в которой допустимо использование двух уровней - второй будет в виде выпадающего меню при наведении курсора мыши. Это меню следует настроить так, чтобы было удобно работать человеку, управляющему контентом сайта.

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

class Component_News implements Core_ModuleInterface
{
	public static function initialize()
	{
		CMS::add_component('News',new Component_News_Router);
		CMS::orm()->add('news','Component.News.DB');
		CMS_Admin::menu('Новости','/admin/news/');
	}
}

Закрытые зоны

Если вы недавно изучаете TAO и прочитали статью "Простейшая админка", то у вас наверняка возник следующий вопрос. В компоненте "Новости" есть два контроллера, которые вроде бы одинаково подключаются и диспетчеризируются, но один из них открыт всем посетителям и отображается в лейауте сайта, а другой (админский) требует пароль и отображается в админке. В чем разница? Как это достигнуто?

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

Каждая закрытая зона имеет свое имя (мнемонический код), а каждый контроллер сайта должен указать это имя, вернув его в метод auth_realm():

protected function auth_realm()
{
	return 'admin';
}

В данном примере контроллер, имеющий в себе такую функцию, тем самым указывает, что он работает в админке (в закрытой зоне с именем admin). Контроллер, работающий за рамками какой-либо закрытой зоны (т.е. открытый, не требующий авторизации), должен в функции auth_realm вернуть false. В примере статьи "Простейшая админка" оба контроллера не имеют этой функции только потому, что таковая есть в базовых контроллерах. Контроллер CMS.Controller.Table по умолчанию работает в зоне admin поскольку основное его использование - в админках. Однако никто не мешает разработчику переопределить функцию auth_realm и заставить контроллер работать в любой другой зоне или вообще в открытой области сайта.

Как создать и настроить закрытую зону

Закрытые зоны определяются в конфиге сайта. Давайте откроем конфигурационный файл app/config/site.php:

<?php $this

->admin_realm
	->layout('admin')
	->navigation_var('admin.navigation')
	->passwords(array(
		'admin:38c7edde3d61a0411511d3b1866f0436/full',
	))
->end

;

Раздел конфига admin_realm определяет параметры закрытой зоны с именем admin. Чтобы добавить на сайт еще одну закрытую зону, следует создать в конфиге такую же группу с именем <name>_realm и настроить параметры:

  • layout - лейаут, в котором будут отображаться страницы закрытой зоны.
  • navigation_var - имя переменной, из которой будет взята структура навигации.
  • passwords - список аккаунтов, допущенных в закрытую зону. Этот параметр рассмотрим подробнее.

Список аккаунтов

Список представляет собой массив строк вида <логин>:<хэш_пароля> или <логин>:<хэш_пароля>/<параметры. О том, как строить хэш пароля, читайте специальную статью - "Хэширование паролей".

В конце этой строки может (не обязательно) находиться прямой слэш с последующим списком параметров. У пользователя, создаваемого при инсталляции указан только один параметр - full, который означает полный админский доступ. Пользователь с таким доступом может делать в админке что угодно, например - создавать и удалять настройки, изменять для них параметры доступа. Кроме того, ему, в отличие от прочих пользователей, будет доступно девелоперское меню.

Несколько параметров указываются через запятую:

	->passwords(array(
		'admin:38c7edde3d61a0411511d3b1866f0436/news,a=8,articles',
	))

Как видим, параметры могут быть как со значением (a=8), так и без значения. В PHP-скриптах сайта можно получить все параметры текущего пользователя в виде массива:

$parms = WS::env()->admin_auth->user->parms;

При этом параметры, значения которых не указаны, будут иметь значение true.

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

	protected function access()
	{
		return WS::env()->admin_auth->user->check_access('news');
	}

Функция check_access объекта-пользователя в данном случае проверяет, установлен ли для него параметр news. Для пользователей, у которых установлен параметр full, функция check_access будет возвращать true всегда - вне зависимости от прочих параметров. Таким образом, в этом примере доступ к контроллеру будут иметь только полные администраторы и те, у кого установлен параметр news.

Параметры в функции check_access можно комбинировать, задавая тем самым список групп, имеющих доступ:

	protected function access()
	{
		return WS::env()->admin_auth->user->check_access('news,articles');
	}

Доступ будет предоставлен тому, кто принадлежит хотя бы одной из указанных групп. Учитывая, что в табличном контроллере можно отдельно предоставить доступ для добавления, редактирования и удаления записей, такая система разделения прав позволяет достаточно гибко управлять правами в широких пределах.

Главное меню админки

Главное меню админки редактируется в настройках. В стандартной админке это - admin.navigation. Это двухуровневое выпадающее меню (впрочем, второй имеет смысл делать только при большом количестве пунктов меню). Доступ на редактирование меню имеют только пользователи с полным админским доступом.

Для каждого пункта меню есть возможность указать параметр access:

Настройки = {
	url = /admin/vars/
}

Новости = {
	url = /admin/news/
	access = news
}

В этом примере пункт "Новости" будет показан только тем, у кого полный админский доступ или установлен параметр news.

Главная страница админки

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

Первый способ самый простой. Создайте шаблон app/views/pages/admin/index.phtml - его содержимое будет выведено на главной странице админки. Этот способ подходит для подавляющего большинства задач.

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

Изменение внешнего вида админки

В общем случае в настройках закрытой зоны вы можете указать другой лейаут для админки и тем самым изменить внешний вид до неузнаваемости. Однако, в большинстве случаев можно обойтись меньшим.

Поставьте свой логотип

Чаще всего требуется поменять логотип в шапке админки. Это легко сделать, просто поместив свой файл с изображением по адресу www/images/admin/logo.gif. Если у вас логотип в другом формате (например, PNG), и это имя не подходит, то придется немного сконфигурировать модуль CMS.Admin. Добавим в файл app/config/modules.php следующее:

'CMS.Admin' => array(
	'logo' => '/images/admin/logo.png',
),

Подмените стили

Возьмите файл tao/files/styles/admin/layout.css, скопируйте его в www/styles/admin/layout.css и отредактируйте. То же самое можно проделать и файлом menu.css. Такое может потребоваться если заказчик пожелает получить админку в фирменном стиле, и вам придется изменять стандартные цвета.

Отредактируйте лейаут

Аналогично CSS-файлу вы можете скопировать шаблон лейаута из tao/views/layouts/admin.phtml в app/views/layouts/admin.phtml и изменить его как вам понравится.

Предупреждение

Не увлекайтесь изменениями внешнего вида админки. Сделанные вами изменения могут оказаться плохо совместимыми с новыми версиями TAO. Кроме того, помните, что эти изменения не несут почти никакой полезной нагрузки, т.к. их не видит никто, кроме владельцев сайта.

18.02.2014
Все статьи