Создание админки. ч2. Создание своего меню, получение и сохранение настроек.
И так, продолжаем. В этой части будет расказано как создать меню (как на картинке) и воспользоваться модулем из предыдущего урока.
Для создания меню(панели админа) необходимо в каталоге «templates\skin\habra\» создать файл «menu.admin.tpl» (код файла приведен ниже).
Основное на что стоит обратить внимание это переменные: $sMenuItemSelect — с помощью нее можно узнать выбранное основное меню (например «Админка»), $sMenuSubItemSelect — это подменю которое выбрано (например, «Сайт»), а также стоит обратить внимание на указанные пути ссылок типа "{$DIR_WEB_ROOT}/admin/site/" от них будет зависеть какое действие будет вызываться.
<TABLE class=pagemenu id=pagemenuszd>
<TBODY>
<TR>
{if $oUserCurrent}
<TD class="width10 read_"><IMG height=35 alt=" " src="{$DIR_STATIC_SKIN}/img/red_ul.gif" width=10></TD>
<TD class="subitem1 center read_" style="WIDTH: 14px">
<A href="{$DIR_WEB_ROOT}/topic/add/"><IMG title=написать height=14 alt="написать" src="{$DIR_STATIC_SKIN}/img/new_habratopic.gif" width=14></A>
</TD>
<TD class="border2px width10 read_"></TD>
{/if}
{if ($oUserCurrent->isAdministrator())}
{assign var="sel" value=""}
{if $sMenuItemSelect=='admin'}
{assign var="sel" value="sel "}
{/if}
<TD class="{$sel}width10"></TD>
<TD class="{$sel}subitem1 center">
<A class=tags_f href="{$DIR_WEB_ROOT}/admin/site/">Админка</A>
</TD>
<TD class="{$sel}border2px width10"></TD>
{/if}
</TR>
</TBODY>
</TABLE>
{if $sMenuItemSelect=='admin'}
<TABLE class="pagesubmenu" id="pagemenuszd">
<TBODY>
<TR>
<TD vAlign=bottom width=10><IMG height=10 src="{$DIR_STATIC_SKIN}/img/green2_bl.gif" width=10></TD>
<TD class="subitem2 three_columns{if $sMenuSubItemSelect=='site'} active_personal{/if}" noWrap align=middle>
<IMG class=arrow_cc height=7 src="{$DIR_STATIC_SKIN}/img/{if $sMenuSubItemSelect=='site'}arrow_menu_main.gif{else}arrow_menu_main_un.gif{/if}" width=10><A href="{$DIR_WEB_ROOT}/admin/site/">Сайт</A>
</TD>
<TD class="subitem2 three_columns{if $sMenuSubItemSelect=='plugins'} active_personal{/if}" noWrap align=middle>
<IMG class=arrow_cc height=7 src="{$DIR_STATIC_SKIN}/img/{if $sMenuSubItemSelect=='plugins'}arrow_menu_main.gif{else}arrow_menu_main_un.gif{/if}" width=10><A href="{$DIR_WEB_ROOT}/admin/plugins/">Плагины</A>
</TD>
<TD style="BORDER-RIGHT: white 2px solid" vAlign=bottom width=10><IMG height=10 src="{$DIR_STATIC_SKIN}/img/green2_br.gif" width=10></TD>
</TR>
</TBODY>
</TABLE>
{/if}
Далее по пути «templates\skin\habra\actions\» создаем каталог «ActionAdmin», в нем будут хранится описания страниц меню. В каталоге создадим два файла «site.tpl» (будет отображать страницу «Сайт») и «plugins.tpl» (будет отображать страницу «Плагины»).
Особое внимание в коде стоит обратить на включение {include file='menu.admin.tpl'}, без нее работать не будет :)
Остальное описание создание полей формы.
$oPrefs->getSiteName() заполнение значением поля (из первой части, получение имени сайта из сущности).
Так же надо не забыть кнопке привязать нужное действие (name=«submit_site»), которое будет выполнятся при отправке формы.
{include file='header.tpl'}
{include file='menu.admin.tpl'}
{include file='system_message.tpl'}
<table width="100%" border="0" cellspacing="4" cellpadding="4">
<tr>
<td align="left">
<p><span class="header">Настройки сайта</span></p>
<form action="{$DIR_WEB_ROOT}/admin/site" method="POST" enctype="multipart/form-data">
<span class="form">Название сайта :</span><br /> <input style="width: 60%;" type="text" id="SITE_NAME" name="SITE_NAME" value="{$oPrefs->getSiteName()|escape:'html'}">
<span class="form_note">Будет выводится в заголовке страницы</span><br />
<p>
<span class="form">Ключевые слова :</span><br /> <input style="width: 60%;" type="text" id="SITE_KEYWORDS" name="SITE_KEYWORDS" value="{$oPrefs->getSiteKeyWords()|escape:'html'}">
<span class="form_note">Ключевые слова относящиеся к сайту, через запятую</span>
</p>
<p>
<span class="form">Описание сайта :</span><br /> <input style="width: 60%;" type="text" id="SITE_DESCRIPTION" name="SITE_DESCRIPTION" value="{$oPrefs->getSiteDescription()|escape:'html'}">
<span class="form_note">Краткое описание сайта, желательно чтобы включало ключевые слова.</span>
</p>
<p class="l-bot"><input type="submit" name="submit_site" value="Сохранить настройки" /></p>
</form>
</td>
</tr>
</table>
plugins.tpl пока не заполнен и в данном примере используется чтобы показать как мало требуется для описания странички меню.
<code>
{include file='footer.tpl'}
{include file='header.tpl'}
{include file='menu.admin.tpl'}
{include file='system_message.tpl'}
Управление плагинами
{include file='footer.tpl'}
После файлов отображения, создаем действие обрабатывающее форму. По пути
«classes\actions\» создаем файл «ActionAdmin.class.php» с содержимым указанным ниже.
Кратко о работе модуля:
При инициализации устанавливается действие по умолчанию (т.е. подменю «Сайт»), в заголовок окна сайта пишется что мы в админке (Viewer_AddHtmlTitle('Админка')), получается текущий пользователь и определяется является ли он админом, если да, разрешаем дальнейшее действие, если нет ругаемся.
В RegisterEvent() добавляем наши странички подменю и действия на них. Соответственно EventAdminSite действие на странце подменю «Сайт», обратите внимание на if (isset($_REQUEST['submit_site']) — это проверка на то что мы отправили данные настроек сайта на сохранение. Дальше в функции мы проверяем переданные данные и если все хорошо сохраняем.
Особое внимание стоит обратить на функцию EventShutdown(), в ней присваиваются значения переменных которые будут использоваться в шаблоне вывода страниц меню (т.е. Viewer_Assign('oPrefs',$this->oPrefs) передает наш объект работы с настройками)
class ActionAdmin extends Action {
/**
* Активное меню
*/
protected $sMenuItemSelect='admin';
/**
* Активное подменю
*/
protected $sMenuSubItemSelect='site';
/**
* Текущий пользователь
*/
protected $oUserCurrent=null;
/**
* Настройки
*/
protected $oPrefs=null;
/**
* Инициализация значений
*/
public function Init() {
$this->SetDefaultEvent('site');
$this->Viewer_AddHtmlTitle('Админка');
$this->oUserCurrent=$this->User_GetUserCurrent();
// Проверки на "вшивость".
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle('Настройки сайта для вас не доступны','Нет доступа');
return Router::Action('error');
} else if (!$this->oUserCurrent->isAdministrator()){
$this->Message_AddErrorSingle('Не влезай, не убьет!','Нет доступа');
return Router::Action('error');
}
}
/**
* Регистрируем события
*/
protected function RegisterEvent() {
$this->AddEvent('site','EventAdminSite');
$this->AddEvent('plugins','EventAdminPlugins');
}
/**
* Обработчик формы настроек сайта
*/
protected function EventAdminSite() {
// При получении данных тоже на всякий проверяем на "вшивость".
if (!$this->oUserCurrent->isAdministrator()) {
$this->Message_AddErrorSingle('Недостаточно прав','Нет доступа');
return Router::Action('error');
}
$this->oPrefs=$this->Prefs_getPrefs('site');
$this->sMenuItemSelect='admin';
$this->sMenuSubItemSelect='site';
$this->Viewer_AddHtmlTitle('Настройки сайта');
if (isset($_REQUEST['submit_site'])) {
$bError=false;
if (func_check(getRequest('SITE_NAME'),'text',2,200)) {
$this->oPrefs->setSiteName(getRequest('SITE_NAME'));
} else {
$bError=true;
$this->Message_AddError('Не указано наименование сайта или длинна превышает допустимую','Ошибка');
}
if (func_check(getRequest('SITE_KEYWORDS'),'text',0,400)) {
$this->oPrefs->setSiteKeyWords(getRequest('SITE_KEYWORDS'));
} else {
$bError=true;
$this->Message_AddError('Текст в поле "Ключевые слова" превышает допустимую длину','Ошибка');
}
if (func_check(getRequest('SITE_DESCRIPTION'),'text',0,400)) {
$this->oPrefs->setSiteDescription(getRequest('SITE_DESCRIPTION'));
} else {
$bError=true;
$this->Message_AddError('Текст в поле "Описание сайта" превышает допустимую длину','Ошибка');
}
if (!$bError){
$this->Prefs_setPrefs('site',$this->oPrefs);
$this->Message_AddNotice('Настройки сохранены');
}
}
}
/**
* Обработчик формы настроек плагинов
*/
protected function EventAdminPlugins() {
if (!$this->oUserCurrent->isAdministrator()) {
$this->Message_AddErrorSingle('Недостаточно прав','Нет доступа');
return Router::Action('error');
}
$this->sMenuItemSelect='admin';
$this->sMenuSubItemSelect='plugins';
$this->Viewer_AddHtmlTitle('Настройки плагинов');
$this->Message_AddNotice('Coming soon ;)');
}
/**
* Выполняется при завершении работы экшена
*
*/
public function EventShutdown() {
/**
* Загружаем в шаблон необходимые переменные
*/
$this->Viewer_Assign('sMenuItemSelect',$this->sMenuItemSelect);
$this->Viewer_Assign('sMenuSubItemSelect',$this->sMenuSubItemSelect);
$this->Viewer_Assign('oPrefs',$this->oPrefs);
}
}
Далее наше действие необходимо добавить в файл «config\config.route.php».
Добавьте нижеприведенную строчку в конец первого массива.
'admin' => 'ActionAdmin',
Теперь чтобы наши настройки применялись к сайту необходим добавить их получение в файл «classes\modules\sys_viewer\Viewer.class.php».
В функцию Init() дописываем строчки:
/**
* Получаем значение настроек сайта.
*
*/
$this->oPrefs = $this->Prefs_getPrefs('site');
$this->sHtmlTitle = $this->oPrefs->getSiteName();
$this->sHtmlKeywords = $this->oPrefs->getSiteKeyWords();
$this->sHtmlDescription = $this->oPrefs->getSiteDescription();
А так же в функции VarAssign(), переопределите переменную SITE_NAME.
$this->Assign("SITE_NAME",$this->oPrefs->getSiteName());
Последний штрих, добавляем ссылку на админку рядом с профилем, для этого открываем файл "\templates\skin\habra\header.tpl" и после описания имени и выхода
<A class=hello_nickname href="{$DIR_WEB_ROOT}/profile/{$oUserCurrent->getLogin()}/">{$oUserCurrent->getLogin()}</A> ( <A class=hello_exit href="{$DIR_WEB_ROOT}/login/exit/">выход</a> )
добавляем
{if $oUserCurrent->isAdministrator()}| <A class=hello_exit href="{$DIR_WEB_ROOT}/admin/">админка</a>{/if}
Для создания своего (другого) меню можно сделать те же действия только заменить во всех названиях слово «admin» на «свое» и не трогать файл «Viewer.class.php» ;)
Далее можно расширить модуль и добавить другие настройки. В принципе, модуль почти не затрагивает сисемные модули, т.е. его можно будет применять с выходом новых обновлений, незначительно подкоррекировав их.
Фуф… надеюсь ничего не забыл написать.
P.S> Спасибо Максу за движек и за статью про создание модуля, без нее было бы тяжко.
P.S.S> Cпасибо benone, a592153 за совет использования Eclipse :)
P.S.S.S> Спасибо всем что дочитали до конца ;)
20 комментариев
В принципе, используя его функции можно заточить и под свои настройки. Еще хотел обратить внимание, странно, что все чтобы вывести дополнительную информацию о пользователе используют дополнительные поля в базе (совместимость версий системы получается слабая). Для этого можно было сделать как в Topic.entity.class.php, там используются методы для расширения типов топика. Ну или можно мой модуль доработать ;)
В нем содержаться все необходимые файлы, нужно лишь из
P.S> добавил еще несколько настроек, кроме выше описаных, до остальных пока руки не дошли.
А можно его еще раз выложить?
После скачивание модуля целиком всё заработал!
когда ждать продолжения?
Я опытный дизайнер в web. Возможно я смогу как то посодействовать проекту?
Чуть раньше уже требовался дизайнер для разработки
что делать? нормального ответа от поиска не получил, вопрос поднимался всего лишь один раз и не решился, по комментарием не понятно что да как
2. Какой редактор для файлов используешь?
Возмешься за этого, естественно всё за деньги ICQ 429-три нуля-294