Программный комплекс управления сайтом с использованием "Kohana Framework"

 

Оглавление


ВВЕДЕНИЕ

Глава 1 Постановка задачи

1.1 Техническое задание

1.1.1 Основание для разработки

1.1.2 Назначение разработки

1.1.3 Требования к программе

1.1.4 Требования к надежности

1.1.5 Условия эксплуатации и требования к составу и параметрам технических средств

1.1.5.1 Краткие сведения по установке - Apachе

.1.5.2 Краткие сведения по установке - PHP

.1.5.3 Краткие сведения по установке - MySQL

.1.5.4 Краткие сведения по настройке системного - hosts.conf.

.1.5.5 Установка сайта

1.1.6 Требования к информационной и программной совместимости

1.1.7 Требования к программной документации

1.1.8 Стадии и этапы разработки

1.1.9 Порядок контроля приемки

1.2 Обзор существующих решений

1.3 Выбор языка программирования

Глава 2 Основная часть

2.1 Описание программы

2.1.1 Общие сведения

2.1.2 Функциональное назначение

2.1.3 Описание логической структуры

2.1.4 Программное обеспечение, рекомендуемое для функционирования программы

2.2 Руководство системного программиста

2.2.1 Общие сведения о программе

2.2.2 Используемые программные средства

2.2.3 Этапы разработки программы

2.2.4 Проверка программы

2.2.4.1 Общие сведения о тестировании

2.2.4.2 Виды тестирования

2.2.4.3 Методы тестирования

2.2.4.4 Принципы тестирования

2.3 Руководство оператора

2.3.1 Назначение программы

2.3.2 Условия выполнения программы

2.3.3 Выполнение программы

Глава 3 Экономическая часть

3.1 Расчет времени на создание программного продукта

3.2 Расчет годового фонда заработной платы исполнителя по созданию программного продукта

3.3 Расчет начислений на заработную плату

3.4 Расчет расходов на содержание и эксплуатацию ПЭВМ

3.5 Расчет себестоимости программного продукта

3.6 Расчет цены программного продукта

3.7 Расчет экономической эффективности

3.8 Вывод

Глава 4 Техника безопасности при работе по эксплуатации (ПК)

4.1 Общие положения

4.2 Эксплуатация ЭВМ (ПК)

ЗАКЛЮЧЕНИЕ

Список литературы

Приложение. Код программы


Введение


Движок сайта, это жаргонное выражение, правильное название - программный комплекс управления сайтом. Подобная система управления может состоять из множества небольших модулей (т.е. несколько маленьких программ), которые объединены в общую систему. Наиболее часто встречающаяся аббревиатура CMS (Content Management System) - Система Управления Контентом.

Движки, в подавляющем большинстве случаев, программируются на языке PHP, тем не менее, возможно применение других языков, всё зависит от программиста и возможностей хостинга. В любом случае, движок всегда работает в связке с базой данных MySQL (базы данных также должны поддерживаться хостером).

Принцип действия: Для начала, обратимся к работе обычного сайта. Как происходит открытие веб-страницы? В строку браузера вводится адрес и открывается соответствующая ему страница, из тех, которые лежат на сервере. Если адрес введён неправильно, то получим ошибку 404 (на сервере такая страница не обнаружена).

Как происходит открытие страницы на сайте, которой функционирует с помощью CMS? Страниц, как таковых, на сервере нет. Есть база данных, в которой находится текстовая информация и есть программа, которая работает с этой базой данный (тот самый движок). В строку браузера вводится адрес, в соответствии с адресом, программа «выдёргивает» из базы определённый кусок текста, вставляет его в заранее заданный дизайн и показывает посетителю. На все эти действия уходят доли секунды. Таким образом, страница будет генерироваться столько раз, сколько её будут запрашивать посетители. Итак, мы пришли к определениям статической и динамической страницы.

Статическая страница - находится на сервере в виде отдельного файла и отображается при каждом запросе.

Динамическая страница - фактически, её не существует, т.е. она собирается заново при каждом новом запросе посетителя сайта.- это HMVC PHP5 веб фреймворк, предоставляющий средства для разработки web-приложений. Благодаря своей каскадной файловой системе, большому количеству встроенных утилит и последовательному API, он идеально подходит для решения большинства задач, а высокая скорость выполнения и обширные возможности профилирования позволяют ускорить разработку и использовать менее мощные ресурсы для содержания конечного продукта.

Почему именно Kohana?

·Высокая скорость выполнения

·Использование всех возможностей PHP5

·Большое количество встроенных инструментов, в том числе ORM <#"justify">Что делает Kohana отличным фреймворком?

Расширяемость: с помощью удобной каскадной файловой системы <#"justify">Глава 1. Постановка задачи


1.1 Техническое задание


.1.1 Основание для разработки

Основанием для данной работы является задание, выданное на дипломный проект для разработки: «Программный комплекс управления сайтом с использованием Kohana Framework». Задание для дипломного проектирования выдано в соответствии с работами провайдера ООО «Городские информационные сети» и утверждено зам. директора по учебной работе Красногорского государственного колледжа.


.1.2 Назначение разработки

Программный комплекс управления сайтом с использованием Kohana Framework». Данное программное обеспечение может использоваться на любых предприятиях в качестве шаблона движка с возможностями добавления и отображения материалов по иерархии пользовательского доступа.


.1.3 Требования к программе

Программа должна:

1)Отображать категории;

2)Отображать материалы по категориям;

)Производить регистрацию и авторизацию пользователей;

)Отправлять Email сообщения для подтверждения регистрации;

)Предоставлять просмотр и действия согласно уровню доступа пользователя;

)Добавление\редактирование\удаление категорий и материалов;

)Создание тегов к материалам;

)Проверять введенные пользователем значения от вредоносных скриптов;

)Анализировать количество зарегистрированных пользователей и администраторов среди них.


.1.4 Требования к надежности

Программа должна работать с базой данных в соответствии с алгоритмом функционирования, выдавать сообщения об ошибках при неверно заданных исходных данных, поддерживать диалоговый режим в рамках предоставляемых пользователю возможностей. Программа информационно защищена от попыток внедрения вредоносного кода или взлома с целью получения несанкционированного доступа к информации методами Kohana Framework, HTMLPurifier и другими.


.1.5 Условия эксплуатации и требования к составу и параметрам технических средств

Серверная сторона:

На компьютере-сервере должна быть установлена и настроена взаимосвязь веб-серверных программ, содержащий пакет программ:

·Apache version 2.2.17 with OpenSSL

·PHP VC6 version ThreadSafe 5.3.5

·MySQL Community Server version 5.5.x

1.1.5.1 Краткие сведения по установке - Apache

) Установка в режиме Typical

) В файле конфигурации(httpd.conf) изменить.

<directory c:/…/cgi-bin>

</directory>

// Вставить под это пусть к каталогу сайта

<directory c:/site>AllIndexes FollowSymLinksallow,denyFrom all

</directory>

) Снять знак комментария (#) со строчки

Include conflextra/httpd-vhosts.conf

) Найти строку с index.html и добавить через пробел index.php

5) Раскомментировать строку LoadModule rewrite_module modules/mod_rewrite.so

6) В конце файла указать пусть к файлу конфигурации PHP

PHPiniDir c:/Program Files/phpphp5_module c:/Program Files/php/php5apache2_2.dll

7) Перейти в файл httpd-vhosts.conf на редактирование, стереть все конфигурации <virtualhost>…</virtualhost> и записать новые

<virtualhost *:80>

ServerAdmin [email protected] <mailto:[email protected]>c:/site/sitenamelocalhost (или sitename) // доменное имя для браузера www.localhost (или www.sitename) // синоним доменного имени

ErrorLog c:/site/localhost(sitename)/error.logc:/site/localhost(sitename)/access.log common

</virtualhost>

.1.5.2 Краткие сведения по установке - PHP

1) Установка по умолчанию, выбор Apache 2.2.x, указание пути конфигурационного файла Apache, Extension -> все модули

2) Настройка файла конфигурации PHP (php.ini)

Закомментировать модули:

Php_intl.dll

Php_oci8

Php_oci8_11g_pdo_oci_pgsql_pdo_pgsql_sybase_ct

3) Раскомментировать модуль работы сокращенных тегов

Short_open_tag = off // и поменять значение на on

.1.5.3 Краткие сведения по установке - MySQL

) Установка по умолчанию

.1.5.4 Краткие сведения по настройке системного - hosts.conf

) В папке Windows/System32/Drivers/Etc открыть на редактирование файл hosts.conf и добавить строку.

.0.0.1 sitename

.1.5.5 Установка сайта

Скопировать сайт в директорию хранения и обработки веб-сервером

C:/site/sitename.

Создать базу данных mysql с названием kgksite. Указать полны йдоступ с локлаьного компьютера пользователю kgkadminsite с паролем kgkpasswordadmin. (При желании можно настроить в каталоге..сайт\aplication\config).

Загрузить дампы базы данных в базу kgksite .

Клиентская сторона:

Клиентом может являться любой ПК с любой сетевой ОС имеющий браузеры Google Chrome 12, Firefox Mozilla 10, Safari 5.1, Opera 11 и выше. Поскольку некоторые функции такие как CSS 3, HTML 5, PHP 5 не полностью поддерживаются более старыми версиями браузеров, и могут некорректно отображаться.

Набрать в поисковой строке сетевой адрес компьютера сервера.

Минимальные технические требования к ЭВМ, необходимой для нормального функционирования программного обеспечения:

1)Процессор Pentium III

2)Частота 600 Mhz

)Оперативная память 128Mb

4)Видеокарта 64Мb

)Клавиатура и мышь

)Интернет связь (64 Kbite\Sec)

Рекомендуемые технические требования:

)Процессор Pentium IV

2)Частота 1000 Mhz

)Оперативная память 256Mb

4)Видеокарта 128Мb

)Клавиатура и мышь

)Интернет связь (512 Kbite\Sec)


1.1.6 Требования к информационной и программной совместимости

Программа должна работать автономно под управлением веб-серверных программ совместимых с ОС Windows 2000/XP/Vista/Seven,Unix согласно требованиям пункта 1.1.5.


1.1.7 Требования к программной документации

Основными документами, регламентирующими разработку будущих программ, должны быть документы Единой Системы Программной Документации (ЕСПД): руководство системного программиста, руководство оператору, описание программы.


1.1.8 Стадии и этапы разработки

Стадии и этапы разработки велись в соответствии с установленными сроки выполнения работы (Таблица 1).

Таблица 1. Стадии и этапы разработки

ЭтапНаименование работЧем заканчивается работаСрок исполнения, начало окончание1Анализ задания на технологической практике и подготовка раздела «Введение»Написание раздела «Введение»14.04.12 15.04.122Подготовка раздела «Техническое задание»Написание раздела «Техническое задание»15.04.12 18.04.123Подготовка раздела «Постановка задачи»Написание раздела «Постановка задачи»21.04.12 22.04.094Разработка функциональной схемы модуляНаличие функциональной схемы модуля22.04.12 24.04.125Разработка программыРазработка программы24.04.12 26.05.126Тестирование программыГотовая рабочая программа26.05.12 28.05.127Подготовка разделов «Заключение» и «Список литературы»Наличие готовых разделов02.06.12 06.06.128Разработка презентационного материалаПрезентационный материал, выполненный в виде слайдов09.06.12 11.06.12

1.1.9 Порядок контроля приемки

После передачи Исполнителем программы Заказчику, последний имеет право тестировать программу в течение 7 дней. После тестирования Заказчик должен принять работу по данному этапу или в письменном виде изложить причину отказа от принятия. В случае обоснованного отказа Исполнитель обязуется доработать программу.


.2 Обзор существующих решений


Тема «Программный комплекс управления сайтом с использованием Kohana Framework» была выбрана в соответствии потребностями ООО «Городское информационные сети» для разработки программы и написания дипломного проекта. Было просмотрено большое количество сайтов и программ, посвященных соответствующей тематике, и сделаны выводы, что ни один из существующих программных продуктов полностью не удовлетворяет моим требованиям к функциональным характеристикам.

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


1.3 Выбор языка программирования


Для разработки программного продукта на тему дипломного проекта мною была выбрана такая среда программирования, как PHPDesigner 8, которая является универсальным средством для создания веб-продуктов, сайтов и поддерживает подсветку большинства используемого синтаксиса в современных языках программирования, таких как PHP, Javascript, CSS, HTML, XML, SQL, Python, Perl, C# и другие. Основной язык, используемый в данном проекте PHP.

Он представляет собой интерпретатор, обладающий интуитивной и понятной средой визуального программирования, так же обладает большим наборов компонентов, предоставляет возможность создания приятного и в то же время многофункционального интерфейса, дает большие возможности для разработки Web-сервисов и работы с базами данных различных платформ, в частности с MySQL. Это лишь некоторые основные возможности PHPDesigner 8, которые повлияли на мой выбор.

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

