Написание CMS на Kohana 3.2 — 2 статья

Здравствуйте дорогие читатели ,в этом уроке мы продолжим написание основы для нашей cms.
Будущее название cms — Pegas CMS ).

Наш примерный план на сегодня:
1. Написание дизайна для cms
2. Создание конфигов
3. Дописать базовый контроллер ,для вывода необходимых данных в шаблоны

1. Написание дизайна для cms
С нуля дизайн мы писать не будем ,а возьмем бесплатный шаблон и его переделаем под свои нужды.
В папке themes/default создадим папки —css ,js,images.
В папке css создадим файл стилей — main.css

body {
	font-family: Arial, Helvetica, sans-serif;
	margin: 0px;
	padding: 0px;
	font-size: 12px;
	background: #ffffff url('images/bg.gif') left top repeat-x;
	color: #1e1e1e;
}
a, a:visited, a:active {
	color: #7f0000;
	text-decoration: none;
}
a:hover {
	color: #7f0000;
	text-decoration: underline;
}
img {
	padding: 0px;
	border: 0px;
}
img.alignright {
	float: right;
	margin: 0px 0px 5px 12px;
	}
img.alignleft {
	float: left;
	margin: 0px 12px 5px 0px;
	}
#container {
	width: 920px;
	margin: 0 auto;
}
#header {
	width: 920px;
	height: 180px;
	margin: 0px 0px 0px 0px;
	padding: 0px;
	float: left;
}
#header h1 {
	font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
	letter-spacing: -1px;
	color: #000000;
	font-size: 52px;
	font-weight: bold;
	line-height: 100%;
	margin: 35px 0px 0px 5px;
	padding: 0px;
}
#header h1 span {
	color: #7f0000;
}
#header h1 a, #header h1 a:visited, #header h1 a:active, #header h1 a:hover {
	font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
	letter-spacing: -1px;
	color: #000000;
	font-size: 52px;
	font-weight: bold;
	text-decoration: none;
	line-height: 100%;
}
#header p {
	font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
	margin: 0px 0px 0px 5px;
	padding: 0px;
	text-align: left;
	font-size: 14px;
	color: #3e3e3e;
}
#topmenu {
	float: left;
	padding: 0px 0px 0px 5px;
	margin: 33px 0px 0px 0px;
}
#topmenu ul {
	display: inline;
	margin: 0px;
	padding: 0px;
}
#topmenu li {
	display: inline;
	list-style: none;
	margin: 0px;
	padding: 0px;
}
#topmenu li a, #topmenu li a:visited, #topmenu li a:active {
	display: block;
	color: #484833;
	font-weight: bold;
	text-decoration: none;
	float: left;
	margin: 0px 15px 0px 5px;
	padding: 14px 3px 13px 3px;
}
#topmenu li a:hover {
	margin: 0px 15px 0px 5px;
	padding: 14px 3px 6px 3px;
	border-bottom: 5px solid #929281;
	color: #000000;
}
#contentcontainer {
	clear: both;
	float: left;
	width: 920px;
	margin: 0px 0px 0px 0px;
	padding: 0px;
}
#content {
	width: 640px;
	float: left;
	display: inline;
	margin: 38px 35px 60px 5px;
	padding: 0px;
}
.post {
	margin: 0px;
	padding: 0px;
}
.entry {
	margin: 18px 0px 0px 0px;
	padding: 0px;
}
#content p {
	line-height: 130%;
}
#content h2, #content h2 a, #content h2 a:visited, #content h2 a:active {
	font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
	font-size: 22px;
	text-decoration: none;
	font-weight: bold;
	color: #7f0000;
	margin: 0px;
}
#content h2 a:hover {
	color: #7f0000;
	text-decoration: underline;
}
.posted {
	font-size: 11px;
	background: url('images/dotted1.gif') left bottom repeat-x;
	margin-top: 0px;
	padding-bottom: 4px;
	margin-bottom: 0px;
}
.posted a, .posted a:visited, .posted a:active {
	font-size: 11px;
	color: #1e1e1e;
	margin-top: 0px;
	margin-bottom: 0px;
	padding-bottom: 3px;
}
.posted a:hover {
	text-decoration: underline;
}
.metadata {
	text-align: right;
	padding: 3px 8px 5px 3px;
	margin: 19px 0px 14px 0px;
}
.postcomment {
	background: url('images/iconcom.gif') no-repeat left center;
	padding: 0px 0px 3px 19px;
}
blockquote {
	margin: 15px 30px 15px 5px;
	padding-left: 10px;
	border-left: 5px solid #e8e8e8;
}
#content .postpagesnav {
	margin: 25px 5px 5px 5px;
	padding: 0px;
	}
