Стаж программиста
|
Значение коэффициента К
|
до 2-х лет
|
0,8
|
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,70
|
41,13
|
2
|
Доп. ЗП исполнителя
|
2378,91
|
4,69
|
3
|
Начисления на ЗП
|
6973,97
|
13,74
|
4
|
РС и ПЭВМ
|
15905,2
|
31,35
|
5
|
Прочие расходы
|
4612,57
|
9,09
|
|
Итого:
|
50738,35
|
100
|
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. <http://kohanaframework.org/>
. <http://ru.wikipedia.org/wiki/Kohana>
. <http://www.sdelaysite.com/php/php-1>
. <http://kohana3.ru/>
. <http://www.webcorp.ru/page/cmsabout.html>
. <http://habrahabr.ru/hub/kohanaphp/>
. <http://blogocms.ru/category/tryuki-vebmastera/kohana/>
. <http://forum.php.su/>
. <http://vremenno.net/html-css/css3-review/>
. <http://1popov.ru/bonuscourse/cssform/>
. <http://ckeditor.com/>
. <http://htmlpurifier.org/>
19. <http://github.com>
. <http://www.apache.org/>
. <http://www.php.net/>
. http://www.mysql.com/
. <http://validator.w3.org/>
Приложение. Код программы
..\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",
"ц"=>"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 = 'skutorlike@mail.ru';
//$subject = 'Подтверждение регистрации в КГК';
/* $message = "Ваш логин: $email, Ваш пароль: $password
<br>
<br>Ссылка для подтверждения
аккаунта: <a href='http://localhost/authformer/checkreg/$key'> ПОДТВЕРДИТЬ </a>";
*/
$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 = 'skutorlike@mail.ru';
//$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 = 'skutorlike@mail.ru';
//$subject = 'Восстановление пароля';
$subject
= Kohana::message('emailthemes/rememberpassword','subject');
//$message = "Перейдите по ссылке <a href='http://localhost/authformer/checkcode/$genpass'>Восстановить пароль</a>";
$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"]; // определяем доменное имя
сайта до первого слеша(http://hello.ru)
$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> </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> </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; }
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 style='text-align:center; color:green;'>
ПРОВЕРКА ПОДЛИННОСТИ РЕГИСТРАЦИОННЫХ ДАННЫХ: </p>";
if(isset($error))
{
echo
"<p style='text-align:center; color:red;'>
Код подтверждения регистрации недействителен! </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>Неверно введен
код с картинки. </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"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<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><div
id="header_content_tagline">The System Software Control of Website
with Kohana Framework </div></div><div
id="header_lower"> <div
id="header_content_boxline">"Движок"<div
id="header_content_boxcontent"><br />Вообще-то, движок, это жаргонное выражение, правильное название - программный комплекс управления сайтом. Подобная
система управления может состоять из множества небольших модулей (т.е.
несколько маленьких программ), которые объединены в общую систему.Наиболее
часто встречается аббревиатура CMS - Content Managment System - Система Управления Контентом.Движки, в подавляющем
большинстве случаев, программируются на языке PHP, тем не менее, возможно применение других языков, всё
зависит от программиста и возможностей хостинга. В любом случае, движок всегда
работает в связке с базой данных MySQL
(базы данных так же должны поддерживаться хостером).<br /><b>Принцип действия:</b>Для начала, обратимся к работе обычного сайта. Как
происходит открытие веб-страницы? В строку браузера вводится адрес и
открывается соответствующая ему страница, из тех, которые лежат на сервере.
Если адрес введён неправильно, то получим ошибку 404 (на сервере такая страница
не обнаружена). Как происходит открытие страницы на сайте, которой функционирует
с помощью CMS? Страниц, как таковых, на сервере
нет. Есть база данных, в которой находится текстовая информация и есть
программа, которая работает с этой базой данный (тот самый движок). В строку
браузера вводится адрес, в соответствии с адресом, программа «выдёргивает» из
базы определённый кусок текста, вставляет его в заранее заданный дизайн и
показывает посетителю. На все эти действия уходят доли секунды.Таким образом,
страница будет генерироваться столько раз, сколько её будут запрашивать посетители.Итак,
мы пришли к определениям статической и динамической страницы.Статическая
страница - находится на сервере в виде отдельного файла и отображается при
каждом запросе.Динамическая страница - фактически, её не существует, т.е. она
собирается заново при каждом новом запросе посетителя сайта.</div></div> </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='http://localhost/authformer/checkreg/$key'> ПОДТВЕРДИТЬ </a>";?>
..\aplication\views\emailbody\rememberpassword.php
<?php echo "Перейдите по ссылке
<a
href='http://localhost/authformer/checkcode/$genpass'>восстановить пароль</a>"; ?>
..\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(' ',
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(' ',
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(' ',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"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<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>На главную </a></div>
<div>Добавление</a></div>
<div>Редактирование</a></div>
<div>Пользователи</a></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:skutorlike@mail.ru">©
Автор сайта: 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:skutorlike@mail.ru?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\">skutorlike@mail.ru</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', 'http://localhost/materials/showcontent/59');INTO `tags` VALUES ('2',
'author', 'http://localhost/materials/showcontent/60');INTO `tags` VALUES ('3',
'contact', 'http://localhost/materials/showcontent/61');INTO `tags` VALUES
('7', 'deletematerials', 'http://localhost/materials/showcontent/7');INTO
`tags` VALUES ('8', 'info', 'http://localhost/materials/showcontent/8');INTO
`tags` VALUES ('9', 'material2', 'http://localhost/materials/showcontent/9');INTO
`tags` VALUES ('10', 'mat2', 'http://localhost/materials/showcontent/10');INTO
`tags` VALUES ('11', 'zero', 'http://localhost/materials/showcontent/11');INTO
`tags` VALUES ('12', 'example', 'http://localhost/materials/showcontent/12');INTO
`tags` VALUES ('13', 'foryou',
'http://localhost/materials/showcontent/13');INTO `tags` VALUES ('14', 'test',
'http://localhost/materials/showcontent/14');INTO `tags` VALUES ('15',
'second', 'http://localhost/materials/showcontent/15');
- ----------------------------
- 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,
`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',
'skutorlike@mail.ru', 'skutorlike@mail.ru', '56878f874f984e7030652aa0d61550b9d28bec2fe256161c0e56bfd61de7794b',
'112', '1338720949', null);INTO `users` VALUES ('2', 'zoikazaripova@mail.ru',
'zoikazaripova@mail.ru',
'56878f874f984e7030652aa0d61550b9d28bec2fe256161c0e56bfd61de7794b', '0', null,
null);INTO `users` VALUES ('3', 'winist@yandex.ru', 'winist@yandex.ru',
'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 не включены. Их можно на информационном носителе
прилагаемом к диклому.