Глава 2. Основная часть


2.1 Описание программы


.1.1 Общие сведения

Наименование: «Программный комплекс управления сайтом с использованием Kohana Framework».

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

Начальная стадия разработки интерфейса происходила совместно с разработкой сайта и написанием алгоритма, интерфейс показан на рисунке 1.


Рисунок 1. Интерфейс главной страницы


. Голова (шапка) сайта, приветствующая часть с модулем управления.

.а. Основное меню сайта, переключение материалов и управление действиями.

. Текущий контент (тело) сайта, тематический материал.

. Нижняя часть (ноги) сайта, авторские данные.


.1.2 Функциональное назначение

Программа предназначена для удобного отображения материалов предприятия и извещения пользователей о анонсах данного предприятия.

Программный комплекс управления сайтом отображает древовидную структуру статей, в которой отображаются сведения о выбранной категории и/или их материалы.


.1.3 Описание логической структуры

В состав данной программы входят следующие модули:

. Главный модуль (Controller One);

1)Модули: Admin, Register\Login, 404Error, Materials(NSTree, CKEditor, HTMLPuriFier, ORM, EMail);

2)Сортировка записей в БД;

3)Добавление и редактирование контента;


.1.4 Программное обеспечение, рекомендуемое для функционирования программы

Рекомендуемое клиентское программное обеспечение для наиболее корректного отображения: ОС Windows Seven, браузер Google Chrome 12.

Рекомендуемое серверное программное обеспечение для наиболее корректной работы программы: ОС Windows Seven, Apache version 2.2.17 with OpenSSL, PHP VC6 version ThreadSafe 5.3.5, MySQL Community Server version 5.5.x

Включенные модули работы short_tags и mod_ rewrite.

2.2 Руководство системного программиста


.2.1 Общие сведения о программе

Данная программа предназначена для просмотра и редактирования информации о предприятии, а также для контроля доступа пользователей к материалам.

Программное обеспечение:

ОС MS Windows XP/Vista,/Seven/Unix;

Apache version 2.2.17 with OpenSSL;VC6 version ThreadSafe 5.3.5; Community Server version 5.5.x;

Браузер Google Chrome 12.x

Процессор: не ниже Pentium166.

Базовый язык программирования: PHP.


2.2.2 Используемые программные средства

Программные средства:- Windows 72.2.17 with Open SSLVC6 Version Thread Safe 5.3.5 5.5.x

Среда разработки - PHPDesigner 8

Браузер - Google Chrome 12.x

Управление БД - Navicat 10 Premium

Дизайн - Adobe Photoshop 12.x CS5

Фреймворк - Kohana Framework 3.2.0

Структура программы:

Функциональная схема программы (Рисунок 2).

Рисунок 2. Функциональная схема программы

Структура таблиц базы данных

На рисунке 3 предоставлены диаграммы связей таблиц базы данных.

Схема не полностью отражает действительность и создана лишь графического представления работы сайта с помощью MS Access.


Рисунок 3. Схема данных


В базе данных 8 таблиц (рисунок 4, 5, 6, 7, 8, 9, 10, 11).

Рисунок 4. Таблица «regcodes»


Рисунок 5. Таблица «roles_users»

Рисунок 6. Таблица «tags_materials»


Рисунок 7. Таблица «tree»

Рисунок 8. Таблица «tags»


Рисунок 9. Таблица «roles»

Рисунок 10. Таблица «users»


Рисунок 11. Таблица «materials»

Настройка программы

Подробные сведения по настройке программы для серверной и клиентской части указаны в пункте: 1.1.5 Условия эксплуатации и требования к составу и параметрам технических средств.


.2.3 Этапы разработки программы

Файловая система Kohana Framework представляет собой иерархическую структуру каталогов. Каждый файл, подгружаемый системой с помощью функции Kohana::find_file, по очереди ищется в следующих каталогах:

1.Папка приложения (application). Сначала Kohana ищет файл в папке вашего приложения.

2.Папка каждого из модулей (modules). Затем, файл ищется в каждой папке включенного через Kohana::modules модуля (в том порядке, в котором они определены).

.Системная папка (system). И в последнюю очередь, Kohana ищет файл в собственной системной папке.

Всегда можно расширить функционал системы дополнительным модулем, не изменяя системный каталог (что облегчает обновление версии kohana в дальнейшем) - достаточно создать файл с таким же именем в директории выше по приоритету чтобы переопределить файл (Рисунок 12).


Рисунок 12. Схематическое представление работы Kohana Framework


Разработка программы «Программный комплекс управления сайтом с использованием Kohana Framework» начинается с внедрения собственных страниц, использующих синтаксис Kohana и PHP в директорию разработки страничек aplication (моделей и контроллеров). Kohana -> aplication/classes/-Имя контроллера-.

Создаём новый контроллер для этого откроем среду PHPDesigner 8 и выберем ("Файл" -> "Новый" -> PHP) и добавим начальный код для работоспособности страницы (Рисунок 13). Из выше описанного следует понимать, что контроллер является главным наследуемым классом, который тоже может наследовать системные контроллеры Фреймворка с их функциями и использовать готовые модули Фреймворка.

)На первом этапе необходимо создать дизайн в Adobe Photoshop CS5 и разметить его при помощи CSS и HTML на страницу (Рисунки 15 и 16).

.1)Описать разметку базового (основного), регистрационного и авторотационного, а также просмотра материалов в CSS и HTML используя созданный шаблон в Adobe Photoshop CS5.

)На втором этапе необходимо наименовать контроллер и присвоить ему контроллер от которого он будет расширяться,если таковой имеется (Рисунок 13).

.1Указать основной файл общего вида (отображения) (Рисунок 16).

.2Объявить внутренние экземпляры класса (модели), если таковые требуются (Рисунок 14).

.3Описать тело функции (по умолчанию index) (Рисунок 13 и 14).

.4Добавить и описать тела дополнительных функций, если таковые требуются (Рисунок 13 и 14).

.5Указать файл конкретного вида (отображения) контроллера (Рисунок 17).

)На третьем этапе необходимо совместить отображение обработанных функций в контроллерах и их внешний вид (Рисунок 18)

Результатом выше перечисленных действий становится любая созданная страница сайта на Kohana.

Рисунок 13. Пример контроллера


Рисунок 14. Пример модели

Рисунок 15. Пример базового вида в CSS


Рисунок 16. Пример базового вида HTML+PHP

Рисунок 17. Страница наследник базового вида HTML+PHP


Рисунок 18. Совмещение видового представления где, 1 - это базовый вид, использующейся в большинстве страниц; 2 - это вид текущего контроллера, добавляется в базовый вид;

2.2.4 Проверка программы

2.2.4.1 Общие сведения о тестировании

Каждому программисту известно, сколько времени и сил уходит на отладку и тестирование программ. На этот этап приходится около 50% общей стоимости разработки программного обеспечения.

Но не каждый из разработчиков программных средств может верно определить цель тестирования. Нередко можно услышать, что тестирование - это процесс выполнения программы с целью обнаружения в ней ошибок. Но эта цель недостижима: ни какое самое тщательное тестирование не дает гарантии, что программа не содержит ошибок.

У Г.Майерса другое определение: тестирование - это процесс выполнения программы с целью обнаружения в ней ошибок. Такое определение цели стимулирует поиск ошибок в программах. Отсюда также ясно, что удачным тестом является такой, на котором выполнение программы завершилось с ошибкой. Напротив, неудачным можно назвать тест, не позволивший выявить ошибку в программе

2.2.4.2 Виды тестирования

·Тестирование модуля, или автономное тестирование (module testing, unit testing) - контроль отдельного программного модуля, обычно в изолированной среде (т. е. изолированно от всех остальных модулей).

·Тестирование сопряжении (integration testing) - контроль сопряжений между частями системы (модулями, компонентами, подсистемами).

·Тестирование внешних функций (external function testing) - контроль внешнего поведения системы, определенного внешними спецификациями.

·Тестирование приемлемости (acceptance testing) - проверка соответствия программы требованиям пользователя.

·Комплексное тестирование (system testing) - контроль и/или испытание системы по отношению к исходным целям. Комплексное тестирование является процессом контроля, если оно выполняется в моделируемой среде, и процессом испытания, если выполняется в среде реальной, жизненной.

·Тестирование настройки (installation testing) - проверка соответствия каждого конкретного варианта установки системы с целью выявить любые ошибки, возникшие в процессе настройки системы.

2.2.4.3 Методы тестирования

1. Существует два основных вида тестирования: функциональное и структурное. При функциональном тестировании программа рассматривается как черный ящик (то есть ее текст не используется). Происходит проверка соответствия поведения программы ее внешней спецификации.

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

2. При структурном тестировании программа рассматривается как белый ящик (т.е. ее текст открыт для пользования). Происходит проверка логики программы. Полным тестированием в этом случае будет такое, которое приведет к перебору всех возможных путей на графе передач управления программы (ее управляющем графе). Даже для средних по сложности программ числом таких путей может достигать десятков тысяч. Если ограничиться перебором только линейных не зависимых путей, то и в этом случае исчерпывающее структурное тестирование практически невозможно, т. к. неясно, как подбирать тесты, чтобы обеспечить покрытие всех таких путей.

Поэтому при структурном тестировании необходимо использовать другие критерии его полноты, позволяющие достаточно просто контролировать их выполнение, но не дающие гарантии полной проверки логики программы.

3. Метод большого скачка

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

Метод большого скачка по сравнению с другими подходами имеет много недостатков и мало достоинств. Заглушки и драйверы необходимы для каждого модуля. Модули не интегрируются до самого последнего момента, а это означает, что в течение долгого времени серьезные ошибки в сопряжениях могут остаться необнаруженными. Метод большого скачка значительно усложняет отладку.

И все же большой скачок не всегда нежелателен. Если программа мала и хорошо спроектирована, он может оказаться приемлемым. Однако для крупных программ метод большого скачка обычно губителен.

. Восходящее тестирование

При восходящем подходе программа собирается и тестируется снизу вверх. Только модули самого нижнего уровня (терминальные модули; модули, не вызывающие других модулей) тестируются изолированно, автономно. После того как тестирование этих модулей завершено, вызов их должен быть так же надежен, как вызов встроенной функции языка или оператор присваивания. Затем тестируются модули, непосредственно вызывающие уже проверенные. Эти модули более высокого уровня тестируются не автономно, а вместе с уже проверенными модулями более низкого уровня. Процесс повторяется до тех пор, пока не будет достигнута вершина. Здесь завершаются и тестирование модулей, и тестирование сопряжении программы.

При восходящем тестировании для каждого модуля необходим драйвер: нужно подавать тесты в соответствии с сопряжением тестируемого модуля. Одно из возможных решении - написать для каждого модуля небольшую ведущую программу. Тестовые данные представляются как встроенные непосредственно в эту программу переменные и структуры данных, и она многократно вызывает тестируемый модуль, с каждым вызовом передавая ему новые тестовые данные.

Имеется и лучшее решение: воспользоваться программой тестирования модулей - это инструмент тестирования, позволяющий описывать тесты на специальном языке и избавляющий от необходимости писать драйверы.

2.2.4.4 Принципы тестирования

У Майерса сформулированы также основные принципы организации тестирования:

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

2. Следует по возможности избегать тестирования программы ее автором, т.к. кроме уже указанной объективной сложности тестирования для программистов здесь присутствует и тот фактор, что обнаружение недостатков в своей деятельности противоречит человеческой психологии (однако отладка программы эффективнее всего выполняется именно автором программы);

. По тем же соображениям организация - разработчик программного обеспечения не должна единолично его тестировать (должны существовать организации, специализирующиеся на тестировании программных средств);

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

. Необходимо тщательно подбирать тест не только для правильных (предусмотренных) входных данных, но и для неправильных (непредусмотренных);

6. При анализе результатов каждого теста необходимо проверять, не делает ли программа того, что она не должна делать;

7. Следует сохранять использованные тесты (для повышения эффективности повторного тестирования программы после ее модификации или установки у заказчика).

2.3 Руководство оператора


.3.1 Назначение программы

Данная программа предназначена для просмотра и редактирования информации о предприятии, а также для контроля доступа пользователей к материалам.

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


2.3.2 Условия выполнения программы

Условия необходимые для выполнения программы.

Минимальные:

1)Процессор Pentium III

2)Частота 600 Mhz

)Оперативная память 128Mb

4)Видеокарта 64Мb

)Клавиатура и мышь

)Интернет связь (64 Kbite\Sec)


.3.3 Выполнение программы

Запуск браузера и переход на адрес сайта (Рисунок 18).

Переходим в меню Регистрация и заполняем поля для регистрации на сайте (Рисунок 19).