#content .postpagesnav .older {
	width:50%;
	float:left;
	}
#content .postpagesnav .newer {
	width: 50%;
	float: right;
	text-align:right;
	}
form {
	margin: 15px 10px 15px 10px;
	padding: 10px 15px 10px 15px;
	background-color: #e8e8e8;
	border: 1px solid #aaaaaa;
}
input {
	border: 1px solid #aaaaaa;
	color: #1e1e1e;
}
.submit {
	background: #d8d8d8;
}
textarea {
	border: 1px solid #aaaaaa;
	color: #1e1e1e;
	width: 65%;
}
#sidebar {
	width: 230px;
	margin: 40px 5px 60px 5px;
	float: left;
}
#sidebar h2 {
	font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
	color: #1e1e1e;
	padding: 0px 10px 5px 13px;
	background: url('images/h2bg.gif') no-repeat top left;
	font-size: 16px;
	font-weight: normal;
	margin-top: 0px;
	margin-bottom: 4px;
}
#sidebar p {
	padding: 0px 5px 10px 10px;
}
#searchform {
	margin: 10px 0px 21px 5px;
	padding: 0px 0px 0px 10px;
	border: 0;
	background: #ffffff;
}
#searchfield {
	border: 1px solid #aaaaaa;
	color: #1e1e1e;
	width: 180px;
	padding: 1px;
	margin: 1px;
	height: 18px;
}
#sidebar ul li ul li a, #sidebar ul li ul li a:visited, #sidebar ul li ul li a:active {
	font-size: 12px;
	padding-left: 10px;
	background:  url('images/link.gif') no-repeat left 4px;
	text-decoration: none;
}
#sidebar ul li ul li a:hover {
	text-decoration: underline;
}
#sidebar ul {
	list-style: none;
	margin: 0px;
	padding: 0px;
}
#sidebar li {
	margin: 0px 5px 0px 5px;
}
#sidebar ul li ul {
	list-style: none;
	margin: 1px 0px 16px 0px;
	padding-right: 0px;
}
#sidebar ul li ul li {
	margin-left: 3px;
	background: url('images/dotted2.gif') 11px bottom no-repeat;
	margin-bottom: 1px;
	padding: 2px 0px 4px 10px;
}
#footer {
	padding: 15px 25px 10px 25px;
	clear: both;
	text-align: center;
	border-top: 1px solid #aaaaaa;
	background: #e8e8e8;
	margin-top: 60px;
	display: block;
}
#footer p {
	color: #666666;
}
#footer a, #footer a:visited, #footer a:active {
	font-size: 12px;
	color: #666666;
	text-decoration: underline;
}
#footer a:hover {
	text-decoration: underline;
}

Изображения для папки — images, можно будет взять в исходниках.
Также допишем стандартный файл вида.

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  <title><?php echo $title ?></title>
  <meta name="keywords" content="<?php echo $keywords ?>" />
  <meta name="description" content="<?php echo $description ?>" />
  <?php
  foreach($styles as $style) {
   echo HTML::style('themes/default/css/'.$style.'.css');
  }
  /*
  foreach($scripts as $script) {
   echo HTML::script('themes/default/css/'.$script.'.js');
  }
  */
  ?>
 </head>
 <body>
 <div id="container">
  <header>
  <div id="header">
		<h1>PEGAS <span>CMS</span></h1>
		<p>Based on framework Kohana 3.2</p>
		<div id="topmenu">
		<ul>
			<li><?php echo HTML::anchor('/#', 'Главная'); ?></li>
			<li><?php echo HTML::anchor('/about/', 'О Pegas CMS'); ?></li>
		</ul>
		</div>
  </div>
  </header>
 <div id="contentcontainer">
		<div id="content">
		<!-- ### Post Entry Begin ###  -->
		<div class="post">
		<?php if(!empty($content))echo $content; ?>
		</div>
		</div>
		<!-- ### Sidebar Begin ### -->
		<div id="sidebar">
		<ul>
		<li><h2>Текстовый блок</h2>
		<ul>
			<li><?php echo HTML::anchor('/#', 'Тестовая ссылка'); ?></li>
		</ul>
		</li>
		</ul>
		</div>
		<!-- ### Sidebar End ### -->
	</div>
 </div>
  <footer>
  <div id="footer">
    &copy; Pegas CMS 2011-<?php echo date('Y'); ?> г
  </div>
  </footer>
 </body>
