Программный комплекс управления сайтом с использованием "Kohana Framework"
Разработка структурной схемы и интерфейса программного комплекса управления сайтом. Выбор языка программирования. Принципы тестирования программы. Разработка руководства оператора и системного программиста. Расчет сметы затрат на программный продукт.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 11.06.2012 |
Размер файла | 4,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
9. http://www.sdelaysite.com/php/php-1
10. http://kohana3.ru/
11. http://www.webcorp.ru/page/cmsabout.html
12. http://habrahabr.ru/hub/kohanaphp/
13. http://blogocms.ru/category/tryuki-vebmastera/kohana/
14. http://forum.php.su/
15. http://vremenno.net/html-css/css3-review/
16. http://1popov.ru/bonuscourse/cssform/
17. http://ckeditor.com/
18. http://htmlpurifier.org/
19. http://github.com
20. http://www.apache.org/
21. http://www.php.net/
22. http://www.mysql.com/
23. http://validator.w3.org/
Приложение. Код программы
..\css\auth.css
@charset "UTF-8";
#close-button{
position: absolute;
z-index:30;
bottom: 4px;
right: 2px;}
#ptext{
margin: 5px 0 0 0;}
#slider p a,#close-button{
color: #000;}
.btmimg:hover{
background-image: url(/img/buttonover.png);
background-repeat: no-repeat;
width: 110px;
height: 45px;
margin: 0 auto;
padding-top: 2px;
border: none;}
.btmimg{
background-image: url(/img/buttonout.png);
background-repeat: no-repeat;
width: 110px;
height: 45px;
margin: 0 auto;
border: none;}
#slider{
font-size: 12px;
font-family: verdana, sans-serif;
color: #333;
position:absolute;
top:-56px;
right:-80px;
z-index:2;
width:200px;
text-align: center;
padding-bottom: 2px;}
#slider-in{
position:relative;
z-index:3;
height:0;
overflow:hidden;
background: rgb(245,246,246); /* Old browsers */
/* IE9 SVG, needs conditional override of 'filter' to 'none' градиент-диагональный */
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjZjVmNmY2IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMjElIiBzdG9wLWNvbG9yPSIjZGJkY2UyIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNDklIiBzdG9wLWNvbG9yPSIjYjhiYWM2IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iODAlIiBzdG9wLWNvbG9yPSIjZGRkZmUzIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Y1ZjZmNiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);
background: -moz-linear-gradient(-45deg, rgba(245,246,246,1) 0%, rgba(219,220,226,1) 21%, rgba(184,186,198,1) 49%, rgba(221,223,227,1) 80%, rgba(245,246,246,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,rgba(245,246,246,1)), color-stop(21%,rgba(219,220,226,1)), color-stop(49%,rgba(184,186,198,1)), color-stop(80%,rgba(221,223,227,1)), color-stop(100%,rgba(245,246,246,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(-45deg, rgba(245,246,246,1) 0%,rgba(219,220,226,1) 21%,rgba(184,186,198,1) 49%,rgba(221,223,227,1) 80%,rgba(245,246,246,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(-45deg, rgba(245,246,246,1) 0%,rgba(219,220,226,1) 21%,rgba(184,186,198,1) 49%,rgba(221,223,227,1) 80%,rgba(245,246,246,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(-45deg, rgba(245,246,246,1) 0%,rgba(219,220,226,1) 21%,rgba(184,186,198,1) 49%,rgba(221,223,227,1) 80%,rgba(245,246,246,1) 100%); /* IE10+ */
background: linear-gradient(-45deg, rgba(245,246,246,1) 0%,rgba(219,220,226,1) 21%,rgba(184,186,198,1) 49%,rgba(221,223,227,1) 80%,rgba(245,246,246,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f6f6', endColorstr='#f5f6f6',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
box-shadow: 0 0 50px #40310a; /* тень - размытая */}
..\css\stylesheet.css
@charset "UTF-8";
@import url(auth.css);
body {
margin:0px;
padding:0px;
min-height: 800px;
min-width: 1024px;
background-attachment: scroll;
background-image: url(../img/background.jpg);
background-repeat: repeat-x;
background-position: left top;}
#content_container {
position: relative;
margin: 0 auto;
width:900px;
min-height: 550px;
background-attachment: scroll;
background-image: url(../img/Untitled-4.png);
background-repeat: no-repeat;
background-position: right center;}
#logo_container {
height:90px;
width:900px;
margin: 0 auto;
min-width: 900px;}
#main_container {
height:70px;
width:900px;
margin: 0 auto;}
#logo_image {
width:255px;
height:75px;
margin-left:10px;
margin-top:15px;
float:left;
background-image: url(../img/logo.png);}
#top_bar_black {
width:100%;
height:90px;
background-color:#000000;}
#bottom_bar_black {
width:100%;
height:80px;
background-color:#000000;}
#nav_block {
width: 500px;
height:90px;
float:right;}
.nav_button {
width: 70px; /*This number you can edit when you need to add more with to fit your text inside the button */
color:#FFFFFF;
font-family:Verdana, Arial, Helvetica, sans-serif;
font-style: italic;
font-size:12px;
margin-left:10px;
margin-top:35px;
text-align:center;
float:left;}
a:hover{
font-style: normal;
font-weight: bold;
color: #fff; }
a {
text-decoration: none;
font-style: italic;
font-weight: normal;
color: #fff;
font-family:Verdana, Arial, Helvetica, sans-serif;
font-style: italic;
font-size:12px; }
#header {
width:500px;
margin-top:50px;
margin-bottom:250px;
float: left;}
.header_content_mainline {
font-size:35px;
color:#000000;
width:500px;
font-style: italic;}
#header_content_boxline {
font-size:35px;
color:#000000;
width:400px;
font-style: italic;}
#header_content_lowerline {
font-size:35px;
color:#FFFFFF;
width:400px;
font-style: italic;}
#header_content_boxcontent {
font-size:12px;
color:#333333;
width:400px;
font-style: italic;}
#header_content_lowerboxcontent {
font-size:12px;
color:#CCCCCC;
width:400px;}
#header_content_tagline {
font-size:12px;
color:#333333;
width:500px;}
#header_lower {
width:400px;
float:left;
margin-right:40px;
margin-bottom:50px;}
#copywriteblock {
margin: 10px auto;
width: 900px;
color:#333333;
font-size:10px;
font-family: verdana;
text-align:right;
text-decoration:none;}
#copywriteblock a{
color: #222;}
#copywriteblock a:hover{
color: #555;}
#clear{clear: both;}
..\css\stylesheetadmin.css
@charset "UTF-8";
body {
margin:0px;
padding:0px;
min-height: 800px;
min-width: 1024px;
background-attachment: scroll;
background-image: url(../img/background.jpg);
background-repeat: repeat-x;
background-position: left top;}
#content_container {
position: relative;
margin: 0 auto;
width:900px;
min-height: 550px;
background-attachment: scroll;
background-image: none;
background-repeat: no-repeat;
background-position: right center;}
#logo_container {
height:90px;
width:900px;
margin: 0 auto;
min-width: 900px;}
#main_container {
height:70px;
width:900px;
margin: 0 auto;}
#logo_image {
width:255px;
height:75px;
margin-left:10px;
margin-top:15px;
float:left;
background-image: url(../img/logo.png);}
#top_bar_black {
width:100%;
height:90px;
background-color:#000000;}
#bottom_bar_black {
width:100%;
height:80px;
background-color:#000000;}
#nav_block {
width: 500px;
height:90px;
float:right;}
.nav_button {
color:#FFFFFF;
font-family:Verdana, Arial, Helvetica, sans-serif;
font-style: italic;
font-size:12px;
margin-left:15px;
margin-top:35px;
text-align:center;
float:left;}
a:hover{
font-style: normal;
font-weight: bold;
color: #fff; }
a {
text-decoration: none;
font-style: italic;
font-weight: normal;
color: #fff;
font-family:Verdana, Arial, Helvetica, sans-serif;
font-style: italic;
font-size:12px; }
#header {
width:500px;
margin-top:50px;
margin-bottom:250px;
float: left;}
.header_content_mainline {
font-size:35px;
color:#000000;
width:500px;
font-style: italic;}
#header_content_boxline {
font-size:35px;
color:#000000;
width:400px;
font-style: italic;}
#header_content_lowerline {
font-size:35px;
color:#FFFFFF;
width:400px;
font-style: italic;}
#header_content_boxcontent {
font-size:12px;
color:#333333;
width:400px;
font-style: italic;}
#header_content_lowerboxcontent {
font-size:12px;
color:#CCCCCC;
width:400px;}
#header_content_tagline {
font-size:12px;
color:#333333;
width:500px;}
#header_lower {
width:400px;
float:left;
margin-right:40px;
margin-bottom:50px;}
#copywriteblock {
margin: 10px auto;
width: 900px;
color:#333333;
font-size:10px;
font-family: verdana;
text-align:right;
text-decoration:none;}
#copywriteblock a{
color: #222;}
#copywriteblock a:hover{
color: #555;}
#clear{clear: both;}
input{
padding: 0 10px;
margin: 5px;}
..\aplication\classes\adminverification.php
<?php defined('SYSPATH') or die('No direct script access.');
class Adminverification extends Controller_Template
{
public function before()
{
$session = Session::instance();
$session->set('auth_redirect', $_SERVER['REQUEST_URI']);
$auth=Auth::instance();
if($auth->logged_in() == 0 ) Request::initial()->redirect('authformer');
if($auth->logged_in('admin') == 0 ) Request::initial()->redirect('netprav');
return parent::before();
}
}
..\aplication\classes\childrenbefore.php
<?php defined('SYSPATH') or die('No direct script access.');
class Childrenbefore extends Controller_Template
{
public function before()
{
$session = Session::instance(); // Создание эземпляра класса Session на основе метода Instance
$session->set('auth_redirect', $_SERVER['REQUEST_URI']); // запись в переменную session методом set страницы которую хотел посетить пользователь
$auth=Auth::instance(); // объявление экземпляра класса авторизации
if($auth->logged_in() == 0) Request::initial()->redirect('authformer'); // если пользователь не авторизован переадресовать его на страницу авторизации
return parent::before();
}
}
..\aplication\classes\exception404.php
<?php defined('SYSPATH') or die('No direct script access.');
class Exception404
{
public static function handle(Exception $e) // На вход приходит ошибка
{
switch (get_class($e))
{
case 'HTTP_Exception_404':// сравнивается с 404
$response = new Response;
$response->status(404);// в статус сервера 404
$view = new View('404view'); // использовать вид view404
$view->message = $e->getMessage(); // записать в переменную $message сообщение из контроллера materials -- throw new HTTP_Exception_404('Страница не найдена!');
echo $response->body($view)->send_headers()->body();// генерация отображения
return TRUE;
break;
default:// если не 404 обрабатывать стандартными методами Kohana
return Kohana_Exception::handler($e);
break;
}
}
}
..\aplication\classes\loginverification.php
<?php defined('SYSPATH') or die('No direct script access.');
class Loginverification extends Controller_Template
{
public function before()
{
$session = Session::instance();
$session->set('auth_redirect', $_SERVER['REQUEST_URI']);
$auth=Auth::instance();
if($auth->logged_in() == 0 ) Request::initial()->redirect('authformer');
return parent::before();
}
}
..\aplication\classes\nstree.php (готовый модуль для работы категорий)
<?php defined('SYSPATH') or die('No direct script access.');
/*
CREATE TABLE `tree` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`left_key` INT(10) NOT NULL,
`right_key` INT(10) NOT NULL,
`level` INT(10) NOT NULL,
PRIMARY KEY (`id`),
INDEX `key` (`left_key`, `right_key`, `level`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
*/
class NSTree
{
protected $table = NULL;
public function __construct($tablename)
{
$this->table = $tablename;
}
// Модифицирует ключи
protected function modifyNodes($key, $delta)
{
$query =
'UPDATE '.Database::instance()->quote_table($this->table).'
SET right_key = right_key + '.(int)$delta.'
WHERE right_key >= '.(int)$key;
DB::query(Database::UPDATE, $query)->execute();
$query =
'UPDATE '.Database::instance()->quote_table($this->table).'
SET left_key = left_key + '.(int)$delta.'
WHERE left_key >= '.(int)$key;
DB::query(Database::UPDATE, $query)->execute();
}
public function getNode($id)
{
$result = DB::select()
->from($this->table)
->where('id', '=', $id)
->execute();
if (count($result) == 0)
throw new Exception('Node id='.$id.' does not exist.');
return $result->current();
}
public function clear($extrafields=array())
{
if (!is_array($extrafields))
throw new Exception('$extrafields must be array.');
DB::query(NULL, 'TRUNCATE '.Database::instance()->quote_table($this->table))->execute();
DB::delete($this->table)->execute();
$data = array(
'id' => 1,
'name' => '<root>',
'left_key' => 1,
'right_key' => 2,
'level' => 0
);
$data = $data + $extrafields;
list($insert_id, $tmp) = DB::insert($this->table, array_keys($data))->values(array_values($data))->execute();
return $insert_id;
}
public function getTree($id=NULL)
{
$id = (int) $id;
$QTblName = Database::instance()->quote_table($this->table);
if ($id != 0)
{
$node = $this->getNode($id);
$query =
'SELECT *
FROM '.$QTblName.'
WHERE left_key >= '.(int)$node['left_key'].' AND right_key <= '.(int)$node['right_key'].'
ORDER BY left_key';
}
else
{
$query =
'SELECT *
FROM '.$QTblName.'
ORDER BY left_key';
}
$result = DB::query(Database::SELECT, $query)->execute();
return $result;
}
public function getPath($id)
{
$node = $this->getNode($id);
$query =
'SELECT *
FROM '.Database::instance()->quote_table($this->table).'
WHERE right_key > '.(int)$node['left_key'].' AND left_key < '.(int)$node['right_key'].'
ORDER BY left_key';
$result = DB::query(Database::SELECT, $query)->execute();
return $result;
}
public function insert($id, $extrafields=array())
{
if (!is_array($extrafields))
throw new Exception('$extrafields must be array.');
// Находим родителя
$parent = $this->getNode($id);
DB::query(NULL, 'START TRANSACTION')->execute();
// Обновляем ключи существующего дерева, узлы стоящие за родительским узлом
$this->modifyNodes((int)$parent['right_key'], 2);
// Добавляем новый узел
$node = array(
'id' => NULL,
'left_key' => $parent['right_key'],
'right_key' => $parent['right_key'] + 1,
'level' => $parent['level'] + 1
);
$node = $node + $extrafields;
list($insert_id, $tmp) = DB::insert($this->table, array_keys($node))->values(array_values($node))->execute();
DB::query(NULL, 'COMMIT')->execute();
return $insert_id;
}
public function delete($id)
{
$node = $this->getNode($id);
DB::query(NULL, 'START TRANSACTION')->execute();
// Удаляем узел (вместе с веткой)
$query =
'DELETE FROM '.Database::instance()->quote_table($this->table).'
WHERE left_key >= '.(int)$node['left_key'].' AND right_key <= '.(int)$node['right_key'];
DB::query(Database::DELETE, $query)->execute();
$width = $node['right_key'] - $node['left_key'] + 1;
// Обновление последующих узлов
$this->modifyNodes((int)$node['right_key'], -$width);
DB::query(NULL, 'COMMIT')->execute();
}
// Метод перемещает ноду $id в родительскую ноду $parentId
public function move($id, $parentId)
{
$node = $this->getNode($id);
DB::query(NULL, 'START TRANSACTION')->execute();
// Удаляем узел (вместе с веткой)
$query =
'DELETE FROM '.Database::instance()->quote_table($this->table).'
WHERE left_key >= '.(int)$node['left_key'].' AND right_key <= '.(int)$node['right_key'];
DB::query(Database::DELETE, $query)->execute();
$width = $node['right_key'] - $node['left_key'] + 1;
// Обновление последующих узлов
$this->modifyNodes((int)$node['right_key'], -$width);
//DB::query(NULL, 'COMMIT')->execute();
}
public function check($thorough=FALSE)
{
$QTblName = Database::instance()->quote_table($this->table);
// Тест 1
$query =
'SELECT id
FROM '.$QTblName.'
WHERE MOD(right_key - left_key, 2) = 0';
$result = DB::query(Database::SELECT, $query)->execute();
if (count($result) != 0)
throw new Exception('Test 1 integrity check failed.');
// Тест 2
$query =
'SELECT id
FROM '.$QTblName.'
WHERE MOD(left_key - level + 2, 2) = 0';
$result = DB::query(Database::SELECT, $query)->execute();
if (count($result) != 0)
throw new Exception('Test 2 integrity check failed.');
// Тест 3
if ($thorough)
{
$query =
'SELECT t1.id, COUNT(t1.id) AS rep, MAX(t3.right_key) AS max_right
FROM
'.$QTblName.' AS t1,
'.$QTblName.' AS t2,
'.$QTblName.' AS t3
WHERE
t1.left_key <> t2.left_key
AND
t1.left_key <> t2.right_key
AND
t1.right_key <> t2.left_key
AND
t1.right_key <> t2.right_key
GROUP BY
t1.id
HAVING
max_right <> SQRT( 4 * rep + 1 ) + 1';
$result = DB::query(Database::SELECT, $query)->execute();
if (count($result) != 0)
throw new Exception('Test 3 integrity check failed.');
}
// Тест 4, проверка level
$query =
'SELECT node.id as id, node.level as level
FROM
'.$QTblName.' AS node,
'.$QTblName.' AS parent
WHERE node.left_key BETWEEN parent.left_key AND parent.right_key
GROUP BY node.id
HAVING COUNT(parent.name) - 1 != level
ORDER BY node.left_key';
$result = DB::query(Database::SELECT, $query)->execute();
if (count($result) != 0)
throw new Exception('Test 4 integrity check failed.');
}
}
..\aplication\classes\valid.php
<?php defined('SYSPATH') or die('No direct script access.');
class Valid extends Kohana_Valid
{
public static function check_id($value, $tablename)
{
$id = (int) $value;
if (! preg_match("/^[a-z_]+$/i", $tablename)) return FALSE;
$count = DB::select(array('COUNT("*")', 'total_count'))
->from($tablename)
->where('id', '=', $id)
->execute()
->get('total_count');
if ($count != 1) return FALSE;
return TRUE;
}
}
..\aplication\classes\controller\account.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Account extends Loginverification
{
public $template = 'title';
public function action_index()
{
$data=array();
$myuser = new Model_Myuser();
$data['username'] = $myuser->displayusername(); // в поле username массива data сохранится имя текущего пользователя
if(isset($_POST['btnpassremove']))
{
$oldpass = Arr::get($_POST, 'oldpass', '');
$newpass1 = Arr::get($_POST, 'newpass1', '');
$newpass2 = Arr::get($_POST, 'newpass2', '');
if($myuser->saveNewPass($oldpass, $newpass1, $newpass2))
{
$data['ok']=''; // создание поля ok в массиве data в случае если функции saveNewPass вернулось true(1)
}
else
{
$data['errors']=$myuser->getErrors(); // создание поля errors в массиве и запись ошибок класса myuser в это поле
}
}
$this->template->content=View::factory('accountview', $data); // вывод выбранного вида и массива Data
}
}
..\aplication\classes\controller\ajax.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Ajax extends Controller {
public function action_emailunique()
{
$email = Arr::get($_POST, 'email', '');
$myuser = new Model_Myuser();
$res = $myuser->username_unique($email);
echo json_encode(array('result' => $res));
}
public function action_checkOldPass()
{
$oldpass = Arr::get($_POST, 'oldpass', ''); // передача значения поля oldpass в переменную
$myuser = new Model_Myuser(); // объявление класса Model_Myuser
$res = $myuser->checkOldPass($oldpass); // запись true или false в переменную res по результату проверки метода checkOldPass модели myuser
echo json_encode(array('result' => $res)); // вывод в формате json_encode true или false
}
}
..\aplication\classes\controller\authformer.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Authformer extends Controller_Template // контроллер управления авторизацией пользователей
//расширяется от контроллера Template (внутреннего файла инструкций Kohana)
{
public $template = 'title'; // подключение базового вида
public function action_index() // метод который будет выполнятся по умолчанию
{
$notcapture=Security::xss_clean(Arr::get($_POST, 'authbutton', '')); // берем значение нажатой кнопки входа, сделано это с главной форм ыили с быстрой формы
$captcha = Captcha::instance();
$captcha_image = $captcha->render();
$data=array(); // инициализация пустого массива
$auth = Auth::instance(); // объявление внутреннего класса авторизации
if($auth->logged_in()) // если пользователь авторизован
{
request::initial()->redirect(''); // переадресовать его на главную страницу
}
else // иначе
{
if(isset($_POST['authbutton'])) // если нажата кнопка authbutton
{
$login=Security::xss_clean(Arr::get($_POST, 'login', '')); // в переменную логин записать значение поля логин
$password=Security::xss_clean(Arr::get($_POST, 'password', '')); // в переменную пароль записать значение поля пароль
$capturenka=Captcha::valid(Security::xss_clean(Arr::get($_POST, 'captcha', '')));
if ($notcapture==" ") $capturenka=true; // если нажатие с быстрой формы входа, можно картинку не спрашивать
if(!$capturenka)
{
$data["badimagecode"]="";
}
else
{
if($auth->login($login, $password)) // проверка имени и пароля в базе данных таблицы users внутренним методом Kohana
{
$session = Session::instance(); // Создание эземпляра класса Session на основе метода Instance
$auth_redirect = $session->get('auth_redirect',''); // чтение записанного адреса(котнроллера childrenbefore)
$session->delete('auth_redirect'); // удаление сессии
Request::initial()->redirect($auth_redirect); // переадресация пользователя на страницу которую он хотел посетить до авторизации
}
else
{
$data["errors"]= ""; // если пользователь не ввел логин и пароль либо ввел но их нету в базе запистаь пустую строку в массив
}
}
}
}
$this->template->content = View::factory('authview', $data)->bind('captcha_image', $captcha_image); // вывод вида
}
public function action_logout() // функция разлогирования
{
$auth=Auth::instance(); // объявление класса авторизации
if($auth->logout()); // выполнение внутреннего метода kohana logout
{
$this->template->content="Вы вышли из системы"; // вывод в качестве контента сообщения
request::initial()->redirect(''); // передаресация на главную страницу
}
}
public function action_form()
{
//Закрываем доступ к данному методу из адресной строки
if($this->request->is_initial())
{
throw new HTTP_Exception_404('File not found!');
}
$this->auto_render = FALSE; //не использовать главный шаблон вида "title"
$auth = Auth::instance();
if($auth->logged_in())
{
$this->response->body(View::factory('formloginout'));
}
else
{
$this->response->body(View::factory('formloginin'));
}
}
public function action_reg() // функция регистрации
{
$data = array(); // инициализация пустого массива
$captcha = Captcha::instance();
$captcha_image = $captcha->render();
if(isset($_POST['regbutton'])) // елси нажата кнопка regbutton
{
$email =Security::xss_clean(Arr::get($_POST, 'email', '')); // считать значение из поля email
$password = Security::xss_clean(Arr::get($_POST, 'password', '')); // аналогично
$regcodevalue = Security::xss_clean(Arr::get($_POST, 'regcodevalue', ''));
$capturenka=Captcha::valid(Security::xss_clean(Arr::get($_POST, 'captcha', '')));
if(!$capturenka) {$data["badimagecode"]="";}
else
{
$register = new Model_Reg(); // объявление модели регистрации
if($register->reg($email, $password, $regcodevalue)) // запись в переменную результата функции reg в модели регистрации
// и отправка на вход функции введенных значений
{
$data["regok"] = ""; // елси функция вернула true создадим пустую строку в поле массива regok
}
else
{
$data["errors"] = $register-> errors; // если функция вернула ошибку валидации записать ошибку в массив
}
}
}
// $view_my_form = View::factory('v_myform')->bind('captcha_image', $captcha_image);
// $this->template->content = $view_my_form;
$this->template->content = View::factory('regview', $data)->bind('captcha_image', $captcha_image); // вывод вида regview и массива data
}
public function action_wantnewpassword()
{
$data = array();
if(isset($_POST['passubmit']))
{
$email = Security::xss_clean(Arr::get($_POST, 'email', ''));
$register = new Model_Reg();
if($register->wantnewpassword($email))
{
$data["ok"] = "";
}
else
{
$data["error"] = "";
}
}
$this->template->content = View::factory('rempassview', $data);
}
public function action_checkreg()
{
$kolan = $this->request->param('id');
$data = array();
$register = new Model_Reg();
if($register->regcomplete($kolan))
{
$data["ok"]="";
}
else
{
$data["error"]="";
}
$this->template->content = View::factory('completeregisterview', $data);
}
public function action_checkcode($code)
{
$data = array();
$register = new Model_Reg();
if($register->updatepassword($code))
{
$data["ok"]="";
}
else
{
$data["error"]="";
}
$this->template->content = View::factory('checkcodeview', $data);
}
}
..\aplication\classes\controller\category.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Category extends Childrenbefore
{
public $template = 'title';
public function action_show()
{
$url = $this->request->param('id'); // запись параметра из url
$data = array(); // инициализация пустого массива data
$tree = new Model_Tree(); // объявление экземпляра класса(model_tree)
$data['category'] = $tree->categoryInfoByUrl($url);
// использование метода categoryInfoByUrl модели tree
// метод определит идентификатор и название категории по введенной пользователем ссылке и присвоит их массиву дата
// --образуя многомерный массив--
if(!$data['category']) // проверка существования категории, если ее нету вывести ошибку 404
{
throw new HTTP_Exception_404('Запрашиваемая категория не найдена');
return;
}
$data['materials'] = $tree->contentСategoryById($data['category']['id']);
// создать поле materials и запистаь туда результат обработки метода contentСategoryById
// contentСategoryById получате значение многомерного массива=идентификатору категории(результата обработки categoryInfoByUrl)
// все материалы введенной категории записываются по описанным методам в массив data поле materials
$this->template->content = View::factory('catview', $data);
}
}
..\aplication\classes\controller\materials.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Materials extends Childrenbefore
{
public $template = 'title';
public function action_category()
{
$nametrans = $this->request->param('id'); // передача параметра из ссылки, id будет являтся название категории
// причина названия катогории как идентификатора кроется в маршрутизации Kohana файлом bootstrap
$data = array();
$category = new Model_Category('tree');
$material = new Model_Material();
$category_id = $category->getCategoryIdByUrl($nametrans);
if(!$category_id)
{
// если категории нету, то подключить класс HTTP_Exception_404, его путь использования в bootstrap(настройки)
throw new HTTP_Exception_404('Страница не найдена!');
return; // завершить выполнение функции
}
$data['materials'] = $material->getMaterialsByCategory($category_id);
$this->template->content = View::factory('materialsview', $data);
}
public function action_showcontent()
{
$data = array();
$id = $this->request->param('id'); // звпись последней части url в переменную id
$material = new Model_Material(); // создания экземпляра класса модели material
$data = $material->showMaterialById($id); // запись в массив data результата работы метода showMaterialById
//(на который передаем ид материала) модели material
if(!$data) // если дата передана false она становится true и выдает ошибку ненайденной страницы 404
{
throw new HTTP_Exception_404('Запрашиваемая статья не найдена');
return;
}
$this->template->content = View::factory('contentview', $data);
}
}
..\aplication\classes\controller\netprav.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Netprav extends Childrenbefore
{
public $template = 'title';
public function action_index()
{
$this->template->content = View::factory('dontaccess');
}
}
..\aplication\classes\controller\one.php
<?php defined('SYSPATH') or die('No direct script access.');
// контроллер загружаемый по умолчанию ONE(согласно конфигу коханы 'bootstrap') расширяется от контроллера Template(Внутренний файл инструкций Kohana)
class Controller_One extends Controller_Template
{
public $template = 'title'; // загрузка базового вида
public function action_index() // функция по умолчанию
{
$this->template->content = View::factory('titleview'); // добавление к базовому виду вида страницы titleview
}
}
..\aplication\classes\controller\page.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Page extends Childrenbefore // обычная страница, расширяется от Childrenbefore
{
public $template = 'title'; // испоьзование базового вида страницы
public function action_index() // функция выполняемая по умолчанию
{
$this->template->content = View::factory('pageview'); // вывод вида pageview, добавит вид страницы к базовому
}
}
..\aplication\classes\controller\tag.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Tag extends Childrenbefore
{
public $template = 'title';
public function action_showtag()
{
$url = $this->request->param('id'); // $url присваеваем последнее слово из адреса
$data = array(); // инициализация пустого массива
$tag = new Model_Tag(); // создание экземпляра класса модели_tag
$data['tag'] = $tag->tagInfoByUrl($url); // запись в массив дата поле tag результата работы метода tagInfoByUrl
if(!$data['tag']) // елси тег не найден вывести ошибку
{
throw new HTTP_Exception_404('Запрашиваемый тег не найден!');
return;
}
// если тег найден записать в массив data поле materials результат функции contentTagById в моделе tag
$data['materials'] = $tag->contentTagById($data['tag']['id']); // на вход функции приходит найденный идентификатор тега.
// запись материалов по данному тегу в массив data c полем material и вывод в файл вида tagview
$this->template->content = View::factory('tagview', $data);
}
}
..\aplication\classes\controller\admin\edit.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Admin_Edit extends Adminverification // главный контроллер, наследуется от Adminverification
{
public $template = 'admin/title'; // основной вид страницы
public function action_index() // функция выполняемая по умолчанию index
{
$data = array(); // пустой массив
$category = new Model_Category('tree'); // соединяемся с таблицей категорий
$data['categories'] = $category->getTree(); // получаем их список
$editmatcat = new Model_Editmatcat; // подключаем модель верстки материалов
if(isset($_POST['iscategory'])) // если категория выбрана
{
unset($data['categories']); // чтоб не отображалить категории когда материал уже выбран
$categoryId = Arr::get($_POST, 'SelectCat', ''); // записать ее идентификатор
if($data['matnames'] = $editmatcat->ShowMatNameList($categoryId)); // вывести имена материалов принадлежащих этой категории
}
if(isset($_POST['delcategory'])) // если категория выбрана
{
$categoryId = Security::xss_clean(Arr::get($_POST, 'SelectCat', '')); // записать ее идентификатор
if(($categoryId == "1")and($categoryId == "-1")and($categoryId == ";")and($categoryId == "all")) {$data["main"]="";}
else
{
if($editmatcat->Delmatsfromcategory($categoryId));
Request::initial()->redirect("admin/edit");
}
}
if(isset($_POST['delmaterial'])) // если категория выбрана
{
$SelectMat = Security::xss_clean(Arr::get($_POST, 'SelectMat', '')); // записать ее идентификатор
$midtemp = ORM::factory('material', array('name'=>$SelectMat)); // наследует ОРМ связь с таблицей материал и вынимаем строчку этого материала
$mid = $midtemp->id;
if(($mid == "1")and($mid == "-1")and($mid == ";")and($mid == "all")) {$data["mainm"]="";}
else
{
if($editmatcat->Delmat($mid));
Request::initial()->redirect("admin/edit");
}
}
if(isset($_POST['ismaterial'])) // если материал выбран
{
unset($data['categories']); // чтоб не отображалить категории когда материал уже выбран
$SelectMat = Arr::get($_POST, 'SelectMat', ''); // вынимаем из селекта русское имя материала
$midtemp = ORM::factory('material', array('name'=>$SelectMat)); // наследует ОРМ связь с таблицей материал и вынимаем строчку этого материала
$mid = $midtemp->id;
Request::initial()->redirect("admin/edit/rewrite/$mid");
//$data['content'] = $editmatcat-Show($categoryId,$SelectMat);
//if($editmatcat->)
}
$this->template->content = View::factory('admin/editview', $data);
}
public function action_rewrite()
{
$mid = Security::xss_clean($this->request->param('id'));
$data = array();
$midtemp = ORM::factory('material', array('id'=>$mid));
$data['mn'] = $midtemp->name; // возьмем имя материала
$data['textik'] = $midtemp->content; // и его текстовое содержание
if(isset($_POST['savem']))
{
$newname = Arr::get($_POST, 'mn', '');
$newtextik = Arr::get($_POST, 'content', '');
if(!$midtemp->loaded())
{
return FALSE;
}
$midtemp->name = $newname;
$midtemp->content =$newtextik;
$midtemp->save();
Request::initial()->redirect("admin/edit");
}
$this->template->content = View::factory('admin/editview', $data);
}
}
..\aplication\classes\controller\admin\one.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Admin_One extends Adminverification // главный контроллер, наследуется от Adminverification
{
public $template = 'admin/title'; // основной вид страницы
public function action_index() // функция выполняемая по умолчанию index
{
$category = new Model_Category('tree');
$data['categories'] = $category->getTree();
if(isset($_POST['addcategory']))
{
$categoryName = html::chars( Arr::get($_POST, 'categoryName', ''), false);
$parentId = Arr::get($_POST, 'parentId', '');
$res = $category->catInsert($parentId, array('name'=>$categoryName));
if($res)
{
Request::initial()->redirect('admin');
}
else
{
$data['errors'] = $category->getErrors();
}
}
if(isset($_POST['materialsavebtn'])) // если нажата кнопка materialsavebtn
{
$categoryId = Arr::get($_POST, 'categoryId', ''); // выбранную категорию записать в переменную $categoryId
$content = Arr::get($_POST, 'content', ''); // а содержание текстового поля в $content
$materialname = html::chars(Arr::get($_POST, 'materialname', ''), false);
$tags = html::chars( Arr::get($_POST, 'tagnames', ''), false);
$tagnames = explode(",", $tags); // разбить строку на массив используя запятые
// пример string=one,two,three;
// result[0]=one; result[1]=two; result[2]=three;
//html::chars ($string, false); фильтрация от html тегов в поле
$namevalid = new Model_Namevalid;
if($resu=$namevalid->MatNameValid($materialname)) // если имя материала введено
{
if($resu=$namevalid->TagNameValid($tags))
{
$material = ORM::factory('material'); // то добавим его в базу данных в таблицу materials
$material->addMaterial($categoryId, $content, $materialname);
$matid=$material->ShowIdFromAddMaterial($materialname); // получим идентификтаор добавленного материала
$result = count($tagnames);
for ($x=0; $x<$result;)
{
$tag = new Model_Tag;
$name=$tagnames[$x];
$tag->tagadd($matid, $name);
unset($name);
$x++;
}
Request::initial()->redirect('admin');
}
else
{
$data['errors']=$namevalid->getErrors();
}
// пошлем идентификатор и введенный тег к материалу функции сохранения их в теговые таблицы
// переадрисуем обратно в админку
}
else
{
$data['errors']=$namevalid->getErrors(); // обработка ошибок в имени материала
}
}
$this->template->content = View::factory('admin/adminview', $data);
}
}
..\aplication\classes\controller\admin\users.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Admin_Users extends Adminverification // главный контроллер, наследуется от Adminverification
{
public $template = 'admin/title'; // основной вид страницы
public function action_index() // функция выполняемая по умолчанию index
{
$data=array();
$Searchuser = new Model_Searchuser();
if(isset($_POST['SearchGo']))
{
$SearchUsername = Security::xss_clean(Arr::get($_POST, 'username', ''));
if($names=$Searchuser->find($SearchUsername)and($SearchUsername<>""))
{
$data['name']= $names;
$data['findok'] = "";
}
else
{
$data["findno"] = "";
}
}
$data['usercount']=$Searchuser->usercount();
$data['admincount']=$Searchuser->admincount();
$this->template->content = View::factory('admin/usersview', $data);
}
}
..\aplication\classes\model\addrole.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Addrole extends ORM
{
protected $_table_name = 'roles_users';
}
..\aplication\classes\model\category.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Category
{
protected $nstree;
protected $tableName;
protected $errors = array();
public function __construct($tableName)
{
$this->nstree = new NSTree($tableName);
$this->tableName = $tableName;
}
public function getTree()
{
return $this->nstree->getTree();
}
public function catInsert($parentId, $data = array())
{
$data = Arr::extract($data, array('name'));
$text=$data['name'];
$generation = new Model_Generation;
$data['nametrans']=$generation->TanslitGeneration($text);
$vData = $data;
$vData['parentId'] = $parentId;
$nametrans=$data['nametrans'];
$validation = Validation::factory($vData);
$validation->rule('name', 'not_empty');
$validation->rule('name', 'regex', array(':value', '/^[A-я0-9]++$/iD'));
$validation->rule('name', 'min_length', array(':value', '3'));
$validation->rule('name', 'max_length', array(':value', '200'));
$validation->rule('parentId', 'check_id', array(':value', $this->tableName));
$validation->rule('nametrans', array($this, 'unique_url'));
if(!$validation->check())
{
$this->errors = $validation->errors('catErrors');
return FALSE;
}
// Транслит для правильного исопльзования в url
$this->nstree->insert($parentId, $data);
return TRUE;
}
public function getErrors()
{
return $this->errors;
}
public function unique_url($nametrans)
{
return ! DB::select(array(DB::expr('COUNT(nametrans)'), 'total'))
->from($this->tableName)
->where('nametrans', '=', $nametrans)
->execute()
->get('total');
}
public function getCategoryIdByUrl($nametrans)
{
$data = DB::select('id')
->from($this->tableName)
->where('nametrans', '=', $nametrans)
->execute()
->current();
if(!isset($data['id'])) return FALSE;
return $data['id'];
}
}
..\aplication\classes\model\editmatcat.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Editmatcat
{
public function Delmatsfromcategory($categoryId)
{
$query = DB::delete('materials')
->where('category_id', '=', $categoryId);
$result = $query->as_object()->execute();
$query = DB::delete('tree')
->where('id', '=', $categoryId);
$result = $query->as_object()->execute();
return true;
}
public function Delmat($mid)
{
$query = DB::delete('materials')
->where('id', '=', $mid);
$result = $query->as_object()->execute();
return true;
}
public function ShowMatNameList($category_id)
{
$query = DB::select('name')
->from('materials')
->where('category_id', '=', $category_id);
$result = $query->execute()->as_array();
return $result;
}
}
..\aplication\classes\model\generation.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Generation
{
public function PasswordGeneration ($symbols)//кол-во символов в пароле
{
$arr = array('a','b','c','d','e','f',
'g','h','i','j','k','l',
'w','q','s','n','o','v',
't','u','m','x','y','z',
'A','B','C','D','E','F',
'G','H','I','J','K','L',
'W','Q','M','P','R','S',
'U','T','V','I','Y','Z',
'0','2','6','4','5','3',
'7','8','9','1');
//генерируем пасс
$pass = "";
for($a=0; $a<$symbols; $a++)
{
//вычисляем случайный индекс массива
$index = rand(0, count($arr) - 1);
$pass.= $arr[$index];
}
return $pass;
}
public function TanslitGeneration($str)
{
$arr = array(
"А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
"Д"=>"D","Е"=>"E","Ё"=>"E","Ж"=>"J","З"=>"Z","И"=>"I",
"Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
"О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
"У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
"Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
"Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"e","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
);
return strtr($str,$arr);
}
}
..\aplication\classes\model\material.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Material extends ORM // работает с таблицей Materials поскольку метод ORM всегда добавляет в конце букву s.
{protected $_created_column = array('column' => 'createtime', 'format' => TRUE); // внутренний метод kohana
protected $_updated_column = array('column' => 'modtime', 'format' => TRUE); // добавляет в поля время изменения, редактирования
protected $_belongs_to = array( // связь -один к одному- // внутренняя функция kohana // отвечает за то, какой параметр с чем связан с бд
'tree' => array( // название поля --таблицы А--
// 'model' => 'tree', // название связываемой модели()если совпадает с названием массива, то можно не писать строчку)
'foreign_key' => 'category_id', // название связующего поля --таблицы Б--
), );
protected $_has_many = array(
'tag'=>array(
'through'=>'tags_materials', // связь -многие ко многим-
// идентификаторы таблицы tags с tags_id таблицы tags_materials
// не указываются поскольку кохана понимает говорящие названия данных полей
),
);
public function getMaterialsByCategory($category_id)
{
return DB::select()
->from('materials')
->where('category_id', '=', $category_id)
->execute()
->as_array();
}
public function addMaterial($categoryId, $content, $materialname) // получение выбранной категории и введенного контента(текста)
{
$this->category_id = $categoryId;
$this->content = Security::xss_clean($content);
$this->name = Security::xss_clean($materialname); // Security::xss_clean вырежит из содержимого все javascript'ы
// с помощью подключенного модуля purifier(внешняя библиотека)
$this->save(); // запись в базу идентификатора и контента
}
public function ShowIdFromAddMaterial($materialname)
{
$id = ORM::factory('material', array('name'=>$materialname)); // загрузка строки из бд где id = записанному в переменную $userId
$materialname=$id->id; // запишем в переменную $materialname идентификатор найденной строчки только что сохданного материала
return $materialname; // вернем идентификатор в качестве результата функции
}
public function showMaterialById($id) // нам приходит url пользователя(ид материала)
{
$material = ORM::factory('material', array('id'=>$id)); // создание экземпляра класса material для работы с бд (таблица materials)
// ищется и записывается строка с переданным идентификатором
if($material->loaded()) // проверка загруженна ли строка вообще
{
$res = $material->tag->find_all(); // создать массив res в который запистаь действие метода find_all над дополнительным полем tag
foreach($res as $item)
{
$taginfo[] = array('name' => $item->name); // с каждой итерацией цикла записываем
// в массив $taginfo с полями 1,2,...n имена наших материалов
}
$result['content'] = $material->content; // в массив result поле контент записать контент таблицы materials по найденному идентификатору
$result['name'] = $material->name; // аналогично
$result['category'] = $material->tree->name; // получаем доступ к таблице трии и берем от туда название категории с текущим идентификтаором
$result['tag'] = $taginfo; // запись массива taginfo в массив result с полем tag получается многомерный массив
// поля массива $result станут полями массива $data(только если дата не имела полей до этого)
return $result; // функция вернет значения массива result
}
else // если нет, то возвращаем false и заверщаем функцию
{
return FALSE;
}
}
}
..\aplication\classes\model\myuser.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Myuser extends ORM
{
protected $_table_name = 'users';
protected $errors=array(); // защищенное свойство доступ только у наследников
public function rules()
{
return array(
'password' => array(
array('not_empty'),
array('min_length', array(':value', 7)),
),
'username' => array(
array('not_empty'),
array('min_length', array(':value', 8)),
array('max_length', array(':value', 80)),
array('email'),
array(array($this, 'username_unique')),
),
);
}
public function username_unique($username)
{
$db = Database::instance();
if ($this->id)
{
$query =
'SELECT id
FROM users
WHERE id != '.$this->id.' AND username = '.$db->escape($username);
}
else
{
$query =
'SELECT id
FROM users
WHERE username = '.$db->escape($username);
}
$result = $db->query(Database::SELECT, $query, FALSE)->as_array();
if (count($result) > 0)
{
return FALSE;
}
else
{
return TRUE;
}
}
public function displayusername() // возвращает --имя пользователя-- по методу сравнения с его идентификатором
{
$auth = Auth::instance(); // объявление класса авторизации
$userId = $auth->get_user(); // get_user возвращает идентификатор авторизованного пользователя
$usertemp = ORM::factory('myuser', array('id'=>$userId)); // загрузка строки из бд где id = записанному в переменную $userId
return $usertemp->username; // из этой строки берем имя пользователя
}
public function checkOldPass($oldpass) // проверяет введенный в поле пароль с оригиналом вернет --true или false--
{
$auth = Auth::instance(); // объявление класса авторизации
return $auth->check_password($oldpass); // функция check_password(внутренний метод Kohana) получает введенный пароль и сверяет его с паролем в базе у текущего пользователя
}
public function saveNewPass($oldpass, $newpass1, $newpass2)
{
$vData = array("oldpass" => $oldpass, "newpass1" => $newpass1, "newpass2" => $newpass2,); //(для удобства ассоциативен) записываем введенные пароли (старый и новые в массив)
// массив нужен для использования внутреннего метода kohana валидации полей и значений
$validation = Validation::factory($vData); // создание экземпляра класса валидации Kohana и на его вход передается наш ассоциативный массив
$validation->rule('oldpass', 'not_empty'); // внутренняя функция Kohana не дающаяя полю быть пустым
$validation->rule('oldpass', 'alpha_numeric'); // внутренняя функция Kohana допускает только цифры и англ буквы
$validation->rule('oldpass', array($this, 'checkOldPass')); // введенное в поле значение будет отправлено методу checkOldPass выше
$validation->rule('newpass1', 'not_empty');
$validation->rule('newpass1', 'regex', array(':value', '/^[A-z0-9_]++$/iD'));
$validation->rule('newpass1', 'matches', array(':validation', 'newpass1', 'newpass2')); // сравнение newpass1 и newpass2 на идентичность
$validation->rule('newpass1', 'min_length', array(':value', '7'));
$validation->rule('newpass1', 'max_length', array(':value', '16'));
if(!$validation->check()) // запуск внуртеннего метода проверки валидации. Если ошибочно вернет false и превратится в true
{
$this->errors = $validation->errors('catErrors'); // у текущего класса(myuser) в свойство errors (объявлено выше) записываются ошибки по причине которых не прошла валидация
return FALSE; // вернет методу saveNewPass тем самым завершит выполнение
}
$auth = Auth::instance(); // действие описано в комментариях метода displayusername
$userId = $auth->get_user();
$usertemp = ORM::factory('myuser', array('id'=>$userId)); // поиск пользователя с текущим идентификатором
$usertemp->password = $auth->hash_password($newpass1); // запись на место его пароля нового в зашифрованном виде
$usertemp->save(); // сохранение действия записи
return TRUE; // прекращение выполнения функции и передача ей true(1)
}
public function getErrors()
{
return $this->errors; // вовращении функции существующих ошибок в model Myuser
}
}
..\aplication\classes\model\namevalid.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Namevalid
{
protected $errors=array();
public function MatNameValid($materialname)
{
$vData = array("materialname" => $materialname,);
$validation = Validation::factory($vData);
$validation->rule('materialname', 'not_empty');
$validation->rule('materialname', 'min_length', array(':value', '3'));
$validation->rule('materialname', 'max_length', array(':value', '20'));
if(!$validation->check())
{
$this->errors = $validation->errors('addmatErrors');
return FALSE;
}
return TRUE;
}
public function TagNameValid($tags)
{
$vData = array("tags" => $tags,);
$validation = Validation::factory($vData);
$validation->rule('tags', 'not_empty');
if(!$validation->check())
{
$this->errors = $validation->errors('addmatErrors');
return FALSE;
}
return TRUE;
}
public function getErrors()
{return $this->errors;}}
..\aplication\classes\model\reg.php
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Reg
{
public function getErrors() // функция обработки ошибок валидации
{
return $this->errors; // функция вернет записанную ошибку
}
public function reg($email, $password, $regcodevalue, $data = array()) // получаем введенные значения и пустой массив
{
$data['password'] = $password; // в массив data поле пароля записываем введенный пароль
$data = Arr::extract($data, array('password')); // извлекаем пароль из массива
$validation = Validation::factory($data); // объявляем метод вализации переменной data
$validation->rule('password', 'not_empty');
$validation->rule('password', 'regex', array(':value', '/^[A-z0-9_]++$/iD'));
$validation->rule('password', 'min_length', array(':value', '7'));
$validation->rule('password', 'max_length', array(':value', '16'));
if(!$validation->check())
{
$this->errors = $validation->errors('catErrors');
return FALSE;
}
$regcode = new Model_Regcode();
$myuser = new Model_Myuser();
$regcode->code = $regcodevalue;
try
{
$regcode->check(); // метод чек проверяет параметры на правила
}
catch(ORM_Validation_Exception $e)
{
$this->errors = $e->errors('validation');
return FALSE;
}
// создание пользователя
$myuser->username = $email;
$myuser->email = $email;
// берем сгенерированный пароль в размере 16 символов
$generation = new Model_Generation();
Подобные документы
Обзор существующих решений и обоснование выбора языка программирования. Разработка структурной схемы, интерфейса программного продукта. Технические требования к оборудованию, тест программного продукта, руководство системного программиста и оператора.
дипломная работа [2,0 M], добавлен 10.07.2012Техническое задание на разработку программного продукта и требования к программе. Написание алгоритма работы и разработка интерфейса программы. Руководство системного программиста и оператора. Основные методы и принципы тестирования базы данных.
дипломная работа [2,7 M], добавлен 27.01.2013Проектирование программного обеспечения для классифицирования выпускников высшего учебного заведения. Выбор системы управления базами данных и языка программирования. Разработка структуры данных, схема базы данных. Реализация программного комплекса.
дипломная работа [2,4 M], добавлен 27.03.2013Функциональная структура приложения. Спецификация и структурная диаграмма программного комплекса. Блок-схемы алгоритмов ряда модулей. Данные для тестирования программных модулей и программного комплекса в целом, инструкция пользователя по работе с ним.
курсовая работа [58,5 K], добавлен 25.02.2012Обзор систем управления сайтом, регистрации и отслеживания ошибок. Создание проекта "Senet" в системе регистрации и отслеживания проблем Mantis. Расчет затрат на разработку и эксплуатацию программного обеспечения. Охрана труда и техника безопасности.
дипломная работа [1,7 M], добавлен 24.06.2015Методика и этапы проектирования ядра системы управления сайтом с помощью среды Zend Studio 8. Разработка обработчиков событий, для управления этой системой. Создание каскадных таблиц стилей для оформления панели администрирования с помощью Notepad++.
дипломная работа [4,6 M], добавлен 30.06.2011Исследование организационной структуры ООО "Трансэнергосервис". Обзор методологий проектирования интернет-представительства. Инструментальные средства разработки и реализации системы управления сайтом: разработка интерфейса пользователя и web-сайта.
дипломная работа [1,7 M], добавлен 10.08.2014Обоснование выбора программно-технических средств. Надежность программы и состав технических средств. Разработка структурной схемы программы, алгоритмического и программного интерфейса. Технология разработки интерфейса пользователя и программных модулей.
дипломная работа [3,2 M], добавлен 22.01.2013Описание алгоритмов работы программного блока, тестирования, сохранения результатов, просмотра статистики и построения графика. Разработка пользовательского интерфейса. Анализ тестовых испытаний программного блока. Руководство оператора. Охрана труда.
дипломная работа [4,4 M], добавлен 06.03.2013Программный комплекс автоматизации телефонных соединений. Разработка графического интерфейса пользователя, технологической инструкции для пользователя программы, контроля и аттестации программ. Расчет затрат при автоматизации телефонных соединений.
дипломная работа [4,7 M], добавлен 15.10.2013