Рисунок 19. Страница регистрации на сайте


1.Все поля валидируются на наличие вредоносного кода и случайных ошибок заполнения предусмотренных классом регистрации Reg в контроллере Authformer и его дочерними функциями.

.Генерируется динамическое изображение для исключения ботов регистрации. С функцией обновления для удобства осмотра пользователем.

.При валидном заполнении формы данные пересылаются методом POST на обработку модели Reg и ее дочерним функциям, иначе выносится сообщение ошибки пользователю.

.Данные временно записываются в базу данных. Пароль шифруется.

.Пользователю высылается письмо на Email с кодом подтверждения регистрации, принимаемым по ссылку методом GET.

.Пользователь закрепляется в базе данных и получает определенные права.

После регистрации и ее подтверждения по электронной почте, мы можем войти на сайт как пользователь используя Авторизацию (Рисунок 20) и получить доступ к просмотру материалов и категорий сайта.


Рисунок 20. Авторизация-1


1.Первичная авторизация (без генерирования динамического изображения защиты от повторного ввода) позволяет пользователю ввести свои данные и войти на сайт как пользователь.

.В случае удачного входа пользователь попадает на страницу к которой возможно обращался ранее (с помощью сессий), но не смог получить доступ без авторизации. Если вход выполнен неудачен пользователь переносится на страницу Авторизации-2 с защитой от перебора пароля динамически генерируемым изображением.

.На форме имеется ссылка на страницу регистрации

.На форме имеется ссылка на страницу восстановление пароля;

.Имеется кнопка скрыть


Рисунок 16. Авторизация-2


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

.Динамически генерируемое изображение для защиты от переборки пароля (с функцией обновления для удобства осмотра пользователем).

.В остальном работа аналогична первичной форме авторизации.


Рисунок 17. Восстановление пароля


1.Форма работает с использованием Ajax. При вводе E-maila. Мгновенная проверка существования E-maila в БД.

.Пользователь получает ответ в виде зеленой галочки или же красного крестика.

.Обработка запроса и генерирование нового пароля с отсылкой на Email пользователя


Рисунок 18. Пример категории и материалов


1.При выборе категории пользователь получает вид принадлежащих ей материалов.


Рисунок 19. Пример вида материала

1.При выборе материала в категории пользователь получает вид статьи.


Рисунок 19. Страница администрации - добавление


1.Страница с ограниченным по роли пользователя доступом (только для администраторов сайта).

.Возможность создания категорий

.Возможность добавление материалов в категории

.Возможность добавление темовых тегов к материалам

.Использование текстового модуля Ckeditor для улучшения визуализации текстового поля.

.Проверка вредоносности введенных данных в поля с помощью модуля htmlpurifier.


Рисунок 19. Страница администрации - пользователи


1.Поиск пользователя в базе данных сайта.

.Отображение количества зарегистрированных пользователей.

.Отображение количества администраторов среди пользователей.


Глава 3 Экономическая часть


3.1Расчет времени на создание программного продукта


Затраты времени на создание программного продукта дает трудоемкость.

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

Структура общего времени на создание программного продукта представлена в табл.2


Таблица 2. Общее время на создание программного продукта.

№ этапаОбозначение времени данного этапаСодержание этапа1ТпоПодготовка описания задачи2ТоОписание задачи3ТаРазработка алгоритма 4ТбсРазработка блок-схемы алгоритма5ТнНаписание программы на языке PHP6ТпНабивка программы7ТотОткладка и тестирование программы8ТдОформление документации, инструкции пользователю, пояснительной записки

Время рассчитывается в человеко-часах, причем Тпо берется по фактически отработанному времени (исходные данные), а время остальных этапов определяется расчетом по условному числу команд Q.


Условное число команд определяется по формуле:


Q=q*c


где q - коэффициент, учитывающий условное число команд.

Выбрать значение коэффициента q можно из табл.3


Таблица 3. Коэффициент числа команд.

Тип задачиПределы измерений коэффициентаЗадачи учетаот 1400 до 1500Задачи оперативного управленияот 1500 до 1700Задачи планированияот 3000 до 3500Многовариантные задачиот 4500 до 5000Комплексные задачиот 5000 до 5500

где c - коэффициент, учитывающий новизну и сложность программы.

Программные продукты по степени новизны отнесены к одной из 4-х групп:

группа А - разработка принципиально новых задач;

группа Б - разработка оригинальных программ;

группа В - разработка программ с использованием типовых решений;

группа Г - разовая типовая задача.

По степени сложности программные продукты могут быть отнесены к одной из 3-х групп:

- алгоритм оптимизации и моделирования систем;

- задачи учета, отчетности и статистики;

-стандартные алгоритмы.

Коэффициент С определяется из табл.4 на пересечении групп сложности новизны.


Таблица 4. Сложность программы.

Язык программированияГруппа сложностиСтепень новизныАБВГВысокого уровня11,381,261,150,6921,301,191,080,6531,201,101,000,60Низкого уровня11,581,451,320,7921,491,371,240,7431,381,261,150,69

Так как разрабатываемый программный продукт предназначен для решения задач учета, то коэффициент q, выбранный из таблицы 3 равен 1500.

Программа написана на языке высокого уровня и является разовой типовой задачей, следовательно, относится к группе «Г». По степени сложности ПП относится к группе стандартные алгоритмы (группа 3). Из таблицы 4 выбираем соответствующую позицию, равную 0,60. Далее подставляем выбранные данные в формулу:

Q=1500*0,60 =900

Определяем время, затраченное на каждый этап создания программного продукта:

1)Тпо берется по факту. Оно равно 7 (человеко/часов).

2)То определяется по формуле:


То=Q*B/(50*K)


где В - коэффициент учета изменений задачи. Он равен 1,3.

К - коэффициент, учитывающий квалификацию программиста. Выбрать значение коэффициента К можно из табл.5


Таблица 5. Коэффициент квалификации программиста

Стаж программистаЗначение коэффициента Кдо 2-х лет0,8от 2 до 3 лет1,0от 3 до 5 лет1,1 - 1,2от 5 до 10 лет1,2 - 1,3свыше 10 лет1,3 - 1,5Так как стаж программиста до 2-х лет, то подставляем в формулу коэффициент 0,8.

То=900*1,3/(50*0,8)=29,25(чел\час)

)Та рассчитываем по формуле:


Та=Q/(50*K)

Та=900/(50*0,8) =22,5(чел\час)


)Тбс определяется аналогично Та


Тбс= Та = Q/(50*K)

Тбс= Та = 900/(50*0,8) =22,5(чел\час)


)Тн определяется по формуле:


Тн=Q*1,5/(50*K)

Тн=900*1,5/(50*0,8)=33,75 (чел\час)


)Тп определяется по формуле:


Тп=Q/50

Тп=900/50=18(чел\час)


)Тот определяется по формуле:


Тот=Q*4,2/50*K

Тот=900*4,2/50*0,8=94,5(чел\час)


) Тд определяется аналогично Тпо


Тд=Тпо=7 (чел/час)


Теперь зная время, затраченное на каждом этапе, можно подсчитать общее время на создание программного продукта:


Т=Тпо+То+Та+Тбс+Тн+Тп+Тот+Тд

Т=7+29,25+22,5+22,5+33,75+18+94,5+7=234,5 (чел\час)


3.2Расчет годового фонда заработной платы исполнителя по созданию программного продукта


Фонд заработной платы состоит из основной и дополнительной зарплаты.

Основная заработная плата включает оплату по отдельным расценкам, тарифным ставкам, должностному окладу, премии (40%).

Дополнительна заработная плата - это оплата отпусков (11,4%) доплата по территориальному коэффициенту (15%).

Основная ЗП определяется по формуле:


ЗПосн=Х*Кт*Т/Чр*tp.д*(1+П/100)


Где Х- среднемесячная ЗП программиста (руб)- определяется самостоятельно по рыночной ситуации;

Кт- тарифный коэффициент, соответствующий разряду тарифной сетки по которому работает исполнитель (1,3);

Т-общее время на создание программного продукта (чел/час);

Чр- число рабочих дней в месяце (30 дней);

tp.д - продолжительность рабочего дня в часах (8 часов);

П - процент премии.

Рассчитываем зарплаты разработчику:

ЗПосн=23000*1,3*234,5/30*8*(1+40/100)=20867,70 (рублей)

Дополнительная ЗП берется в размере 11,4% от основной.

ЗПд= 39706,10*11,4%=2378,91 (рублей)

Общая ЗП будет равна сумме основной и дополнительной:


ЗПобщая=ЗПосн+ЗПдоп

ЗПобщая=20867,70 +2378,91 =23246,61 (рублей)


3.3Расчет начислений на заработную плату


Социальное страхование в РФ является обязательным каждый хозяйствующий субъект, любой организационно правовой формы собственности отчисляет денежные средства в фонд ЗП во внебюджетные фонды отчисляют на:

.Фонд социального страхования (ФСС) - 2,9 %

. Пенсионный фонд России (ПФР) - 22 %

.Федеральный фонд обеспечения медицинского страхования (ФФОДС) - 5,1 %

Отчисления на социальное страхование, начисляется с заработной платы и включаются в себестоимость программного продукта.


ФСС = ЗП общая * 2,9%

ПФР = ЗП общая * 22%

ФФОДС = ЗП общая * 5,1%

ФСС = 23246,61 * 2,9%=674,15 (рублей)

ПФР = 23246,61 * 22%=5114,25 (рублей)

ФФОДС = 23246,61 * 5,1%=1185,57 (рублей)


Общая сумма отчислений на социальное страхование:

,15 + 5114,25 + 1185,57 = 6973,97 (рублей)

3.4Расчет расходов на содержание и эксплуатацию ПЭВМ


Расходы на содержание и эксплуатацию ПЭВМ рассчитываются по следующим статьям:

)Основная ЗП работников, обеспечивающих функционирование ПВЭМ.

Для системных программистов: Нобсл=25, Кт=2,02


ЗПосн.год.=(Х*Кт/Нобсл.)*((1+П/100)*12)


Средняя заработная плата системного программиста составляет 10000 рублей. Подставляем данные в формулу:


ЗПосн.год.=(10000*2,02/25.)*((1+40/100)*12)=3975,36 (рублей)


)Дополнительная ЗП обслуживающего персонала - 11,3% от основной заработной платы

ЗПд=3975,36 *11,3=449,21 (рублей)

Общая ЗП будет равна сумме основной и дополнительной:


ЗПобщая=ЗПосн+ЗПдоп

ЗПобщая=3975,36 +449,21 =4424,57 (рублей)


)Начисления на ЗП обслуживающего персонала (30%):


Нзп=ЗПгод.о.п*30%

Нзп=4424,57 *30%=1327,37 (рублей)


) Социальные отчисление с заработной платы вспомогательного персонала - СОвп (30% от общей заработной платы)

СОвп=4424,57 *30%=1327,37 (рублей)

)Амортизационные отчисления определяются в размере 25% от балансовой стоимости ЭВМ (Кб)(исходные данные).


А=Кб*25 %

А=25000*25 %=6250 (рублей)


)Затраты на электроэнергию:


Зс.эн(осв)=Фэф * Цэ * P


Фэф - эффективный годовой фонд работы ПЭВМ в часах (2016 часов)

Цэ - стоимость 1кВт/ч.

P - мощность ПЭВМ с периферией в кВт/ч.

P= 0,7-1,2- в зависимости от периферии (определяется самостоятельно)

Так как ПП разрабатывался в Москве, то стоимость 1кВт/ч составляет 2,66 рубля, а коэффициент периферии Р равен 1,2. ПП разрабатывается 234,5 часов, поэтому Фэф=234,5.

Зс.эн(осв)= 234,5* 2,66 * 1,2=748,52 (рублей)

) Расходы на профилактику составляют 2% от балансовой стоимости ПВЭМ с периферией.


Зпроф = Кб * 2%, где Кб - стоимость ПЭВМ


При разработке данного ПП использовался ноутбук марки HP модели, рыночная стоимость которого составляет 25000 рублей. Следовательно, Кб=25000. А затраты на профилактику:

Зпроф = 25000 * 2%=500 (рублей)

) Прочие производственные расходы (Ппр) берутся в размере 30% от основной ЗП работников, обеспечивающих функционирование ЭВМ.

Ппр=ЗПобсл*30%=4424,57 *30%=1327,37 (рублей)

) Определяем годовые расходы на содержание и эксплуатацию 1-ой ЭВМ, для этого складываем все компоненты:


З общие = ЗП общая + Нзп + СОвп + А + Зс.эн(осв) + Зпроф + Ппр

З общие = 4424,57 + 1327,37 + 1327,37 + 6250+ 748,52 + 500 + 1327,37 =15905,2 (рублей)


