From e1309cf17537d9d8109904cf5c954e5ca9264d7a Mon Sep 17 00:00:00 2001 From: Mzhelskiy Maxim Date: Fri, 24 Oct 2008 05:23:13 +0000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B2=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8E=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D0=BC=D0=B8=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/actions/ActionBlog.class.php | 2 +- classes/actions/ActionPage.class.php | 273 ++++++++++++++++-- classes/engine/Action.class.php | 10 + classes/modules/page/Page.class.php | 143 +++++++++ .../modules/page/entity/Page.entity.class.php | 96 ++++++ .../modules/page/mapper/Page.mapper.class.php | 117 ++++++++ classes/modules/sys_viewer/Viewer.class.php | 31 ++ config/config.php | 2 + config/config.table.php | 1 + patch.sql | 33 +++ .../skin/habra/actions/ActionPage/add.tpl | 124 ++++++++ .../skin/habra/actions/ActionPage/admin.tpl | 67 +++++ .../skin/habra/actions/ActionPage/page.tpl | 15 + templates/skin/habra/css/my.css | 50 +++- templates/skin/habra/header.tpl | 6 +- templates/skin/habra/img/delete_16x16.gif | Bin 0 -> 331 bytes templates/skin/habra/img/folder_16x16.gif | Bin 0 -> 363 bytes templates/skin/habra/img/new_16x16.gif | Bin 0 -> 630 bytes 18 files changed, 943 insertions(+), 27 deletions(-) create mode 100644 classes/modules/page/Page.class.php create mode 100644 classes/modules/page/entity/Page.entity.class.php create mode 100644 classes/modules/page/mapper/Page.mapper.class.php create mode 100644 templates/skin/habra/actions/ActionPage/add.tpl create mode 100644 templates/skin/habra/actions/ActionPage/admin.tpl create mode 100644 templates/skin/habra/actions/ActionPage/page.tpl create mode 100644 templates/skin/habra/img/delete_16x16.gif create mode 100644 templates/skin/habra/img/folder_16x16.gif create mode 100644 templates/skin/habra/img/new_16x16.gif diff --git a/classes/actions/ActionBlog.class.php b/classes/actions/ActionBlog.class.php index bf33a66f..919e3a5e 100644 --- a/classes/actions/ActionBlog.class.php +++ b/classes/actions/ActionBlog.class.php @@ -394,7 +394,7 @@ class ActionBlog extends Action { } } /** - * Проверяем есть ли заголовок топика, с заменой всех пробельных символов на "_" + * Проверяем есть ли URL блога, с заменой всех пробельных символов на "_" */ $blogUrl=preg_replace("/\s+/",'_',getRequest('blog_url')); $_REQUEST['blog_url']=$blogUrl; diff --git a/classes/actions/ActionPage.class.php b/classes/actions/ActionPage.class.php index 651bb3c7..12d669f4 100644 --- a/classes/actions/ActionPage.class.php +++ b/classes/actions/ActionPage.class.php @@ -16,41 +16,270 @@ */ /** - * Обработка статических страниц, здесь пока пусто :) + * Обработка статических страниц * */ class ActionPage extends Action { protected $sUserLogin=null; - - public function Init() { - $this->SetDefaultEvent('about'); + protected $aBadPageUrl=array('admin'); + + public function Init() { + } - - protected function RegisterEvent() { - $this->AddEvent('about','EventAbout'); - $this->AddEvent('download','EventDownload'); + /** + * Регистрируем евенты + * + */ + protected function RegisterEvent() { + $this->AddEvent('admin','EventAdmin'); + $this->AddEventPreg('/^[\w\-\_]*$/i','EventShowPage'); } - - + + /********************************************************************************** - ************************ РЕАЛИЗАЦИЯ ЭКШЕНА *************************************** - ********************************************************************************** - */ - + ************************ РЕАЛИЗАЦИЯ ЭКШЕНА *************************************** + ********************************************************************************** + */ + /** - * Просто выводим шаблон + * Отображение страницы * + * @return unknown */ - protected function EventAbout() { - $this->Viewer_AddHtmlTitle('О проекте'); + protected function EventShowPage() { + if (!$this->sCurrentEvent) { + /** + * Показывает дефолтную страницу + */ + //а это какая страница? + } + /** + * Составляем полный URL страницы для поиска по нему в БД + */ + $sUrlFull=join('/',$this->GetParams()); + if ($sUrlFull!='') { + $sUrlFull=$this->sCurrentEvent.'/'.$sUrlFull; + } else { + $sUrlFull=$this->sCurrentEvent; + } + /** + * Ищем страничку в БД + */ + if (!($oPage=$this->Page_GetPageByUrlFull($sUrlFull,1))) { + return $this->EventNotFound(); + } + /** + * Заполняем HTML теги и SEO + */ + $this->Viewer_AddHtmlTitle($oPage->getTitle()); + if ($oPage->getSeoKyewords()) { + $this->Viewer_SetHtmlKeywords($oPage->getSeoKyewords()); + } + if ($oPage->getSeoDescription()) { + $this->Viewer_SetHtmlDescription($oPage->getSeoDescription()); + } + + $this->Viewer_Assign('oPage',$oPage); + /** + * Устанавливаем шаблон для вывода + */ + $this->SetTemplateAction('page'); } - + /** - * Просто выводим шаблон + * Админка статическими страницами * */ - protected function EventDownload() { - $this->Viewer_AddHtmlTitle('Скачать движок'); - } + protected function EventAdmin() { + /** + * Если пользователь не авторизован и не админ, то выкидываем его + */ + $this->oUserCurrent=$this->User_GetUserCurrent(); + if (!$this->oUserCurrent or !$this->oUserCurrent->isAdministrator()) { + return $this->EventNotFound(); + } + + $this->Viewer_AddHtmlTitle('Управление страницами'); + /** + * Обработка создания новой странички + */ + if (getRequest('submit_page_save')) { + if (!getRequest('page_id')) { + $this->SubmitAddPage(); + } + } + /** + * Обработка показа странички для редактирования + */ + if ($this->GetParam(0)=='edit') { + if ($oPageEdit=$this->Page_GetPageById($this->GetParam(1))) { + if (!getRequest('submit_page_save')) { + $_REQUEST['page_title']=$oPageEdit->getTitle(); + $_REQUEST['page_pid']=$oPageEdit->getPid(); + $_REQUEST['page_url']=$oPageEdit->getUrl(); + $_REQUEST['topic_text']=$oPageEdit->getText(); + $_REQUEST['page_seo_keywords']=$oPageEdit->getSeoKyewords(); + $_REQUEST['page_seo_description']=$oPageEdit->getSeoDescription(); + $_REQUEST['page_active']=$oPageEdit->getActive(); + $_REQUEST['page_id']=$oPageEdit->getId(); + } else { + /** + * Если отправили форму с редактированием, то обрабатываем её + */ + $this->SubmitEditPage($oPageEdit); + } + $this->Viewer_Assign('oPageEdit',$oPageEdit); + } else { + $this->Message_AddError('Страница для редактирования не найдена','Ошибка'); + $this->SetParam(0,null); + } + } + /** + * Обработка удаления страницы + * Замечание: если используется тип таблиц MyISAM, а InnoDB то возможно некорректное удаление вложенных страниц + */ + if ($this->GetParam(0)=='delete') { + if ($this->Page_deletePageById($this->GetParam(1))) { + $this->Message_AddNotice('Страница удалена'); + } else { + $this->Message_AddError('Возникла ошибка при удалении страницы','Ошибка'); + } + } + /** + * Получаем и загружаем список всех страниц + */ + $aPages=$this->Page_GetPages(); + $this->Viewer_Assign('aPages',$aPages); + } + /** + * Обработка отправки формы при редактировании страницы + * + * @param unknown_type $oPageEdit + */ + protected function SubmitEditPage($oPageEdit) { + /** + * Проверяем корректность полей + */ + if (!$this->CheckPageFields()) { + return ; + } + /** + * Обновляем свойства страницы + */ + $oPage=new PageEntity_Page(); + $oPageEdit->setActive(getRequest('page_active') ? 1 : 0); + $oPageEdit->setDateEdit(date("Y-m-d H:i:s")); + if (getRequest('page_pid')==0) { + $oPageEdit->setUrlFull(getRequest('page_url')); + $oPageEdit->setPid(null); + } else { + $oPageEdit->setPid(getRequest('page_pid')); + $oPageParent=$this->Page_GetPageById(getRequest('page_pid')); + $oPageEdit->setUrlFull($oPageParent->getUrlFull().'/'.getRequest('page_url')); + } + $oPageEdit->setSeoDescription(getRequest('page_seo_description')); + $oPageEdit->setSeoKyewords(getRequest('page_seo_keywords')); + $oPageEdit->setText(getRequest('topic_text')); + $oPageEdit->setTitle(getRequest('page_title')); + $oPageEdit->setUrl(getRequest('page_url')); + /** + * Обновляем страницу + */ + if ($this->Page_UpdatePage($oPageEdit)) { + $this->Page_RebuildUrlFull($oPageEdit); + $this->Message_AddNotice('Страница обновлена'); + $this->SetParam(0,null); + $this->SetParam(1,null); + } else { + $this->Message_AddError('Внутреняя ошибка, повторите позже','Ошибка'); + } + } + /** + * Обработка отправки формы добавления новой страницы + * + */ + protected function SubmitAddPage() { + /** + * Проверяем корректность полей + */ + if (!$this->CheckPageFields()) { + return ; + } + /** + * Заполняем свойства + */ + $oPage=new PageEntity_Page(); + $oPage->setActive(getRequest('page_active') ? 1 : 0); + $oPage->setDateAdd(date("Y-m-d H:i:s")); + if (getRequest('page_pid')==0) { + $oPage->setUrlFull(getRequest('page_url')); + $oPage->setPid(null); + } else { + $oPage->setPid(getRequest('page_pid')); + $oPageParent=$this->Page_GetPageById(getRequest('page_pid')); + $oPage->setUrlFull($oPageParent->getUrlFull().'/'.getRequest('page_url')); + } + $oPage->setSeoDescription(getRequest('page_seo_description')); + $oPage->setSeoKyewords(getRequest('page_seo_keywords')); + $oPage->setText(getRequest('topic_text')); + $oPage->setTitle(getRequest('page_title')); + $oPage->setUrl(getRequest('page_url')); + /** + * Добавляем страницу + */ + if ($this->Page_AddPage($oPage)) { + $this->Message_AddNotice('Новая страница добавлена'); + $this->SetParam(0,null); + } else { + $this->Message_AddError('Внутреняя ошибка, повторите позже','Ошибка'); + } + } + /** + * Проверка полей на корректность + * + * @return unknown + */ + protected function CheckPageFields() { + $bOk=true; + /** + * Проверяем есть ли заголовок топика + */ + if (!func_check(getRequest('page_title'),'text',2,200)) { + $this->Message_AddError('Название страницы должно быть от 2 до 200 символов','Ошибка'); + $bOk=false; + } + /** + * Проверяем есть ли заголовок топика, с заменой всех пробельных символов на "_" + */ + $pageUrl=preg_replace("/\s+/",'_',getRequest('page_url')); + $_REQUEST['page_url']=$pageUrl; + if (!func_check(getRequest('page_url'),'login',1,50)) { + $this->Message_AddError('URL должен быть от 1 до 50 символов и только на латинице + цифры и знаки "-", "_"','Ошибка'); + $bOk=false; + } + /** + * Проверяем на счет плохих УРЛов + */ + if (in_array(getRequest('page_url'),$this->aBadPageUrl)) { + $this->Message_AddError('URL должен отличаться от: '.join(',',$this->aBadPageUrl),'Ошибка'); + $bOk=false; + } + /** + * Проверяем есть ли содержание страницы + */ + if (!func_check(getRequest('topic_text'),'text',1,50000)) { + $this->Message_AddError('Текст страницы должен быть от 1 до 50000 символов','Ошибка'); + $bOk=false; + } + /** + * Проверяем страницу в которую хотим вложить + */ + if (getRequest('page_pid')!=0 and !($oPageParent=$this->Page_GetPageById(getRequest('page_pid')))) { + $this->Message_AddError('Неверно выбрана страница для вложения','Ошибка'); + $bOk=false; + } + + return $bOk; + } } ?> \ No newline at end of file diff --git a/classes/engine/Action.class.php b/classes/engine/Action.class.php index 83091166..4f7e0c4b 100644 --- a/classes/engine/Action.class.php +++ b/classes/engine/Action.class.php @@ -176,6 +176,16 @@ abstract class Action extends Object { return isset($this->aParams[$iOffset]) ? $this->aParams[$iOffset] : $default; } + /** + * Получает список параметров из УРЛ + * + * @return unknown + */ + public function GetParams() { + return $this->aParams; + } + + /** * Установить значение параметра(эмуляция параметра в URL). * После установки занова считывает параметры из роутера - для корректной работы diff --git a/classes/modules/page/Page.class.php b/classes/modules/page/Page.class.php new file mode 100644 index 00000000..9ea1a41e --- /dev/null +++ b/classes/modules/page/Page.class.php @@ -0,0 +1,143 @@ +oMapper=new Mapper_Page($this->Database_GetConnect()); + } + /** + * Добавляет страницу + * + * @param PageEntity_Page $oPage + * @return unknown + */ + public function AddPage(PageEntity_Page $oPage) { + return $this->oMapper->AddPage($oPage); + } + /** + * Обновляет страницу + * + * @param PageEntity_Page $oPage + * @return unknown + */ + public function UpdatePage(PageEntity_Page $oPage) { + return $this->oMapper->UpdatePage($oPage); + } + /** + * Получает страницу по полному УРЛу + * + * @param unknown_type $sUrlFull + */ + public function GetPageByUrlFull($sUrlFull,$iActive=1) { + return $this->oMapper->GetPageByUrlFull($sUrlFull,$iActive); + } + /** + * Получает страницу по её айдишнику + * + * @param unknown_type $sId + * @return unknown + */ + public function GetPageById($sId) { + return $this->oMapper->GetPageById($sId); + } + /** + * Получает список всех страниц ввиде дерева + * + * @return unknown + */ + public function GetPages() { + $aPages=array(); + $aPagesRow=$this->oMapper->GetPages(); + if (count($aPagesRow)) { + $aPages=$this->BuildPagesRecursive($aPagesRow); + } + return $aPages; + } + /** + * Строит дерево страниц + * + * @param unknown_type $aPages + * @param unknown_type $bBegin + * @return unknown + */ + protected function BuildPagesRecursive($aPages,$bBegin=true) { + static $aResultPages; + static $iLevel; + if ($bBegin) { + $aResultCommnets=array(); + $iLevel=0; + } + foreach ($aPages as $aPage) { + $aTemp=$aPage; + $aTemp['level']=$iLevel; + unset($aTemp['childNodes']); + $aResultPages[]=new PageEntity_Page($aTemp); + if (isset($aPage['childNodes']) and count($aPage['childNodes'])>0) { + $iLevel++; + $this->BuildPagesRecursive($aPage['childNodes'],false); + } + } + $iLevel--; + return $aResultPages; + } + /** + * Рекурсивно обновляет полный URL у всех дочерних страниц(веток) + * + * @param unknown_type $oPageStart + */ + public function RebuildUrlFull($oPageStart) { + $aPages=$this->GetPagesByPid($oPageStart->getId()); + foreach ($aPages as $oPage) { + $oPage->setUrlFull($oPageStart->getUrlFull().'/'.$oPage->getUrl()); + $this->UpdatePage($oPage); + $this->RebuildUrlFull($oPage); + } + } + /** + * Получает список дочерних страниц первого уровня + * + * @param unknown_type $sPid + * @return unknown + */ + public function GetPagesByPid($sPid) { + return $this->oMapper->GetPagesByPid($sPid); + } + /** + * Удаляет страницу по её айдишнику + * Если тип таблиц БД InnoDB, то удалятся и все дочернии страницы + * + * @param unknown_type $sId + * @return unknown + */ + public function deletePageById($sId) { + return $this->oMapper->deletePageById($sId); + } +} +?> \ No newline at end of file diff --git a/classes/modules/page/entity/Page.entity.class.php b/classes/modules/page/entity/Page.entity.class.php new file mode 100644 index 00000000..12edd049 --- /dev/null +++ b/classes/modules/page/entity/Page.entity.class.php @@ -0,0 +1,96 @@ +_aData['page_id']; + } + public function getPid() { + return $this->_aData['page_pid']; + } + public function getUrl() { + return $this->_aData['page_url']; + } + public function getUrlFull() { + return $this->_aData['page_url_full']; + } + public function getTitle() { + return $this->_aData['page_title']; + } + public function getText() { + return $this->_aData['page_text']; + } + public function getDateAdd() { + return $this->_aData['page_date_add']; + } + public function getDateEdit() { + return $this->_aData['page_date_edit']; + } + public function getSeoKyewords() { + return $this->_aData['page_seo_keywords']; + } + public function getSeoDescription() { + return $this->_aData['page_seo_description']; + } + public function getActive() { + return $this->_aData['page_active']; + } + + public function getLevel() { + return $this->_aData['level']; + } + + + + + public function setId($data) { + $this->_aData['page_id']=$data; + } + public function setPid($data) { + $this->_aData['page_pid']=$data; + } + public function setUrl($data) { + $this->_aData['page_url']=$data; + } + public function setUrlFull($data) { + $this->_aData['page_url_full']=$data; + } + public function setTitle($data) { + $this->_aData['page_title']=$data; + } + public function setText($data) { + $this->_aData['page_text']=$data; + } + public function setDateAdd($data) { + $this->_aData['page_date_add']=$data; + } + public function setDateEdit($data) { + $this->_aData['page_date_edit']=$data; + } + public function setSeoKyewords($data) { + $this->_aData['page_seo_keywords']=$data; + } + public function setSeoDescription($data) { + $this->_aData['page_seo_description']=$data; + } + public function setActive($data) { + $this->_aData['page_active']=$data; + } + +} +?> \ No newline at end of file diff --git a/classes/modules/page/mapper/Page.mapper.class.php b/classes/modules/page/mapper/Page.mapper.class.php new file mode 100644 index 00000000..213846ae --- /dev/null +++ b/classes/modules/page/mapper/Page.mapper.class.php @@ -0,0 +1,117 @@ +oDb->query($sql,$oPage->getPid(),$oPage->getUrl(),$oPage->getUrlFull(),$oPage->getTitle(),$oPage->getText(),$oPage->getDateAdd(),$oPage->getSeoKyewords(),$oPage->getSeoDescription(),$oPage->getActive())) + { + return $iId; + } + return false; + } + + public function UpdatePage(PageEntity_Page $oPage) { + $sql = "UPDATE ".DB_TABLE_PAGE." + SET page_pid = ? , + page_url = ? , + page_url_full = ? , + page_title = ? , + page_text = ? , + page_date_edit = ? , + page_seo_keywords = ? , + page_seo_description = ? , + page_active = ? + WHERE page_id = ?d + "; + if ($this->oDb->query($sql,$oPage->getPid(),$oPage->getUrl(),$oPage->getUrlFull(),$oPage->getTitle(),$oPage->getText(),$oPage->getDateEdit(),$oPage->getSeoKyewords(),$oPage->getSeoDescription(),$oPage->getActive(),$oPage->getId())) + { + return true; + } + return false; + } + + public function GetPageByUrlFull($sUrlFull,$iActive) { + $sql = "SELECT * FROM ".DB_TABLE_PAGE." WHERE page_url_full = ? and page_active = ?d "; + if ($aRow=$this->oDb->selectRow($sql,$sUrlFull,$iActive)) { + return new PageEntity_Page($aRow); + } + return null; + } + + public function GetPageById($sId) { + $sql = "SELECT * FROM ".DB_TABLE_PAGE." WHERE page_id = ? "; + if ($aRow=$this->oDb->selectRow($sql,$sId)) { + return new PageEntity_Page($aRow); + } + return null; + } + + public function deletePageById($sId) { + $sql = "DELETE FROM ".DB_TABLE_PAGE." WHERE page_id = ? "; + if ($aRow=$this->oDb->selectRow($sql,$sId)) { + return true; + } + return false; + } + + public function GetPages() { + $sql = "SELECT + *, + page_id as ARRAY_KEY, + page_pid as PARENT_KEY + FROM + ".DB_TABLE_PAGE." + ORDER by page_title asc; + "; + if ($aRows=$this->oDb->select($sql)) { + return $aRows; + } + return null; + } + + public function GetPagesByPid($sPid) { + $sql = "SELECT + * + FROM + ".DB_TABLE_PAGE." + WHERE + page_pid = ? "; + $aResult=array(); + if ($aRows=$this->oDb->select($sql,$sPid)) { + foreach ($aRows as $aRow) { + $aResult[]=new PageEntity_Page($aRow); + } + } + return $aResult; + } + +} +?> \ No newline at end of file diff --git a/classes/modules/sys_viewer/Viewer.class.php b/classes/modules/sys_viewer/Viewer.class.php index 4124186b..e774dcee 100644 --- a/classes/modules/sys_viewer/Viewer.class.php +++ b/classes/modules/sys_viewer/Viewer.class.php @@ -40,6 +40,19 @@ class Viewer extends Module { * @var unknown_type */ protected $sHtmlTitle=SITE_NAME; + /** + * SEO ключевые слова страницы + * + * @var unknown_type + */ + protected $sHtmlKeywords=SITE_KYEWORDS; + /** + * SEO описание страницы + * + * @var unknown_type + */ + protected $sHtmlDescription=SITE_DESCRIPTION; + /** * Разделитель заголовка HTML страницы * @@ -102,6 +115,8 @@ class Viewer extends Module { * Загружаем HTML заголовки */ $this->Assign("sHtmlTitle",htmlspecialchars($this->sHtmlTitle)); + $this->Assign("sHtmlKeywords",htmlspecialchars($this->sHtmlKeywords)); + $this->Assign("sHtmlDescription",htmlspecialchars($this->sHtmlDescription)); } @@ -254,6 +269,22 @@ class Viewer extends Module { */ public function GetHtmlTitle() { return $this->sHtmlTitle; + } + /** + * Устанавливает ключевые слова keywords + * + * @param string $sText + */ + public function SetHtmlKeywords($sText) { + $this->sHtmlKeywords=$sText; + } + /** + * Устанавливает описание страницы desciption + * + * @param string $sText + */ + public function SetHtmlDescription($sText) { + $this->sHtmlDescription=$sText; } /** * Формирует постраничный вывод diff --git a/config/config.php b/config/config.php index d2151ade..074b7da8 100644 --- a/config/config.php +++ b/config/config.php @@ -102,6 +102,8 @@ define('ACL_CAN_VOTE_USER',-1); // порог рейтинга при котор * Прочие настройки */ define('SITE_NAME','LiveStreet - бесплатный движок социальной сети'); // название сайта +define('SITE_KYEWORDS','движок, livestreet, блоги, социальная сеть, бесплатный, php'); // seo keywords +define('SITE_DESCRIPTION','LiveStreet - официальный сайт бесплатного движка социальной сети'); // seo description define('SITE_CLOSE_MODE',false); // использовать закрытый режим работы сайта, сайт будет доступен только авторизованным пользователям define('USER_USE_ACTIVATION',false); // использовать активацию при регистрации или нет define('USER_USE_INVITE',false); // использовать режим регистрации по приглашению или нет. Если использовать, то регистрация будет доступна ТОЛЬКО по приглашениям! diff --git a/config/config.table.php b/config/config.table.php index 911d6100..1f26346b 100644 --- a/config/config.table.php +++ b/config/config.table.php @@ -42,4 +42,5 @@ define('DB_TABLE_TOPIC_QUESTION_VOTE',DB_PREFIX_TABLE.'topic_question_vote'); define('DB_TABLE_USER_ADMINISTRATOR',DB_PREFIX_TABLE.'user_administrator'); define('DB_TABLE_TOPIC_COMMENT_ONLINE',DB_PREFIX_TABLE.'topic_comment_online'); define('DB_TABLE_INVITE',DB_PREFIX_TABLE.'invite'); +define('DB_TABLE_PAGE',DB_PREFIX_TABLE.'page'); ?> \ No newline at end of file diff --git a/patch.sql b/patch.sql index 025a6fc4..c4244e10 100644 --- a/patch.sql +++ b/patch.sql @@ -142,6 +142,39 @@ ALTER TABLE `prefix_user` ADD `user_settings_notice_reply_comment` TINYINT( 1 ) ALTER TABLE `prefix_blog` ADD INDEX ( `blog_title` ) + +-- +-- Структура таблицы `prefix_page` +-- + +CREATE TABLE IF NOT EXISTS `prefix_page` ( + `page_id` int(11) unsigned NOT NULL auto_increment, + `page_pid` int(11) unsigned default NULL, + `page_url` varchar(50) NOT NULL, + `page_url_full` varchar(254) NOT NULL, + `page_title` varchar(200) NOT NULL, + `page_text` text NOT NULL, + `page_date_add` datetime NOT NULL, + `page_date_edit` datetime default NULL, + `page_seo_keywords` varchar(250) default NULL, + `page_seo_description` varchar(250) default NULL, + `page_active` tinyint(1) unsigned NOT NULL default '1', + PRIMARY KEY (`page_id`), + KEY `page_pid` (`page_pid`), + KEY `page_url_full` (`page_url_full`,`page_active`), + KEY `page_title` (`page_title`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Ограничения внешнего ключа сохраненных таблиц +-- + +-- +-- Ограничения внешнего ключа таблицы `prefix_page` +-- +ALTER TABLE `prefix_page` + ADD CONSTRAINT `prefix_page_fk` FOREIGN KEY (`page_pid`) REFERENCES `prefix_page` (`page_id`) ON DELETE CASCADE ON UPDATE CASCADE; + -- diff --git a/templates/skin/habra/actions/ActionPage/add.tpl b/templates/skin/habra/actions/ActionPage/add.tpl new file mode 100644 index 00000000..c72cabca --- /dev/null +++ b/templates/skin/habra/actions/ActionPage/add.tpl @@ -0,0 +1,124 @@ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Вставка изображения
Файл:
Ссылка: +
Выравнивание: + +
Описание:
+ + +
+
+
+ +
+ +
+ + + + +

+ +

+ +
+

+ +

+ +
+

+ + + +
+ + + + + + +   + + + + + + + + + +
+
+ + + Разрешены ВСЕ html-теги, перевод строки ставится автоматически +
+ + +

+ +
+ Ключевые слова для SEO-оптимизации +

+ +

+ +
+ Описание для SEO-оптимизации +

+ + +

+ + +
+

+ + +

+     +

+ + +
+
+ + diff --git a/templates/skin/habra/actions/ActionPage/admin.tpl b/templates/skin/habra/actions/ActionPage/admin.tpl new file mode 100644 index 00000000..5800b1f4 --- /dev/null +++ b/templates/skin/habra/actions/ActionPage/admin.tpl @@ -0,0 +1,67 @@ +{include file='header.tpl'} + +{include file='system_message.tpl'} + + +
+

Управление статическими страницами

+ +{if $aParams.0=='new'} +

Создание новой страницы

+ {include file='actions/ActionPage/add.tpl'} +{elseif $aParams.0=='edit'} +

Редактирование страницы «{$oPageEdit->getTitle()}»

+ {include file='actions/ActionPage/add.tpl'} +{else} + добавить страницу +{/if} + + + + + + + + + + + + + {foreach from=$aPages item=oPage name=el2} + {if $smarty.foreach.el2.iteration % 2 == 0} + {assign var=className value=''} + {else} + {assign var=className value='colored'} + {/if} + + + + + + + {/foreach} + + +
НазваниеURLАктивнаДействие
+ + {$oPage->getTitle()} + + /{$oPage->getUrlFull()}/ + + {if $oPage->getActive()} + Активна + {else} + Не активна + {/if} + + Редактировать +   + Удалить + +
+ + + + +{include file='footer.tpl'} + diff --git a/templates/skin/habra/actions/ActionPage/page.tpl b/templates/skin/habra/actions/ActionPage/page.tpl new file mode 100644 index 00000000..d4c210d8 --- /dev/null +++ b/templates/skin/habra/actions/ActionPage/page.tpl @@ -0,0 +1,15 @@ +{include file='header.tpl'} + + + + +
+
+ +{$oPage->getText()} + +
+ + +{include file='footer.tpl'} + diff --git a/templates/skin/habra/css/my.css b/templates/skin/habra/css/my.css index ad41e139..21e58354 100644 --- a/templates/skin/habra/css/my.css +++ b/templates/skin/habra/css/my.css @@ -152,4 +152,52 @@ div.comment_text2 { clear: both; margin-top: 1em; color: #999; -} \ No newline at end of file +} + +table.tbl th + { + + vertical-align:bottom; + + border: none; + border-bottom: solid #B0C1D3 1px; + + padding:.2em .6em .2em .65em; + background:#e2e4e4; + + font-size:0.9em; + font-weight:normal; + color:#6e6e6e; + } + table.tbl td + { + padding:6px 8px 6px 8px; + border: none; + border-right: solid #B0C1D3 1px; + } + table.tbl tr.colored td + { + background-color:#EEF6FB; + + } + table.tbl tr.colored_sel td + { + background-color:#D9FBC2; + + } + table.tbl + { + font-size:0.9em; + border:none; + margin:20px 0px 30px 0px; + border-bottom:solid 1px #B0C1D3; + } + table.tbl td:first-child + { + border-left: solid #B0C1D3 1px + } + table.tbl td + { + /* ��� IE: */ + border-left: expression(previousSibling == null ? 'solid #B0C1D3 1px' : 'inherit'); + } \ No newline at end of file diff --git a/templates/skin/habra/header.tpl b/templates/skin/habra/header.tpl index fd590f09..48aa6d6e 100644 --- a/templates/skin/habra/header.tpl +++ b/templates/skin/habra/header.tpl @@ -3,14 +3,14 @@ {$sHtmlTitle} - - + + - + diff --git a/templates/skin/habra/img/delete_16x16.gif b/templates/skin/habra/img/delete_16x16.gif new file mode 100644 index 0000000000000000000000000000000000000000..69140131107e7dd97c47f43f46d954db1b518995 GIT binary patch literal 331 zcmZ?wbhEHb6krfwxT?kQ-&y{@7UTaFegCb+{!c3ZufXuXGWh?(_WwrQ|Dz25cNhGZ zVEA9^`#<0P|IGUTAzJ_aRsXkU{O4!*-xU8p)A4_b&HotF{}rMC<4ynPd;RxP{O>IF zzb4@)C&Pa`vHzC*|I4D@b1?i5(D`q|^g)m9p_HT@x9v#h| z%|VJPC#Dq(7OqUVH{plT?1QhTCkseP%gDMlib>1KD=4~j2r0=ctEj5Eu&P(4%W9}- XPIu+5*HT41HBqMS``)-av$o~+S94><7mR_O5qh{0^3{U zw=~K;+w8ZrnD@>~m-lU4A5-y>^t0~6Bs-e<9pe6MW>NL?aAdFs037~# AAOHXW literal 0 HcmV?d00001 diff --git a/templates/skin/habra/img/new_16x16.gif b/templates/skin/habra/img/new_16x16.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b511d9aa6297c8b77adb25e9250ad95f395f108 GIT binary patch literal 630 zcmW;J|4+l zt;JZIW}{m_sI6LZu5?#%eYviy`|`QZeLkP}=j%&6{(|TB%*#Kd-CYtzMNtj|Rrk&| z5x}?~BQyplI3j~#g<&r&9t^tCYxAkVgdcM}rWrU`%yCeFaT<(>F&`uavI<84i~tXT zSAZZ0GaOtjygX)D_zCO`co|k7I0-ea7QZ0R)1;|wh!<6#09r&-ySc|QH{~V{9#$tY zyW#Q?mKW!F)#E1ve*&tCS08Mjt&*3(FG>MUeA900A7h$YEi92AHV!OwKYC`Wtmzje zj4~MZVU~lcz+`rh(_;6qr_W9}UXoNODoi7R?;e=FaQcXgkp?`V145^H*3U_@s*VLP zI7uuHGUUcj2lwqa>6>BzbvmH9I81S{(wJn4Ur=XQSy2=xC%$-Z`!Yi6U-x&}h@FKX zDT0LNPouo7JZ&4b(J)!uqA0SQ)bP>PJr6^5Z|4s;{@Wk~2T_!PN~0G1dqOQSR~k}_ zii3A$XNT+3ZW^kp!msEb>(6Ih+O}~`wLzCt8?Cuke)RVK=T*7`4Vu%Nbf>}&mbDzK z)kMdI9MRo4nbLBrHvjn5vmXm zp|MHHF{|U3B}4|Db)HDFPbRKh97nqwP%bG+MT%%o+MZ!I_lEj=0)z+{-UVD`#shB I?od?LUm}~T5dZ)H literal 0 HcmV?d00001