</html>

Появились новые переменные ,которые пока никак нигде не объявлены ,пока их оставим.
Наши страницы будут отдавать заголовки DOCTYPE как HTML 5. HTML 5 — я думаю это шаг в будущее ,да и почти все браузеры уже вполне адекватно его воспринимают и обрабатывают.
Также мы будем использовать хелперы для удобства.
Подробнее о хелперах можно почитать здесь — Хелперы в kohana 3.2
Наш дизайн готов ,но пока ничего работать не будет так как надо дописать базовый контроллер и разобраться с настройками )
2. Создание конфигов
Создадим файл с настройками в папке application/configmain.php

<?php defined('SYSPATH') or die('No direct access allowed.');
return array(
	'title'       => 'Pegas CMS',
	'keywords'  => 'Pegas CMS',
	'description' => 'Pegas CMS',
	'web_theme' => 'default'
);

3. Дописать базовый контроллер ,для вывода необходимых данных в шаблоны
Наша задача состоит в том чтобы расширить базовый контроллер ,подключить к нему файл с настройками ,сделать передачу необходимых переменных в шаблоны.

<?php defined('SYSPATH') or die('No direct script access.');
abstract class Page extends Controller_Template {
    public $template = 'default';
    public $main_config;
	public $title;
	public $keywords;
	public $description;
    public function before()
    {
	/**
	* Получение основных настроек
	**/
	$this->main_config = Kohana::$config->load('main');
    Kohana::add_path('themes/'.$this->main_config->get('web_theme').'/');
    parent::before();
	$this->template->styles = array('main');
	//$this->template->scripts = '';
    }
	public function after()
	{
	View::set_global(array(
        'title' => !isset($this->title)?$this->main_config->get('title'):$this->title,
	'keywords' => !isset($this->keywords)?$this->main_config->get('keywords'):$this->keywords,
        'description' => !isset($this->description)?$this->main_config->get('description'):$this->description
    ));
	parent::after();
	}
}

Теперь базовый контроллер будет использовать методы для получения основных настроек. После их получения мы также проверим переменные для заголовка,ключевых слов ,описания. Если они не содержат значений то мы используем значения по умолчанию.
Методы класса before ,after — являться в kohana конструкторами ,и деструкторами.
Напишем еще одну страницу для cms — /about
Создадим контроллер /application/classes/controller/about.php

<?php defined('SYSPATH') or die('No direct script access.');
class Controller_About extends Page {
	public function action_index()
	{
        $this->title = 'О Pegas CMS';
        $this->template->content = View::factory('/pages/about');
	}
} // End About

Файл вида /about

<h2>О Pegas CMS</h2>
<p>Pegas CMS</p>

Еще я изменил немного текст в файле вида /views/main заменить данный файл можно взяв его с выкладываемых мной исходниках. Текст больше для наглядности )

В итоге после всех преобразований ,наш внешний вид cms заметно приукраситься ) .Значит и работа пойдет веселее )

Также на будущее работая над cms я могу позабыть изменения которые я вносил ,поэтому если у вас что-то не работает прошу посмотреть исходники ). +Комментарии

Исходники: Скачать исходники pegas_2

Гиламов Данис

Приветствую вас уважаемый посетитель! Меня зовут Данис, на страницах дневника я пишу о том что мне интересно: программирование, саморазвитие, спорт, мои размышления, творчество. Надеюсь вы сможете найди для себя полезную информацию, если вы что-то заметили, захотели обсудить, прошу оставлять комментарии в статьях, в Журнале или Написать мне Для меня - это лучшая награда. Спасибо за внимание :)

Вам также может понравиться ...