Далее определяем себестоимость 1-го машино-часа работы ПВЭМ, которая определяется по формуле:


Смч=Зобщ/12/30/8*Т

Смч=15905,2/30/12/8*234,5=1295,05 (рублей)


3.5Расчет себестоимости программного продукта


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

В себестоимость программного продукта входят следующие элементы:

)Основная ЗП исполнителя работ по созданию программного продукта;

)Дополнительная ЗП исполнителя работ по созданию программного продукта;

)Начисления на ЗП:

)Расходы на содержание и эксплуатацию ПВЭМ, относящихся к данному программному продукту;

)Прочие расходы.

Первые 4 элемента уже известны, а прочие расходы составляют 10% от суммы первых 4-х элементов.

Структуру себестоимости программного продукта опишите в таблице 6.


Таблица 6. Расчет себестоимости.

№Элементы себестоимостиСумма (руб)% в общей сумме себестоимости1Основная ЗП исполнителя20867,7041,132Доп. ЗП исполнителя2378,914,693Начисления на ЗП6973,9713,744РС и ПЭВМ15905,231,355Прочие расходы4612,579,09Итого:50738,35100

3.6Расчет цены программного продукта


Цена - это денежное выражение стоимости продукции.

Цена складывается из нескольких компонентов:


Ц=С+П+НДС


Где С - себестоимость программного продукта

П - прибыль, которую берем в размере 40% от себестоимости

НДС- налог на добавленную стоимость, который берется в размере 18% от суммы себестоимости и прибыли.

Ц=50738,35+(50738,35*40%)+((50738,35+(50738,35*40%))*18%)

=83819,75 (рублей)


3.7Расчет экономической эффективности


Эффективность это результативность т.е. получение результата с учетом затрат - более того с минимальными затратами трудовых, материальных, финансовых средств труда.

(проект считается эффективным, если показатель составляет более 15%)


? Пр = приблизительный рост прибыли за два года

КВ - капитальные вложения = себестоимость программного продукта


? Пр=Пр2года-Пр1года


Пр2года берется в размере 65% от себестоимости.

? Пр=(50738,35*65%)-20295.34=12684,58(рублей)

Находим Эа:

Эа=12684,58/50738,35=0,24=24%


3.8Вывод


В экономической части ДП произведен расчет себестоимости и цены программного продукта «Разработка: Программный комплекс управления сайтом с использованием Kohana Framework»,которая показала эффективность создания данного программного продукта, т.к. экономическая эффективность составляет 24 %.

Расчеты отвечают современным требованиям ведения бухгалтерского учета и плановой политики предприятий.

Программа полностью соответствует современным требованиям и стандартам.

программный управление сайт оператор


Глава 4 Техника безопасности при работе по эксплуатации (ПК)


.1 Общие положения


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

Эти явления могут вызвать отклонения в состоянии здоровья, которые проявляются в первую очередь в том, что у человека снижается работоспособность, быстро наступает зрительное утомление, затем появляются признаки ухудшения зрения, нарушения функционального состояния центральной нервной системы. Пока последствия работы с компьютером не изучены до конца. Однако выяснено, что наибольшую опасность представляет электромагнитное излучение. Его уровень превышает допустимые нормативы в 2-5 раз, в то время как уровни ультрафиолетового и инфракрасного излучения значительно ниже принятых гигиенических нормативов, а рентгеновское излучение практически отсутствует.

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

Статистика дает такую информацию об основных заболеваниях при работе с компьютером:

Заболевания органов зрения - 60% пользователей

Сердечно-сосудистая система-60%

Желудочно-кишечный тракт -40%

Кожные заболевания -10%

Для снижения вредного воздействия компьютера на человека необходимо соблюдать определенные требования к условиям работы, к рабочему месту; компьютер должен соответствовать гигиеническим требованиям. Кроме того, необходимо строго соблюдать режим работы на компьютере.


4.2 Эксплуатация ЭВМ (ПК)


На основе сказанного можно сформулировать определенные рекомендации для пользователей персональных компьютеров с точки зрения охраны их труда. Основной подход к решению проблем такого рода сводится к установлению строгого контроля за соответствием аппаратных и программных средств, а так же условий их эксплуатации в соответствии с эргономическими требованиями. Это служит основой для выработки следующих общих рекомендаций: - соблюдение ограничений по медицинским показаниям;

внимательное отношение к характеристикам дисплеев;

правильная организация рабочих мест операторов;

правильная организация работы с ПК;

- соблюдение мер защиты от поражения электрическим током. Раскрывая их, можно сформулировать рекомендации следующего характера:

- необходимо соблюдать ограничение на работу с ПК, для служащих, страдающих заболеваниями опорно-двигательного аппарата, глаз (или нарушениями зрения.), кожи, а также для беременных женщин (во всех случаях лучше получить консультацию у врача);

предпочтительнее использовать дисплеи с достаточно высокой разрешающей способностью;

- лучше выбирать видеоадаптеры с достаточно высоким разрешением и по возможности (если есть на рынке и цена приемлемая) с частотой обновления экранного изображения не менее 70 - 72 Гц;

-обязательно ставить на дисплеи экраны, в частности поляризационные, фильтры, в несколько раз снижающие утомляемость глаз;

- если позволяют условия, то рекомендуется сидеть не ближе 70 см (примерно на расстоянии вытянутой руки) от дисплея;

- экран дисплея не должен быть ориентирован в сторону источников света (окон, настольных ламп и т.п.);

- при размещении рабочего места рядом с окном угол между экраном дисплея и плоскостью окна должен составлять не менее 90 градусов (для исключения бликов), прилегающую часть окна желательно зашторить;

не следует располагать дисплей непосредственно под источником освещения или вплотную с ним;

желательно, чтобы освещенность на рабочем месте оператора ПК не превышала 2/3 нормальной освещенности помещения;

общее время работы с дисплеем не должно превышать 50% от полного рабочего времени оператора;

не следует превышать темп работы порядка 10000 нажатий клавиш в час;

- при обычной работе с компьютером необходимо делать 15 -минутные перерывы через каждые два часа, а при интенсивной работе - через каждый час.


Заключение


Тема дипломного проекта была выбрана в соответствии с заданием, выданном руководителем преддипломной практики.

В первой главе выполнены следующие задачи, а именно: конкретизирована постановка задачи, проведён обзор существующих решений и обоснован выбор языка программирования.

Во второй главе выполнены следующие задачи, а именно: разработана структурная схема, разработан интерфейс программного продукта, определены технические требования к оборудованию, на котором будет выполняться разработанная программа, проведён тест программного продукта, разработано руководство оператора и системного программиста.

В третьей главе выполнена задача по составлению сметы затрат на программный продукт.

Подводя итоги выполненного задания, следует отметить, что в нём были достигнуты поставленная цель и задачи.


Список литературы


1.ГОСТ 19.402 - 78. Описание программы.

2.ГОСТ 19.503 - 79. Руководство системного программиста. Требования к содержанию и оформлению.

.ГОСТ 19.505 - 79. Руководство оператора. Требования к содержанию и оформлению.

.ГОСТ 24.207 - 80. Требования к содержанию документов по программному обеспечению.

.Колисниченко Д.Н. Самоучитель PHP5: в теории и на практике - 2007г.

6.Jason D. Straughan. Kohana 3.0. Beginner's Guide - 2011г.

7.<#"justify">Приложение. Код программы


..\css\auth.css

@charset "UTF-8";

#close-button{: absolute;index:30;: 4px;: 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{size: 12px;family: verdana, sans-serif;: #333;:absolute;:-56px;:-80px;index:2;:200px;align: center;bottom: 2px;}

#slider-in{:relative;index:3;:0;:hidden;: rgb(245,246,246); /* Old browsers */

/* IE9 SVG, needs conditional override of 'filter' to 'none' градиент-диагональный */: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjZjVmNmY2IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMjElIiBzdG9wLWNvbG9yPSIjZGJkY2UyIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNDklIiBzdG9wLWNvbG9yPSIjYjhiYWM2IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iODAlIiBzdG9wLWNvbG9yPSIjZGRkZmUzIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Y1ZjZmNiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);: -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+ */: -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+ */: -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+ */: -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+ */: -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+ */: 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 */: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f6f6', endColorstr='#f5f6f6',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */shadow: 0 0 50px #40310a; /* тень - размытая */}


..\css\stylesheet.css

@charset "UTF-8";

@import url(auth.css);{:0px;:0px;height: 800px;width: 1024px;attachment: scroll;image: url(../img/background.jpg);repeat: repeat-x;position: left top;}

#content_container {: relative;: 0 auto;:900px;height: 550px;attachment: scroll;image: url(../img/Untitled-4.png);repeat: no-repeat;position: right center;}

#logo_container {:90px;:900px;: 0 auto;width: 900px;}

#main_container {:70px;:900px;: 0 auto;}

#logo_image {:255px;:75px;left:10px;top:15px;:left;image: url(../img/logo.png);}

#top_bar_black {:100%;:90px;color:#000000;}

#bottom_bar_black {:100%;:80px;color:#000000;}

#nav_block {: 500px;:90px;:right;}

.nav_button {: 70px; /*This number you can edit when you need to add more with to fit your text inside the button */:#FFFFFF;family:Verdana, Arial, Helvetica, sans-serif;style: italic;size:12px;left:10px;top:35px;align:center;:left;}:hover{style: normal;weight: bold;: #fff; }{ decoration: none;style: italic;weight: normal;: #fff; family:Verdana, Arial, Helvetica, sans-serif;

font-style: italic;size:12px; }

#header {:500px;top:50px;bottom:250px;: left;}

