Создание админки. ч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 комментариев

avatar
о, так это по сути можно все так «вынести». Спасибо)
avatar
Спасибо большое, а можно выложить готовый модуль? Или это только для заточки каждому под себя?
avatar
Модуль еще пока «сырой», т.е. всего 3 настройки, добавлю другие настройки и выложу целостной системой для настроек.
В принципе, используя его функции можно заточить и под свои настройки. Еще хотел обратить внимание, странно, что все чтобы вывести дополнительную информацию о пользователе используют дополнительные поля в базе (совместимость версий системы получается слабая). Для этого можно было сделать как в Topic.entity.class.php, там используются методы для расширения типов топика. Ну или можно мой модуль доработать ;)
avatar
Было бы неплохо, если бы вы всё же выложили модуль: как заготовка для админики — что-то лучше, чем ничего ;)
avatar
Доработать модуль просто сейчас не успеваю, геморы на работе, времени почти нет.
avatar
Fatal error: Class 'Prefs' not found in /www_host/hosts/winc.ex6.ru/classes/engine/Engine.class.php on line 97
avatar
Ты из первой части сделал модуль работы с настройками?
avatar
да, конечно
avatar
По просьбе трудящихся, выложил модуль админки, скачать можно здесь.

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

P.S> добавил еще несколько настроек, кроме выше описаных, до остальных пока руки не дошли.
  • gran
  • +2
avatar
Что то уже недоступен этот модуль. Пишет, что истек срок хранения…
А можно его еще раз выложить?
avatar
Простите, а сохранился ли у Вас ещё модуль админки? По ссылке не скачивается, срок действия истёк…
avatar
Ищите здесь
avatar
Спасибо большое :) когда делал всё руками возникла ошибка в Pref.class.php в строке 22

После скачивание модуля целиком всё заработал!

когда ждать продолжения?
avatar
Продолжение будет когда я сделаю модуль «Компании» и выйдет 0.3, под нее планирую уже сделать практически все настройки сайта.
avatar
Когда же нам ждать версию 0.3?

Я опытный дизайнер в web. Возможно я смогу как то посодействовать проекту?
avatar
Это уже к Максу, главному разработчику проекта.
Чуть раньше уже требовался дизайнер для разработки дизайна проекта, думаю дизайнер еще понадобится.
avatar
У меня вот проблема заголовки в неправильной кодировки и раздел О проект, то там всё проблемно с кодировкой…

что делать? нормального ответа от поиска не получил, вопрос поднимался всего лишь один раз и не решился, по комментарием не понятно что да как
avatar
1. После чего так стало? или так с установки?
2. Какой редактор для файлов используешь?
avatar
я ищу программиста, который в состояние установить LS и технически его обслуживать его.

Возмешься за этого, естественно всё за деньги ICQ 429-три нуля-294
avatar
Мне тоже нужен программист способный натянуть готовую верстку на движок, установить несколько модулей и провести настройку и доработку по мелочам. Плачу деньги. Аська — 871871двануля.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.