.header_content_mainline {size:35px;:#000000;:500px;style: italic;}



#header_content_boxline {size:35px;:#000000;:400px;style: italic;}

#header_content_lowerline {size:35px;:#FFFFFF;:400px;style: italic;}

#header_content_boxcontent {size:12px;:#333333;:400px;style: italic;}

#header_content_lowerboxcontent {size:12px;:#CCCCCC;:400px;}

#header_content_tagline {size:12px;:#333333;:500px;}

#header_lower {:400px;:left;right:40px;bottom:50px;}

#copywriteblock {: 10px auto;: 900px;:#333333;size:10px;family: verdana;align:right;decoration:none;}

#copywriteblock a{: #222;}

#copywriteblock a:hover{: #555;}

#clear{clear: both;}


..\css\stylesheetadmin.css


@charset "UTF-8";{:0px;:0px;height: 800px;width: 1024px;attachment: scroll;image: url(../img/background.jpg);repeat: repeat-x;position: left top;}

#content_container {: relative;: 0 auto;:900px;height: 550px;attachment: scroll;image: none;repeat: no-repeat;position: right center;}

#logo_container {:90px;:900px;: 0 auto;width: 900px;}

#main_container {:70px;:900px;: 0 auto;}

#logo_image {:255px;:75px;left:10px;top:15px;:left;image: url(../img/logo.png);}

#top_bar_black {:100%;:90px;color:#000000;}

#bottom_bar_black {:100%;:80px;color:#000000;}

#nav_block {: 500px;:90px;:right;}

.nav_button {:#FFFFFF;family:Verdana, Arial, Helvetica, sans-serif;style: italic;size:12px;left:15px;top:35px;align:center;:left;}:hover{style: normal;weight: bold;: #fff; }{ decoration: none;style: italic;weight: normal;: #fff; family:Verdana, Arial, Helvetica, sans-serif;style: italic;size:12px; }

#header {:500px;top:50px;bottom:250px;: left;}

.header_content_mainline {size:35px;:#000000;:500px;style: italic;}

#header_content_boxline {size:35px;:#000000;:400px;style: italic;}

#header_content_lowerline {size:35px;:#FFFFFF;:400px;style: italic;}

#header_content_boxcontent {size:12px;:#333333;:400px;style: italic;}

#header_content_lowerboxcontent {size:12px;:#CCCCCC;:400px;}

#header_content_tagline {size:12px;:#333333;:500px;}

#header_lower {:400px;:left;right:40px;bottom:50px;}

#copywriteblock {: 10px auto;: 900px;:#333333;size:10px;family: verdana;align:right;decoration:none;}

#copywriteblock a{: #222;}

#copywriteblock a:hover{: #555;}

#clear{clear: both;}{: 0 10px;: 5px;}

..\aplication\classes\adminverification.php

<?php defined('SYSPATH') or die('No direct script access.');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.');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.');Exception404

{static function handle(Exception $e) // На вход приходит ошибка

{(get_class($e))

{'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('Страница не найдена!');$response->body($view)->send_headers()->body();// генерация отображения

return TRUE;;:// если не 404 обрабатывать стандартными методами Kohana

return Kohana_Exception::handler($e); ;

}

}

}

..\aplication\classes\loginverification.php

<?php defined('SYSPATH') or die('No direct script access.');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.');

/*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,KEY (`id`),`key` (`left_key`, `right_key`, `level`)

)='utf8_general_ci'=InnoDB

*/NSTree

{$table = NULL;function __construct($tablename)

{

$this->table = $tablename;

}

// Модифицирует ключиfunction modifyNodes($key, $delta)

{

$query =

'UPDATE '.Database::instance()->quote_table($this->table).'right_key = right_key + '.(int)$delta.'right_key >= '.(int)$key;::query(Database::UPDATE, $query)->execute();

$query =

'UPDATE '.Database::instance()->quote_table($this->table).'left_key = left_key + '.(int)$delta.'left_key >= '.(int)$key;::query(Database::UPDATE, $query)->execute();

}function getNode($id)

{

$result = DB::select()

>from($this->table)

>where('id', '=', $id)

>execute();(count($result) == 0)new Exception('Node id='.$id.' does not exist.');$result->current();

}function clear($extrafields=array())

{(!is_array($extrafields))new Exception('$extrafields must be array.');::query(NULL, 'TRUNCATE '.Database::instance()->quote_table($this->table))->execute();::delete($this->table)->execute();

$data = array(

'id' => 1,

'name' => '<root>',

'left_key' => 1,

'right_key' => 2,

'level' => 0

);

$data = $data + $extrafields;($insert_id, $tmp) = DB::insert($this->table, array_keys($data))->values(array_values($data))->execute();$insert_id;

}function getTree($id=NULL)

{

$id = (int) $id;

$QTblName = Database::instance()->quote_table($this->table);($id != 0)

{

$node = $this->getNode($id);

$query =

'SELECT *'.$QTblName.'left_key >= '.(int)$node['left_key'].' AND right_key <= '.(int)$node['right_key'].'BY left_key';

}

{

$query =

'SELECT *'.$QTblName.'BY left_key';

}

$result = DB::query(Database::SELECT, $query)->execute();$result;

}function getPath($id)

{

$node = $this->getNode($id);

$query =

'SELECT *'.Database::instance()->quote_table($this->table).'right_key > '.(int)$node['left_key'].' AND left_key < '.(int)$node['right_key'].'BY left_key';

$result = DB::query(Database::SELECT, $query)->execute();$result;

}function insert($id, $extrafields=array())

{(!is_array($extrafields))new Exception('$extrafields must be array.');

// Находим родителя

$parent = $this->getNode($id);::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;($insert_id, $tmp) = DB::insert($this->table, array_keys($node))->values(array_values($node))->execute();::query(NULL, 'COMMIT')->execute();$insert_id;

}function delete($id)

{

$node = $this->getNode($id);::query(NULL, 'START TRANSACTION')->execute();

// Удаляем узел (вместе с веткой)

$query =

'DELETE FROM '.Database::instance()->quote_table($this->table).'left_key >= '.(int)$node['left_key'].' AND right_key <= '.(int)$node['right_key'];::query(Database::DELETE, $query)->execute();

$width = $node['right_key'] - $node['left_key'] + 1;

// Обновление последующих узлов

$this->modifyNodes((int)$node['right_key'], -$width);::query(NULL, 'COMMIT')->execute();

}

// Метод перемещает ноду $id в родительскую ноду $parentId

public function move($id, $parentId)

{

$node = $this->getNode($id);::query(NULL, 'START TRANSACTION')->execute();

// Удаляем узел (вместе с веткой)

$query =

'DELETE FROM '.Database::instance()->quote_table($this->table).'left_key >= '.(int)$node['left_key'].' AND right_key <= '.(int)$node['right_key'];::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();

}function check($thorough=FALSE)

{

$QTblName = Database::instance()->quote_table($this->table);

// Тест 1

$query =

'SELECT id'.$QTblName.'MOD(right_key - left_key, 2) = 0';

$result = DB::query(Database::SELECT, $query)->execute();(count($result) != 0)new Exception('Test 1 integrity check failed.');

// Тест 2

$query =

'SELECT id'.$QTblName.'MOD(left_key - level + 2, 2) = 0';

$result = DB::query(Database::SELECT, $query)->execute();(count($result) != 0)new Exception('Test 2 integrity check failed.');

// Тест 3($thorough)

{

$query =

'SELECT t1.id, COUNT(t1.id) AS rep, MAX(t3.right_key) AS max_right

'.$QTblName.' AS t1,

'.$QTblName.' AS t2,

'.$QTblName.' AS t3.left_key <> t2.left_key

AND.left_key <> t2.right_key

AND.right_key <> t2.left_key

AND.right_key <> t2.right_keyBY.id_right <> SQRT( 4 * rep + 1 ) + 1';


$result = DB::query(Database::SELECT, $query)->execute();

(count($result) != 0)new Exception('Test 3 integrity check failed.');

}

// Тест 4, проверка level

$query =

'SELECT node.id as id, node.level as level

'.$QTblName.' AS node,

'.$QTblName.' AS parentnode.left_key BETWEEN parent.left_key AND parent.right_keyBY node.idCOUNT(parent.name) - 1 != levelBY node.left_key';

$result = DB::query(Database::SELECT, $query)->execute();(count($result) != 0)new Exception('Test 4 integrity check failed.');

}

}





..\aplication\classes\valid.php

<?php defined('SYSPATH') or die('No direct script access.');Valid extends Kohana_Valid

{static function check_id($value, $tablename)

{

$id = (int) $value;(! preg_match("/^[a-z_]+$/i", $tablename)) return FALSE;

$count = DB::select(array('COUNT("*")', 'total_count'))

>from($tablename)

>where('id', '=', $id)

>execute()

>get('total_count');($count != 1) return FALSE;TRUE;

}

}

..\aplication\classes\controller\account.php

<?php defined('SYSPATH') or die('No direct script access.');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.');Controller_Ajax extends Controller {function action_emailunique()

{

$email = Arr::get($_POST, 'email', '');

$myuser = new Model_Myuser();

$res = $myuser->username_unique($email);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 модели myuserjson_encode(array('result' => $res)); // вывод в формате json_encode true или false

}

}


..\aplication\classes\controller\authformer.php

<?php defined('SYSPATH') or die('No direct script access.');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())

{new HTTP_Exception_404('File not found!');

}

$this->auto_render = FALSE; //не использовать главный шаблон вида "title"

$auth = Auth::instance();($auth->logged_in())

{

$this->response->body(View::factory('formloginout'));

}

{

$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.');Controller_Category extends Childrenbefore

{$template = 'title';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.');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.');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.');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.');Controller_Tag extends Childrenbefore

{$template = 'title';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.');

Controller_Admin_Edit extends Adminverification // главный контроллер, наследуется от Adminverification

{ $template = 'admin/title'; // основной вид страницы

public function action_index() // функция выполняемая по умолчанию index

{

$data = array(); // пустой массив

$category = new Model_Category('tree'); // соединяемся с таблицей категорий

$data['categories'] = $category->getTree(); // получаем их список

$editmatcat = new Model_Editmatcat; // подключаем модель верстки материалов(isset($_POST['iscategory'])) // если категория выбрана

{

unset($data['categories']); // чтоб не отображалить категории когда материал уже выбран

$categoryId = Arr::get($_POST, 'SelectCat', ''); // записать ее идентификатор

if($data['matnames'] = $editmatcat->ShowMatNameList($categoryId)); // вывести имена материалов принадлежащих этой категории

}(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");

}

}(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.');Controller_Admin_One extends Adminverification // главный контроллер, наследуется от Adminverification

{$template = 'admin/title'; // основной вид страницы

public function action_index() // функция выполняемая по умолчанию index

{

$category = new Model_Category('tree');

$data['categories'] = $category->getTree();(isset($_POST['addcategory']))

{

$categoryName = html::chars( Arr::get($_POST, 'categoryName', ''), false);

$parentId = Arr::get($_POST, 'parentId', '');

$res = $category->catInsert($parentId, array('name'=>$categoryName)); ($res)

{::initial()->redirect('admin');

}

{

$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.');Controller_Admin_Users extends Adminverification // главный контроллер, наследуется от Adminverification

{ $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.');Model_Addrole extends ORM

{$_table_name = 'roles_users';

}







..\aplication\classes\model\category.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Category

{

protected $nstree;

protected $tableName;$errors = array();

function __construct($tableName)

{

$this->nstree = new NSTree($tableName);

$this->tableName = $tableName;

}

function getTree()

{$this->nstree->getTree();

}

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'); FALSE;

}

// Транслит для правильного исопльзования в url

$this->nstree->insert($parentId, $data);

return TRUE;

}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.');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.');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.');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 и заверщаем функцию

{FALSE;

}

}

}



..\aplication\classes\model\myuser.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Myuser extends ORM

{$_table_name = 'users';

protected $errors=array(); // защищенное свойство доступ только у наследников

public function rules()

{array(

'password' => array(('not_empty'),

array('min_length', array(':value', 7)),

),

'username' => array(('not_empty'),('min_length', array(':value', 8)),('max_length', array(':value', 80)),('email'),

array(array($this, 'username_unique')),

),

);

}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'));(!$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.');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'));(!$validation->check())

{

$this->errors = $validation->errors('addmatErrors');

return FALSE;

}TRUE;

}





public function TagNameValid($tags)

{

$vData = array("tags" => $tags,);

$validation = Validation::factory($vData);

$validation->rule('tags', 'not_empty'); (!$validation->check())

{

$this->errors = $validation->errors('addmatErrors');

return FALSE;

}TRUE;

}

public function getErrors()

{return $this->errors;}}

..\aplication\classes\model\reg.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Reg

{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');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();

$key = $genpass = $generation->PasswordGeneration(16);

// хэшируем данный пароль для дальнейшего его поступления в бд

$auth = Auth::instance();

$myuser->password = $auth->hash_password($password);

try

{

if(isset($email)and(isset($password)))

{

$myuser->save();

// узнаем id пользователя

$usertemp = ORM::factory('myuser', array('username'=>$email));

$adduserid = $usertemp->id;

// для проверки ида нового юзера на экране

// var_dump($adduserid);

// exit;

// Создаем роли

$addrole = new Model_Addrole();

$addrole->user_id = $adduserid;

if ( ($key!=0)or($key!='-1')or($key!=2) )

{

$addrole->role_id = $key;

}

$addrole->save();

// Диактивация регистрационного кода

$regcode->disactive_code($regcodevalue, $adduserid);

// Отправка эл.почты

$sendtomail = new Model_Sendtomail();

$to = $email;

$from = '[email protected]';

//$subject = 'Подтверждение регистрации в КГК';

/* $message = "Ваш логин: $email, Ваш пароль: $password

<br>

<br>Ссылка для подтверждения аккаунта: <a href='#"justify">*/

$subject = Kohana::message('emailthemes/register','subject');

$data = array ('email' => $email,'password' => $password, 'key' => $key );

$message = View::factory('emailbody/register',$data);

$sendtomail->sendemail($to,$from,$subject,$message, true);

unset($key);

unset($genpass);

return TRUE;

}

}

catch(ORM_Validation_Exception $e)

{

$this->errors = $e->errors('validation');

return FALSE;

}

}

public function regcomplete($kolan)

{

if(($kolan!='-1')or($kolan!='0')or($kolan!='all')or($kolan!='1'))

{

$result = DB::select()

->from('roles_users')

->where('role_id', '=', Security::xss_clean($kolan))

->execute();

if (count($result) == 0)

{

return false;

throw new Exeption('Данный ключ не существует');

}

else

{

$query = DB::update('roles_users')

->set(array('role_id' => '1'))

->where('role_id', '=', $kolan);

$query->execute();

return true;

}

}

}

public function updatepassword($code)

{

$usertemp = ORM::factory('myuser', array('rempass'=>$code));

if(!$usertemp->loaded())

{

return FALSE;

}


$generation = new Model_Generation();

$genpass = $generation->PasswordGeneration(8);

//Хеширование пароля

$auth = Auth::instance();

$usertemp->password = $auth->hash_password($genpass);

//Очистка кода восстановления

$usertemp->rempass = NULL;

$usertemp->save();

$sendtomail = new Model_Sendtomail();

//Отправка эл. почты

$email = $usertemp->username;

$from = '[email protected]';

//$subject = 'Авторизационные данные обновлены';

$subject = Kohana::message('emailthemes/rememberpasswordcomplete','subject');

//$message = "Ваш логин: $email Ваш пароль: $genpass";

$data = array ('email' => $email,'genpass' => $genpass );

$message = View::factory('emailbody/rememberpasswordcomplete',$data);

$sendtomail->sendemail($email, $from, $subject, $message, TRUE);

return TRUE;

}

public function wantnewpassword($email)

{

$usertemp = ORM::factory('myuser', array('username'=>$email));


if(!$usertemp->loaded())

{

return FALSE;

}

$generation = new Model_Generation();

$genpass = $generation->PasswordGeneration(8);

$usertemp->rempass = $genpass;

$usertemp->save();

$sendtomail = new Model_Sendtomail();

//Отправка эл. почты

$from = '[email protected]';

//$subject = 'Восстановление пароля';

$subject = Kohana::message('emailthemes/rememberpassword','subject');

//$message = "Перейдите по ссылке <a href='#"justify"> $data = array ('genpass' => $genpass);

$message = View::factory('emailbody/rememberpassword',$data);

$sendtomail->sendemail($email, $from, $subject, $message, TRUE);

return TRUE;

}

}

..\aplication\classes\model\regcode.php

<?php defined('SYSPATH') or die('No direct script access.');

// валидация параметра -код-Model_Regcode extends ORM

{

// protected $_table_name = 'users'

public function rules()

{

return array(

'code' => array(

array('not_empty'),

array(array($this, 'bad_code')),

),

);

}

public function bad_code($code)

{

$regcodetemp = ORM::factory('regcode', array('code'=>$code));

// создание временной переменной регкодетемп хранящий введенное значение и сверка тождественности с параметром регкод который зависит от таблицы с кодами

if($regcodetemp->loaded())

{

if($regcodetemp->user_id == NULL)

// если код не занят еще ни 1 пользователем то вернуть функции тру если занят вернуть фолс.

{

return TRUE;

}

else

{

return FALSE;

}

}

else

{

return FALSE;

}

}

public function disactive_code($code, $user_id)

{

$regcodetemp = ORM::factory('regcode', array('code'=>$code));

$regcodetemp->user_id = $user_id;

$regcodetemp->save();

}

}

..\aplication\classes\model\searchuser.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Searchuser

{

public function find($SearchUsername)

{

$query = DB::select('username')

->from('users')

->where('username', 'like', ('%'.Security::xss_clean($SearchUsername)).'%');

$result = $query->execute()->as_array();

return $result;

}

public function usercount()

{

$result = DB::select('id')

->from('users')

->execute();

return count($result);

}

public function admincount()

{

$result = DB::select('role_id')

->where('role_id', '=', '2')

->from('roles_users')

->execute();

return count($result);

}

}

..\aplication\classes\model\sendtomail.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Sendtomail

{

public function sendemail($to,$from,$subject,$message, $html)

{

try

{

$count = Email::send($to,$from,$subject,$message, $html);

return TRUE;

}

catch (Exception $e)

{

echo $e->getMessage();

return false;

}

}

}





..\aplication\classes\model\tag.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Tag extends ORM

{$_has_many = array( // связь -многие ко многим-

'material' => array(

'model' => 'material',

'through' => 'tags_materials', //обязательный параметр для этой связи // связь между таблицей -materials- и -tags- будет осуществлятся через таблицу -tags_materials-

'foreign_key' => 'tag_id', // ключевое поле текущей таблицы

'far_key' => 'material_id', // ключевое поле к таблице которой привязываем

),

);

public function tagadd($matid, $name)

{

$url=$_SERVER["HTTP_ORIGIN"]; // определяем доменное имя сайта до первого слеша(#"justify"> $this->name = Security::xss_clean($name); // в таблицу tags поле name записываем тег

// проверим заодно введенные теги, чтоб были без скриптов и др гадостей

$this->url = ''; // ссылка тега изначальна как пустая, поскольку у него еще нету идентификатора

$this->save(); // записываем в таблицу и получаем идентификатор

$tagid=$this->id; // берем данный идентификатор в переменную tagid

$TagsMaterial = new Model_Tagsmaterial; // объявляем класс для работы с бд(нужно для таблицы tags_materials)

$TagsMaterial->tag_id=$tagid; // записываем в таблицу tags_materials идентификтаор нашего тега

$TagsMaterial->material_id = $matid; // записываем в эту же таблицу идентификатор тега к этому материалу

$TagsMaterial->save(); // сохраняем в таблицу

$tags = ORM::factory('tag', array('id'=>$tagid)); // находим записанную строчку у таблицы tags

$this->url = "$url/materials/showcontent/$tagid"; // теперь заполним нашу пустую ссылку ссылкой на идентификтаор материала

$this->save(); // произведем сохранение записи

return;

}function tagInfoByUrl($url)

{

$tree = ORM::factory('tag', array('url'=>$url));

// создания класса работы с бд и поиск в поле url нашего введенного url

if($tree->loaded()) // если загружена хоть 1 строчка

{

$result['id'] = $tree->id; // присвоить массиву result с полем ид и name найденный идентификатор и имя

$result['name'] = $tree->name;$result; // в результатае функция вернет массив result

}

{FALSE;

}

}function contentTagById($id) // пришел ид набранного тега

{

$tag = ORM::factory('tag', array('id'=>$id)); // ищем есть ли он в таблице tag в поле id($tag->loaded()) // если есть

{

$result = array(); // создаем пустой массив

$res = $tag->material->find_all(); // создание дополнительного поля material и

// поиск всех материалов рлдходящих к тегу с имеющимся идентификатором

foreach($res as $item) // заполнение массива result поматериально с каждым шагом цикла

{

$result[] = array('id' => $item->id, 'content' => $item->content, 'name' => $item->name);

}$result; // функция вернет массив result

}

{FALSE;

}

}

}

..\aplication\classes\model\tagsmaterial.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Tagsmaterial extends ORM

{$_table_name = 'tags_materials';

}

..\aplication\classes\model\tree.php

<?php defined('SYSPATH') or die('No direct script access.');Model_Tree extends ORM

{$_table_name = 'tree';$_has_many = array( // метод связи -один ко многим-

'materials' => array( // какое доп. свойство хотите

'model' => 'material', // с какой моделью хотим соединится

// (модель соостветственно должна расширятся от орм)

'foreign_key' => 'category_id', // название связываемого поля

),

);function categoryInfoByUrl($url)

{

$tree = ORM::factory('tree', array('nametrans'=>$url)); // создается экземпляр класса orm для работы с бд

// из таблицы tree достается строчка в которой поле nametrans совпадает со значением переменной $url

if($tree->loaded()) // проверка загруженной строки

{

$result['id'] = $tree->id; // если строка найдена и загружена то

$result['name'] = $tree->name; // присвоем массиву result идентификтаор и имя категории

return $result; // все успешно метод возвращает массив с полями ид и имя категории

}

else // если строк ане загруженна функция вернет false

{FALSE;

}

}function contentСategoryById($id)

{

$tree = ORM::factory('tree', array('id'=>$id)); // создается экземпляр класса orm для работы с бд

// из таблицы tree достается строчка в которой поле url совпадает со значением переменной $url

if($tree->loaded())// есть ли такой идентификатор в таблице

{

$result = array(); // пустой массив $result

$res = $tree->materials->find_all(); // загрузка всех материалов данной категории в массив $res

foreach($res as $item) // прокрутка материалов и понумерованная запись в массив $result

{

$result[] = array('id' => $item->id, 'content' => $item->content, 'name' => $item->name);

}$result;

}

{FALSE;}}}

..\aplication\classes\model\user.php

<?php defined('SYSPATH') or die('No direct access allowed.');Model_User extends Model_Auth_User {function rules()

{array(

'username' => array(('not_empty'),('min_length', array(':value', 4)),('max_length', array(':value', 32)),

),

'password' => array(('not_empty'),

),

'email' => array(('not_empty'),('min_length', array(':value', 4)),('max_length', array(':value', 127)),('email'),

),

);

}

}

..\aplication\views\404view.php

<style>

*body{: 0;: 0;}

#wrapper{: 500px;: 0 auto;}

#e404e{: 0 auto;: 100px 0;align: center;: none;}

</style>

<div id="wrapper">

<div id="e404e">

<p> Ошибка - № 404.

<br /> Страница не найдена!

</p>

<a href="/">

<img src="/img/404.gif" alt="error404 - страница не найдена" border="0" />

</a>

<br />

<?php echo $message ?>

</div>

</div>

..\aplication\views\accountview.php

<!--Вызов отображение формы логина-->

<?

$request = Request::factory('authformer/form/1');

$response = $request->execute();$response;

?>

<!-- / Вызов отображение формы логина-->

<!-- Вывод сообщения об успешной смене пароля -->

<?if(isset($ok)) // если существует $ok

{?>

<p style="text-align:center; color:green;">

Новый пароль успешно сохранен

</p>

<?}?>

<!-- /Вывод сообщения об успешной смене пароля -->

<!-- Вывод ошибок валидации при сохранении нового пароля -->

<? if(isset($errors) // усли существует $errors

){?>

<?foreach($errors as $item){?>

<p style="color:red"><?=$item?></p>

<?}?>

<?}?>

<!-- / Вывод ошибок валидации при сохранении нового пароля -->

<h2>Личный кабинет</h2>

<p>Здравствуйте, <?=$username?>.</p>

<p><b>Смена пароля:</b> <input type="checkbox" id="showpassbtn" /><label for="showpassbtn"> Не прятать пароль за звездочки</label></p>

<form action="" method="post">

<table>

<tr>

<td style="text-align: right">Старый пароль:</td>

<td><input type="password" name="oldpass" id="oldpass" /></td>

<td>

<span style="display: none" id="ok"><img src="/img/true.png" title="Старый пароль введен правильно" alt="Старый пароль введен правильно" /></span>

<span style="display: none" id="error"><img src="/img/false.png" title="Ошибка в старом пароле" alt="Ошибка в старом пароле" /></span>

</td>

</tr>

<tr>

<td style="text-align: right">Новый пароль:</td>

<td><input type="password" name="newpass1" id="newpass1" /></td>

<td>&nbsp;</td>

</tr>

<tr>

<td style="text-align: right">Повторите новый пароль:</td>

<td><input type="password" name="newpass2" id="newpass2" /></td>

<td>

<span style="display: none" id="newpassmatchesok"><img src="/img/true.png" title="Пароли совпадают" alt="Пароли совпадают" /></span>

<span style="display: none" id="newpassmatcheserror"><img src="/img/false.png" title="Пароли несовпадают" alt="Пароли несовпадают" /></span>

</td>

</tr>

<tr>

<td>&nbsp;</td>

<td><input type="submit" value="Сохранить пароль" name="btnpassremove" /></td>

</tr>

</table>

</form>

<script type="text/javascript">checkOldPass()

{oldpass = $("#oldpass").val(); // создается перемеррная oldpass куда заносится значение поля с id=oldpass

$.ajax({ // запрос на отправку данных

type: "POST", // метод скрытый

data: "oldpass=" + oldpass, // в контейнер oldpass запишется значение переменной oldpass

url: "/ajax/checkOldPass", // куда отправится

dataType: "json",

success: function(data)

{(data.result) // если функция action_checkOldPass контроллера Ajax вернула true или false

{

$("#ok").css('display','inline');

$("#error").css('display','none');

}

{

$("#error").css('display','inline');

$("#ok").css('display','none');

}

}

})

}showPass()

{checked = $("#showpassbtn").attr('checked'); // переменная checked

(checked == "checked") // если галка стоит

{.getElementById('oldpass').type = 'text'; // поле с идентификатором oldpass становится типа text.getElementById('newpass1').type = 'text';.getElementById('newpass2').type = 'text';

}

{.getElementById('oldpass').type = 'password';.getElementById('newpass1').type = 'password';.getElementById('newpass2').type = 'password';

}

}matchesPass()

{($("#newpass1").val() == $("#newpass2").val()) // сравнение newpass1 поля с newpass2 полем

{

$("#newpassmatchesok").css('display','inline');

$("#newpassmatcheserror").css('display','none');

}

{

$("#newpassmatcheserror").css('display','inline');

$("#newpassmatchesok").css('display','none');

}

}


$(document).ready(function(){

$("#oldpass").blur(checkOldPass);

$("#showpassbtn").click(showPass);

$("#newpass2").keyup(matchesPass);

});

</script>

..\aplication\views\authview.php

<?php(isset ($errors))

{

echo "<p style=text-align:center; color:red/>

Неверный логин или пароль. </p>";

}(isset ($badimagecode))

{

echo "<p style=text-align:center; color:red/>

Неверно введен код с картинки. </p>";

}

?>

<form action="" method="post">

<table>

<tr>

<th colspan="2" style="text-align:center"><h2> Авторизация </h2> </th>

</tr>

<tr>

<td>Логин: </td>

<td> <input type="text" name="login" /> </td>

</tr>

<tr>

<td>Пароль: </td>

<td> <input type="password" name="password" /> </td>

</tr>

<script>

function reload(){

id=Math.floor(Math.random()*1000000);

$("img.captcha").attr("src","/captcha/default?id="+id);

}

</script>

<tr>

<td>

<?=$captcha_image?>

<img alt="Обновить код" onclick="reload()" src="/img/refresh.gif" style="cursor:pointer; vertical-align: super;" title="Обновить код" />

</td>

<td>

<input type="text" name="captcha" />

</td>

</tr>

<tr>

<th colspan="2" style="text-align:right"> <input type="submit" value="Войти" name="authbutton" style="width: 163px; height: 30px;" /> </th>

</tr>

<tr>

</tr>

</table><br />

<a style="color: black; margin-left: 60px; padding: 10px;" href="authformer/wantnewpassword"> Забыл пароль </a>

<a style="color: black; padding: 10px;" href="authformer/reg"> Регистрация </a>

</form>

..\aplication\views\catview.php

<style>

#catview a{

color:#333;

font-weight: bold;

font-size: 16px;

font-style: normal; }

#catview a:hover{

color:#000;

font-style: italic; }

#content_container{

background-image: none;}

</style>

<div id="catview">

<h2>Содержимое категории <?=$category['name']

// в контроллере категорий

// $data['category'] = $tree->categoryInfoByUrl($url)

?></h2>

<ul style="padding: 30px;">

<? if(count($materials)) // проверка есть ли материалы в категории

{

foreach($materials as $item)

{?>

<li>

<p></p><a href="/materials/showcontent/<?=$item['id']?>"><? echo htmlspecialchars($item['name'])?></a></p>

<p><?=$item['content']?></p>

</li>

<?}?>

<?}else{?>

<p>В выбранной категории нет материалов</p>

<?}?>

</ul>

</div>


..\aplication\views\checkcodeview.php

<?php

"<p style=text-align:center; color:green;> Введите адрес Вашей электронной почты: </p>";(isset($error))

{

echo

"<p style=text-align:center; color:green;> Данный адрес не существует. </p>";

}(isset($ok))

{

echo

"<p style=text-align:center; color:red;> Зайдите и проверьте Вашу почту </p>";

}

?>

..\aplication\views\completeregisterview.php

<script>url()

{ ("location.href='/authformer';", 4000);

}

</script>

<body onload="url()">

<?php

"<p>

if(isset($error))

{

echo

"<p>

}(isset($ok))

{echo

"<p>


..\aplication\views\contentview.php

<style>{: 0;: 0;}{font-weight: normal;}

#content_container{background-image: none;}

#links a{: #333;style: normal;: 0;: 0;}

#links{: 0;: 0;height: normal;}

</style><div id="links"><ul style="padding: 30px;"><li>

Категория: <b><?=$category?></b></li><li>Материал: <b><?=$name?></b></li><br />

<b>Содержимое статьи:</b> <? print $content?></ul><ul><p>

<b>Статье присвоены следующие теги: </b><br /><? if(isset($tag))

{ foreach($tag as $item){?><li> <?= $item['name']?></li><?} }?></p></ul></div>


..\aplication\views\dontaccess.php

<p style="text-align: center;"> У Вас недостаточно доступа для просмотра данной страницы! </p>

..\aplication\views\formloginin.php

<script type="text/javascript">OpenSlider() // при нажатии вход

{

$("#slider-in").animate({ height: "200px" }); // плавное изменение высоты от 0 до 170пх

$("#login").focus(); // фокусировка поля с ид логин

$("#open-div").toggle(); // toogle изменяет с видемого на невидимый

$("#close-div").toggle(); // наоборот с невидимого сделал видимым

return false; // запрет перехода по ссылке -Войти-

}CloseSlider()

{

$("#slider-in").animate({ height: "0" }); // наоборот первому

$("#open-div").toggle();

$("#close-div").toggle();false;

}

$(document).ready(function(){ // прочетсь сначала весь документ

$("#open-button").click(OpenSlider); // запустить функцию открытьслайдер 1-ая

$("#close-button").click(CloseSlider); // в случае нажатия на скрыть с ид клос-батом запустить функцию клос слайдер

});

</script>

<div id="slider">

<div id="slider-in">

<form action="/authformer" method="post">

<p id="ptext">Логин:</p>

<input type="text" name="login" id="login" />

<p id="ptext">Пароль:</p>

<input type="password" name="password" /><br />

<p>

</form>

<p><a href="/authformer/reg">Быстрая регистрация</a></p>

<p><a href="authformer/wantnewpassword"> Забыл пароль </a> </p>

</div>

<div id="open-div"><a href="#" id="open-button">Вход</a></div>

<div id="close-div" style="display:none"><a href="#" id="close-button" ><img src="/img/exit.png" width="14px" height="14px" alt="hide" align="right" /> </a></div>

</div>

..\aplication\views\formloginout.php

<div id="slider"><a href="/authformer/logout">Выйти</a></div>


..\aplication\views\materialsview.php

<style>#content_container{background-image: none;}</style>

<?foreach($materials as $item){?>

<p><?=($item['content'])?></p>

<?}?>




..\aplication\views\pageview.php

<p style="text-align: center;"> Это обычная страница! </p>


..\aplication\views\regview.php

<?php (isset($regok))

{

echo

"<p>

<script>function url() { setTimeout("location.href='/authformer';", 5000); }</script>

<body onload="url()"><?php } if(isset($errors)){foreach ($errors as $item){"<p>

<form action="" method="post"><table>

<td>E-Mail: </td><td> <input type="text" name="email" /> </td>

</tr><tr><tr><td>Пароль: </td><td> <input type="password" name="password" /> </td></tr><td>Код регистрации(инвайт): </td><td> <input type="text" name="regcodevalue" /> </td></tr><script>reload(){id=Math.floor(Math.random()*1000000);

$("img.captcha").attr("src","/captcha/default?id="+id);}</script>

<tr> <td><?=$captcha_image?>

<img alt="Обновить код" onclick="reload()" src="/img/refresh.gif" style="cursor:pointer; vertical-align: super;" title="Обновить код" />

</td><td><input type="text" name="captcha" /></td></tr> <tr>

<th colspan="2" style="text-align:right"> <input type="submit" value="Зарегистрироваться" name="regbutton" style="width: 163px; height: 30px;" /> </th></tr></table> </form>






..\aplication\views\rempassview.php

<?php "<p style=text-align:center; color:green;> Введите адрес Вашей электронной почты: </p>";(isset($error))

{echo "<p style=text-align:center; color:green;> Данный адрес не существует. </p>"; }(isset($ok))

{echo "<p style=text-align:center; color:red;> Зайдите и проверьте Вашу почту </p>"; }?>

<form action="" method="post"><table>

<th colspan="2" style="text-align:center"><h2> Восстановление забытого пароля </h2> </th></tr><tr><td>E-Mail: </td><td> <input type="text" name="email" id="email" />

<span id="trueimg" style="display: none;"><img src="/img/true.png" alt="true" /></span>

<span id="falseimg" style="display: none;"><img src="/img/false.png" alt="false" /></span> </td></tr><tr><th colspan="2" style="text-align:right"> <input type="submit" value="Восстановить" name="passubmit" style="width: 163px; height: 30px;" /> </th>

</tr></table></form>

<script type="text/javascript">runajax(){var email = $("#email").val();

$.ajax({type: "POST",data: "email=" + email,url: "/ajax/emailunique",dataType: "json",success: function(data){(!data.result){$("#trueimg").css('display','inline');$("#falseimg").css('display','none');}{$("#falseimg").css('display','inline');$("#trueimg").css('display','none');}}})}

$(document).ready(function(){$("#email").blur(runajax);});</script>


..\aplication\views\tagview.php

<h2>Содержимое категории <?=$tag['name']?></h2><ul style="padding: 30px;">

<?if(count($materials)) {foreach($materials as $item){?><li>

<p><a href="/materials/showcontent/<?=$item['id']?>"><?=$item['name']?></a></p>

<p><?=$item['content']?></p></li><?}?><?}else{?>

<p>В выбранной категории нет материалов</p><?}?></ul>





..\aplication\views\title.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "#"justify"><html xmlns="#"justify"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Skutor - Kohana Framework</title>

<link href="/css/stylesheet.css" rel="stylesheet" type="text/css" />

<script type="text/javascript" src="/js/jquery-1.7.1.js" ></script>

<script type="text/javascript" src="/ckeditor/ckeditor.js"></script>

</head><body>

<div id="top_bar_black"> <div id="logo_container"> <div id="logo_image"> </div> <div id="nav_block"> <div>


..\aplication\views\titleview.php

<?php $request = Request::factory('authformer/form'); // запуск метода form в контроллере authformer

$response = $request->execute(); echo $response;?>

<div id="header"> <div>

<div id="header_lower"> <div id="header_content_boxline">Kohana</div> <div id="header_content_boxcontent"><br /><b> Kohana </b> - это HMVC PHP5 веб фреймворк, предоставляющий средства для разработки web-приложений. Благодаря своей каскадной файловой системе, большому количеству встроенных утилит и последовательному API, он идеально подходит для решения большинства задач, а высокая скорость выполнения и обширные возможности профилирования позволяют ускорить разработку и использовать менее мощные ресурсы для содержания конечного продукта.<p><ul><b>Почему именно Kohana?</b><li>Высокая скорость выполнения</li><li>Использование всех возможностей PHP5</li><li>Большое количество встроенных инструментов, в том числе ORM и Database</li><li>Малые системные требования</li><li>Средства профилирования и отладки</li><li>Поддержка UTF-8 и I18N</li></ul></p>Первоначальная версия Kohana была известна как Blue Frame и являлась форком CodeIgniter. Затем разработчики посчитали нужным переименовать свой проект, и с версии 2.0 за фреймворком укрепилось название Kohana. В сентябре 2009 года выходит новая версия, 3.0, в которой был полностью переписан код, добавлено множество нововведений, а также увеличена скорость по отношению к Kohana 2.</div></div>

..\aplication\views\emailbody\register.php

<?php echo"Ваш логин: $email, Ваш пароль: $password <br><br>Ссылка для подтверждения аккаунта: <a href='#"justify">..\aplication\views\emailbody\rememberpassword.php

<?php echo "Перейдите по ссылке

<a href='#"justify">..\aplication\views\emailbody\rememberpasswordcomplete.php

<?php echo "Ваш логин: $email Ваш пароль: $genpass"; ?>


..\aplication\views\admin\adminview.php

<p><h3>Страница управления материалами</p></h3><div style="padding: 50px;">

<!-- Вывод ошибок валидации при сохранении нового пароля -->

<? if(isset($errors) // если существует $errors){?><?foreach($errors as $item){?>

<p style="color:red"><?=$item?></p><?}?><?}?>

<!-- / Вывод ошибок валидации при сохранении нового пароля -->

<div><form method="post" action=""><h3 style="font-size: 16px; font-family: Verdana;">Создать категорию: </h3><select name="parentId">

<?foreach($categories as $item) {?><option value="<?=$item['id']?>"><?=str_repeat('&nbsp;', 4*$item['level']).htmlspecialchars($item['name'])?></option><?}?></select>

<input type="text" name="categoryName" /><input type="submit" value="Добавить" name="addcategory" /></form></div>

<h3 style="font-size: 16px; font-family: Verdana;">Добавить материал: </h3>

<form action="" method="post" style="width: 900px;"><div><select name="categoryId">

<?foreach($categories as $item) {?><option value="<?=$item['id']?>"><?=str_repeat('&nbsp;', 4*$item['level']).htmlspecialchars($item['name'])?></option>

<?}?></select><span>Название материала: <input type="text" name="materialname" />

<span style="padding: 0 10px;">

Теги к статье(через запятую): <input type="text" name="tagnames" alt="Введите теги к материалу через запятую!" />

</div></span></span><textarea name="content" id="editor"></textarea>

<input type="submit" value="Сохранить" name="materialsavebtn" /></form></div>

<script type="text/javascript"> .replace( 'editor' ); // CKEDITOR подключить к текстовому полю с идентификатором editor

</script></div>


..\aplication\views\admin\editview.php

<p><h3>Страница редактирования категорий и материалов</h3></p>

<div style="padding: 50px;"><div>

<?php if(isset($main)) echo 'Главную категорию запрещено удалять!'; ?>

<?php if(isset($mainm)) echo 'Удаление материала запрещено!'; ?>

<form action="" method="post"><?if(isset($categories)){?><?="<select name=SelectCat>";foreach($categories as $item) {?><option value="<?=$item['id']?>"><?=str_repeat('&nbsp;',4*$item['level']).htmlspecialchars($item['name'])?></option><?}?></select>

<input type="submit" value="Выбрать категорию" name="iscategory" />

<input type="submit" value="Удалить категорию" name="delcategory" /><?}?></form>

<form method="post" action=""><? if(isset($matnames)){?><?="<select name=SelectMat >";foreach($matnames as $item) {?><option value="<?=$item['name']?>"><?=htmlspecialchars($item['name'])?></option><?}?></select>

<input type="submit" value="Выбрать материал" name="ismaterial" />

<input type="submit" value="Удалить материал" name="delmaterial" /><?}?></form><form action="" method="post"><? if(isset($textik)){echo"<b>Название материала</b><input type=text value=$mn name=mn id=mn />

<textarea name=content id=editor >";$textik; echo"</textarea> <script type=text/javascript> .replace( 'editor' ); // CKEDITOR подключить к текстовому полю с идентификатором editor

</script>

<input type=submit value=Сохранить изменения name=savem />"; }?> </form></div></div>


..\aplication\views\admin\title.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "#"justify"><html xmlns="#"justify"><head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Skutor - Kohana Framework</title>

<link href="/css/stylesheetadmin.css" rel="stylesheet" type="text/css" />

<script type="text/javascript" src="/js/jquery-1.7.1.js" ></script>

<script type="text/javascript" src="/ckeditor/ckeditor.js"></script>

</head><body><div id="top_bar_black"> <div id="logo_container">

<div id="logo_image"> </div> <div id="nav_block">

<div>

<div>

<div>

<div>

<div id="content_container"><?php echo $content ?>

</div><div id="clear"></div><div id="bottom_bar_black"> <div id="main_container"></div> </div><div id="copywriteblock"> <a href="mailto:[email protected]">&copy; Автор сайта: skutor </a></div></body></html>


..\aplication\views\admin\usersview.php

<p><h3>Страница управления пользователями</p></h3><div id="analitics"><p>

<font color="green"> Зарегистрировано пользователей: </font> <?=$usercount?>

<br /><font color="red"> Администраторов: </font> <?=$admincount?></p></div>

<div id="search"><form method="post" action="">

<h3 style="font-size: 16px; font-family: Verdana;">Поиск пользователя: </h3>

<input type="text" name="username" /><input type="submit" value="Найти" name="SearchGo" /></form>

<?php if(isset($findok)){echo "<p style=color: green;>Результат: </p>";($name as $item) {echo $item['username']."<br />";}}else "Ничего не найдено";?></div><div id="clear"></div>


..\aplication\messages\addmatErrors.php

<? // тест документ, не используется!array (

'materialname'=> array(

'not_empty'=> 'Вы не дали название материалу',

'min_length'=> 'Название материала слишком короткое',

'max_length'=>'Название не должно быть длиннее 20 символов',

'alpha_numeric'=>'Название может использовать только английские и целочисленные символы верхнего и нижнего регистров. Без специальных сиволов.',

), 'tags'=> array('not_empty'=> 'Вы не ввели ни одного тега.', ),);


..\aplication\messages\catErrors.php

<? return array (

'name'=> array(

'not_empty'=> 'Название категории не должно быть пустым.',

'min_length'=> 'Вы ввели название категории менее трех символов.',

'regex'=>'Можно использовать только русские,английские и целочисленные символы верхнего и нижнего регистров. Без специальных сиволов.', ),

'parentID'=> array(

'check_id'=>'Нельзя создать категорию, так как не существует родительской категории.',),

'nametrans'=> array(

'unique_url'=>'URL уже существует.',),

'password'=> array(

'not_empty'=> 'Пароль не должен быть пустым.',

'min_length'=> 'Пароль должен содержать не менее 7 символов.',

'max_length'=>'Пароль должен содержать не более 16 символов.',

'regex'=>'Можно использовать только английские и целочисленные символы верхнего и нижнего регистров. Без специальных сиволов.', ),

'oldpass' => array(

'not_empty' => 'Вы не ввели старый пароль',

'checkOldPass' => 'Ошибка в старом пароле', ),

'newpass1' => array(

'not_empty' => 'Вы не ввели новый пароль',

'matches' => 'Новые пароли должны совпадать',

'min_length'=> 'Пароль должен содержать не менее 7 символов.',

'max_length'=>'Пароль должен содержать не более 16 символов.',

'regex'=>'Можно использовать только английские и целочисленные символы верхнего и нижнего регистров. Без специальных сиволов.', ),);



..\aplication\messages\passErrors.php

<? // тест документ, не используется!

return array ('password'=> array(

'not_empty'=> 'Пароль не должен быть пустым.',

'min_length'=> 'Пароль должен содержать не менее 7 символов.',

'max_length'=>'Пароль должен содержать не более 16 символов.',

'regex'=>'Можно использовать только английские и целочисленные символы верхнего и нижнего регистров. Без специальных сиволов.', ), );


..\aplication\messages\validation\myuser.php

<? return array ('username'=> array(

'not_empty'=> 'Вы не заполнили поле Email.',

'email'=> 'Это не Email.',

'username_unique'=> 'Данный Email уже зарегистрирован.', ),);


..\aplication\messages\validation\regcode.php

<? return array ( 'code'=> array(

'not_empty'=> 'Поле регистрационного кода не должно быть пустым.',

'bad_code'=> 'Код используется другим пользователем или не существует.', ),);


..\aplication\messages\emailthemes\register.php

<?php defined('SYSPATH') or die('No direct script access.'); return array(

'subject' => 'Подтверждение регистрации',);


..\aplication\messages\emailthemes\rememberpassword.php

<?php defined('SYSPATH') or die('No direct script access.'); return array(

'subject' => 'Восстановление пароля', );


..\aplication\messages\emailthemes\rememberpasswordcomplete.php

<?php defined('SYSPATH') or die('No direct script access.'); return array(

'subject' => 'Ваш новый пароль', );




dump базы данных kgksite

FOREIGN_KEY_CHECKS=0;


- ----------------------------

- Table structure for `materials`

- ----------------------------TABLE IF EXISTS `materials`;TABLE `materials` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`category_id` int(10) unsigned NOT NULL,

`content` text NOT NULL,

`createtime` int(10) DEFAULT NULL,

`modtime` int(10) DEFAULT NULL,

`name` varchar(25) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `category_id` (`category_id`)

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;


- ----------------------------

- Records of materials

- ----------------------------INTO `materials` VALUES ('1', '5', '<p>\r\nВы можете свзяаться со мной по адресу:</p>\r\n<p>\r\n<a href=mailto:[email protected]?subject=%D0%A1%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%B2%D0%B0%D1%88%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%20Kohana>[email protected]</a></p>\r\n', '1329132907', null, 'Email');INTO `materials` VALUES ('7', '4', '<p>\r\nКакая-то информация</p>\r\n', '1336382841', null, 'Материал1');INTO `materials` VALUES ('8', '4', '<p>\n<strong>Некая информация к Материалу № 2.</strong></p>\n', '1337088918', '1338127500', 'sdfsdfsdf');INTO `materials` VALUES ('9', '4', '<p>\ninformation, many many information =)</p>\n', '1337088918', '1338127561', 'playgamer');INTO `materials` VALUES ('11', '5', '<p>\r\ntext for example</p>\r\n', '1338381423', null, 'example2');


- ----------------------------

- Table structure for `regcodes`

- ----------------------------TABLE IF EXISTS `regcodes`;TABLE `regcodes` (

`id` int(7) NOT NULL AUTO_INCREMENT,

`code` varchar(32) NOT NULL,

`user_id` int(7) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


- ----------------------------

- Records of regcodes

- ----------------------------INTO `regcodes` VALUES ('1', '111', '1');INTO `regcodes` VALUES ('2', '222', '2');INTO `regcodes` VALUES ('3', '333', '2');INTO `regcodes` VALUES ('4', '787', '9');INTO `regcodes` VALUES ('5', '121', '3');


- ----------------------------

- Table structure for `roles`

- ----------------------------TABLE IF EXISTS `roles`;TABLE `roles` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(32) NOT NULL,

`description` varchar(255) NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `uniq_name` (`name`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


- ----------------------------

- Records of roles

- ----------------------------INTO `roles` VALUES ('1', 'login', 'Login privileges, granted after account confirmation');INTO `roles` VALUES ('2', 'admin', 'Administrative user, has access to everything.');


- ----------------------------

- Table structure for `roles_users`

- ----------------------------TABLE IF EXISTS `roles_users`;TABLE `roles_users` (

`user_id` int(11) unsigned NOT NULL,

`role_id` varchar(20) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


- ----------------------------

- Records of roles_users

- ----------------------------INTO `roles_users` VALUES ('1', '1');INTO `roles_users` VALUES ('1', '2');INTO `roles_users` VALUES ('2', '1');INTO `roles_users` VALUES ('3', '1');


- ----------------------------

- Table structure for `tags`

- ----------------------------TABLE IF EXISTS `tags`;TABLE `tags` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`name` varchar(100) NOT NULL,

`url` varchar(100) NOT NULL DEFAULT '',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;


- ----------------------------

- Records of tags

- ----------------------------INTO `tags` VALUES ('1', 'email', '#"justify">- ----------------------------

- Table structure for `tags_materials`

- ----------------------------TABLE IF EXISTS `tags_materials`;TABLE `tags_materials` (

`tag_id` int(10) NOT NULL,

`material_id` int(10) NOT NULL,

KEY `FK_tags_materials_tags` (`tag_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


- ----------------------------

- Records of tags_materials

- ----------------------------INTO `tags_materials` VALUES ('1', '1');INTO `tags_materials` VALUES ('2', '1');INTO `tags_materials` VALUES ('3', '1');INTO `tags_materials` VALUES ('1', '2');INTO `tags_materials` VALUES ('7', '3');INTO `tags_materials` VALUES ('8', '7');INTO `tags_materials` VALUES ('9', '8');INTO `tags_materials` VALUES ('10', '8');INTO `tags_materials` VALUES ('11', '9');INTO `tags_materials` VALUES ('12', '10');INTO `tags_materials` VALUES ('13', '10');INTO `tags_materials` VALUES ('14', '11');INTO `tags_materials` VALUES ('15', '12');


- ----------------------------

- Table structure for `tree`

- ----------------------------TABLE IF EXISTS `tree`;TABLE `tree` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`name` varchar(250) NOT NULL,

`nametrans` varchar(250) NOT NULL,

`left_key` int(10) NOT NULL,

`right_key` int(10) NOT NULL,

`level` int(10) NOT NULL,

PRIMARY KEY (`id`,`nametrans`),

UNIQUE KEY `url` (`nametrans`) USING BTREE,

KEY `key` (`left_key`,`right_key`,`level`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


- ----------------------------

- Records of tree

- ----------------------------INTO `tree` VALUES ('1', 'Главная', 'main', '1', '34', '0');INTO `tree` VALUES ('3', 'Дизайн', 'Dizayn', '18', '19', '1');INTO `tree` VALUES ('4', 'Движок', 'Dvijok', '20', '23', '1');INTO `tree` VALUES ('5', 'Контакты', 'Kontaktyi', '24', '25', '1');


- ----------------------------

- Table structure for `users`

- ----------------------------TABLE IF EXISTS `users`;TABLE `users` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`email` varchar(40) NOT NULL,

`username` varchar(40) NOT NULL,

`password` varchar(64) NOT NULL,

`logins` int(10) unsigned NOT NULL DEFAULT '0',

`last_login` int(10) unsigned DEFAULT NULL,

`rempass` varchar(70) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `uniq_username` (`username`),

UNIQUE KEY `uniq_email` (`email`),

UNIQUE KEY `id` (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


- ----------------------------

- Records of users

- ----------------------------INTO `users` VALUES ('1', '[email protected]', '[email protected]', '56878f874f984e7030652aa0d61550b9d28bec2fe256161c0e56bfd61de7794b', '112', '1338720949', null);INTO `users` VALUES ('2', '[email protected]', '[email protected]', '56878f874f984e7030652aa0d61550b9d28bec2fe256161c0e56bfd61de7794b', '0', null, null);INTO `users` VALUES ('3', '[email protected]', '[email protected]', '56878f874f984e7030652aa0d61550b9d28bec2fe256161c0e56bfd61de7794b', '2', '1338151839', null);


- ----------------------------

- Table structure for `user_tokens`

- ----------------------------TABLE IF EXISTS `user_tokens`;TABLE `user_tokens` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`user_id` int(11) unsigned NOT NULL,

`user_agent` varchar(40) NOT NULL,

`token` varchar(40) NOT NULL,

`type` varchar(100) NOT NULL,

`created` int(10) unsigned NOT NULL,

`expires` int(10) unsigned NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `uniq_token` (`token`),

KEY `fk_user_id` (`user_id`),

CONSTRAINT `user_tokens_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


- ----------------------------

- Records of user_tokens

- ----------------------------


Конфигурационные файлы

Конфигурационные файлы модулей и машрутов Kohana, Apache, PHP, MySQL не включены. Их можно на информационном носителе прилагаемом к диклому.


Оглавление ВВЕДЕНИЕ Глава 1 Постановка задачи 1.1 Техническое задание 1.1.1 Основание для разработки 1.1.2 Назначение разработки 1.1.3 Тре

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2018 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