- •Оглавление
- •I. Инструментарий
- •II. Шаблоны проектирования
- •1. Простой
- •2. Шаблонная функция
- •3. Метод буферизации
- •III. Фрэймворк Kohana
- •1. Знакомство с Kohana
- •2. Роутинг
- •7. Взаимодействие модели, контроллера и шаблона
- •8. Создание новых классов и подключение сторонних библиотек
- •9. Конфигурирование
- •10. Языковые файлы
- •11. Системные сообщения
- •12. Хелперы
- •Мы можем использовать любые строковые функции php, добавляя к ним класс utf8
- •13. Этапы создания проекта
- •14. Виджеты
- •Сложные запросы
- •17. Модуль orm
- •Т.Е. Если мы вторым параметромне указываем идендификатор, мы добавляем запись, если указываем – мы обновляем строку с указанным идентификатором.
- •Но если мы попытаемся удалить запись, которой не существует, то увидим сообщение об ошибке. Чтобы избавиться от этой ошибки, есть специальный метод, который проверяет, возвращает ли запрос результат.
- •Если метод возвращает true, то происходит удаление записи.
- •Если таблица userimage связана стаблице user связью belongs_to, то таблица user связана с таблицей userimage связью has_many.
- •19. Использование orm в виджетах
- •20. Модуль Auth
- •21. Модуль Image
- •22. Совместное использование модуля Image и js-скриптов, об-рабатывающих изображения.
- •Далее в контроллер добавим функцию для работы с изображениями.
- •В контроллере произведем вставку изображений в папку и запись в таблицу.
- •Чтобы вывести постраничную навигацию, например, на страницу пользователей, нам сперва нужно узнать общее количество пользователей, которое впоследствии нужно передать в параметр total_items.
- •А вот и сам экшн:
- •Как видно из листинга в шаблон мы передали переменную pagination, в которой будет находиться шаблон вывода ссылок на страницы. Осталось только вывести данную переменную в шаблоне.
- •Если в роуте используются параметры controller, action, directory либо id, то их необходимо передавать в класс pagination в метод route_params().
- •24. Операции crud. Разработка системы администрирования.
- •25. Модуль кэширования
- •В kohana также имеется отдельный модуль cache. Для его подключения необходимо раскомментировать нужную строку в файле bootstrap.Php
- •После подключения модуля необходимо скопировать из папки с модулем конфигурационный файл и переместить его в папку config/ в конфигурационном файле cache.Php имеется несколько групп настроек.
- •Каждая группа настроек работает со своим драйвером для кэширования. В зависимости от выбранного типа настроек, закэшированные файлы будут храниться либо в памяти компьютера, либо в других файлах.
- •28. Многоуровневые комментарии. Алгоритм NestedSets. Модуль orm-mptt
- •29. Модальное окно на ajax
- •30. Парсинг
- •31. Отладка
- •32. Профилирование
- •33. Документация kohana, модуль Userguide
- •34. Модуль Codebench
- •36. Другие модули Kohana
- •37. Состояние проекта
- •38. Дополнительное конфигурирование
- •39. Уязвимость Kohana
- •Установка yii
- •2. Структура yii
- •3. Конфигурирование yii, файл config/main.Php
- •4. Маршрутизация
- •7.Подключение шаблонов
- •8. Полезное.
- •9. Модель. Работа с базой данных.
- •11. Валидация
- •1. Определение класса модели
- •2. Определение правил проверки
- •4. Стандартные правила валидации
- •12. Конструктор форм
- •13. Хелперы форм
- •14. Обработка изображений
- •15. Постраничная навигация и cActiveDataProvider
- •16. Виджеты
- •17. Создание виджета круговой диограммы
- •18. Виджет cMenu
- •19. Хлебные крошки. Виджет cBreadcrumbs
- •20. Виджет cDetailView
- •21. Виджет chml, хелперы html
- •22. Виджет cListView
- •23. Виджет cGridView, таблица администратора
- •25. Модули
- •26. Авторизация
- •27. Контроль доступа на основе ролей
- •V. Краткий обзор и сравнение фрэймворков yii и Kohana
- •VI. Система контроля версий
- •Синхронизация локальных файлов с репозиторием
- •Открытие проекта Mercurial в среде ide
- •Получение файлов из репозитория
- •Импорт файлов в репозиторий
- •Изменение файлов исходного кода
- •Просмотр изменений в редакторе исходного кода
- •Просмотр информации о состоянии файла
- •Метки и условные цвета
- •Ярлыки состояния файлов
- •Окно контроля версий
- •Сравнение редакций файлов
- •Внесение изменений в локальную рабочую копию
- •Переходы между различиями в сравниваемых файлах
- •Изменение критериев просмотра
- •Слияние редакций файлов
- •Фиксация исходных файлов в репозитории
- •Обновление локальных копий
- •Выполнение фиксации
- •Обновление проблем
- •Выгрузка локальных изменений в общий репозиторий
- •Клонирование репозитория Git из GitHub с использованием протокола ssh
- •VI. Обзор рынка
- •VII. Программа курса php для продвинутых
- •Обзор рынка.
- •Php для продвинутых
Мы можем использовать любые строковые функции php, добавляя к ним класс utf8
UTF8. Листинг 12.21 |
Использование строковых функций $str = UTF8::ltrim($str); $length = UTF8::strlen($str); $position = UTF8::strpos($str, $search); |
Upload
Upload. Листинг 12.22 |
Сохранить загруженный файл: $array = Upload::save($_FILES[‘file’]); Проверка типа загруженных данных: $array->rule(‘file’, ‘Upload::type’, array(array(‘jpg’, ‘png’))); Проверка размера загруженных данных: $array->rule(‘file’, ‘Upload::size’, array(‘1M’)); Проверка на то, не пустой ли файл: $array->rule(‘file’, ‘Upload::not_empty’); Вернет TRUE, если все проверки прошли успешно: $array->check(); |
13. Этапы создания проекта
В файле bootstrap.php настроим роутинг по-умолчанию.
Настройка роутов. Листинг 13.1
Route::set(‘default’, ‘(<controller>(/<action>(/<stuff>)))’, array(‘stuff’ =>‘.*’))
->defaults(array(
‘controller’ =>‘index’,
‘action’ =>‘index’,
));
В папке config создадим файл settings.php
Конфигурационный файл. Листинг 13.2
<?php defined(‘SYSPATH’) or die(‘No direct script access.’);
/*
* Настройки сайта
*/
return array(
‘site’ => array(
‘name’ =>‘Разработка сайтов’,
‘description’ =>‘Делаю сайты, порталы, программы для интернета и обучаю web-программиованию.’,
‘title’ =>‘WEB-мастер предлагает свои услуги по разработке сайтов, порталов и обучению web-программирования.’,
),
);
В папке classes/controller создадим файл base.php, в котором спроектируем базовый контроллер, от которого будут наследоваться все остальные контроллеры.
Базовый контроллер. Листинг 13.3
<?php defined(‘SYSPATH’) or die(‘No direct script access.’);
/*
* Общий базовый класс
*/
class Controller_Base extends Controller_Template {
//определение шаблона по-умолчанию
public $template = ‘v_base’;
public function before() {
parent::before();
// Подключение конфигурационного файла settings.php
$config = Kohana::$config->load(‘settings’);
// Передача переменных в шаблон
$this->template->site_name = $config[‘site’][‘name’];
$this->template->site_description = $config[‘site’][‘description’];
$this->template->site_title = $config[‘site’][‘title’];
// Подключаем стили и скрипты
$this->template->styles = array(‘media/css/style.css’);
$this->template->scripts = array(‘media/js/footer.js’);
// Подключаем блоки
$this->template->block_left = null;
$this->template->block_center = null;
$this->template->block_right = null;
}
}
Создадим базовый шаблон v_base.php в папке views. Сейчас обратите внимание на выделенные конструкции if и foreach. Первая конструкция if (isset($block_left)) проверяет, существует ли переменная $block_left. Если данная переменная существует (в нашем случае это массив, определяемый в контроллере), то проходимся foreach-ем по каждому элементу массива, выводим на экран индекс массива и значения из модели.
Базовый шаблонv_base.php. Листинг 13.4
<!DOCTYPE>
<html>
<head>
<scriptsrc="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<title><?=$site_name?> | <?=$site_title?></title>
<meta content="text/html; charset=utf8" http-equiv="content-type">
<?foreach ($styles as $file_style):?>
<?=html::style($file_style)?>
<?endforeach?>
<?foreach ($scripts as $file_script):?>
<?=html::script($file_script)?>
<?endforeach?>
</head>
<body>
<div class="menu">меню сайта</div>
<div class="main_line">
<div class="bigtext"><? echo $site_name?></div>
<p><? echo $site_description."<br />" ?><p>
</div>
<div id="content">
<? if (isset($block_left)):?>
<div class="block_left">
<?foreach ($block_left as $index_left => $left):?>
<?=$index_left?>
<?foreach ($left as $left_small):?>
<div class="block_left_top"><a href=‘#’><?=$left_small; ?></a></div>
<?endforeach?>
<?endforeach?>
</div>
<?endif?>
<? if (isset($block_right)):?>
<div class="block_right">
<?foreach ($block_right as $index_right => $right):?>
<?=$index_right?>
<?foreach ($right as $right_small):?>
<div class="block_right_top"><a href=‘#’><?=$right_small; ?></a></div>
<?endforeach?>
<?endforeach?>
</div>
<?endif?>
<?= $block_center; ?>
</div>
<div class="footer">
<a href="http://mikhalkevich.colony.by">разработка сайтов под ключ</a>
</div>
</body>
</html>
В папке classes/model создадим модели для хранения данных. Позже, в моделях, мы будем хранить значения из базы данных. Пока же ограничимся массивом с данными.
Модель text (файл text.php). Листинг 13.5
<?phpdefined(‘SYSPATH’) ordie(‘No direct script access.’);
classModel_TextextendsModel {
// Все новости
public function all_text()
{
returnarray(
‘about’ =>‘Разработка сайтов под ключ’,
‘contact’ =>‘Михалькевич Александр Викторович, МТС 8(029)763-93-82’,
‘portfolio’ =>‘Здесь будет мое портфолио’,
);
}
}
Модель menu (файл menu.php). Листинг 13.6
<?php defined(‘SYSPATH’) or die(‘No direct script access.’);
class Model_Menu extends Model {
// Все новости
public function all_leftmenu()
{
returnarray(
‘Статьи’ =>‘Тут мои статьи’,
‘Книги’ =>‘Тут мои книги’,
‘Сайты’ =>‘Тут мои сайты’,
‘Блог’ =>‘Тут мой блог’,
‘Дневник’ =>‘Тут мой дневник’,
);
}
public function all_leftmenu2()
{
return array(
‘Link1’ =>‘Тут что-то еще’,
‘Link2’ =>‘Тут что-то еще’,
);
}
}
После того, как базовый контроллер, основной шаблон, модель и файл настроек создан, можно приступить к проектированию страниц. Все остальные контроллеры у нас будут наследоваться от Controller_Base. Начнем с индексной страницы.
Контороллеры экшн для главной страницы (файл index.php). Листинг 13.7
<?php defined(‘SYSPATH’) or die(‘No direct script access.’);
/*
* Базовый класс главной страницы
*/
class Controller_Index extends Controller_Base {
public function before() {
parent::before();
}
public function action_index() {
// Получаем данные из модели
$products = Model::factory(‘text’)->all_text();
$leftmenu = Model::factory(‘menu’)->all_leftmenu();
$leftmenu2 = Model::factory(‘menu’)->all_leftmenu2();
$content = View::factory(‘v_center’, array(
‘products’ => $products,
));
// Вывод в шаблон
$this->template->block_left = array("Раздел" => $leftmenu, "Ссылки" => $leftmenu2);
$this->template->block_center = $content;
$this->template->block_right = array("Раздел справа" => $leftmenu2);
}
}
В папку views cоздадим дополнительные элементы шаблона: v_center.php - для центрального блока.
v_center.php. Листинг 13.8
<div class="block_center">
<?foreach($products as $url => $prod):?>
<?=$url?> - <?=$prod?><br />
<?endforeach?>
</div>
В папке media/css создадим файл style.css (который подключается у нас в базовом контроллере). Обратите внимание на стили для тэга #content. Здесь мы зафиксировали минимальную ширину, до которой будет сужаться страница (700px). При дальнейшем уменьшении страницы будет появляться ползунок.
Стили для сайта style.css. Листинг 13.9
body {
padding:0px;
margin:0px;
background:#F4F5EB;
color: #333333;
font-size:13px;
font-family:arial;
}
#content {min-width: 700px; max-width: 100%; width:expression((document.documentElement.clientWidth||document.body.clientWidth)<700?’700px’:(document.body.clientWidth> 1000? "100%": "auto")); margin: 0 auto; text-align: left;}
.main_line {
background:#E3E3D6;
padding:33px;
}
.menu {
text-align:center;
padding:10px;
}
.bigtext {
font-size:22px;
font-weight:bold;
}
.block_left {
float:left;
width:200px;
padding:7px;
}
.block_right {
float:right;
padding:7px;
width:200px;
}
.block_center {
margin-left:214px;
}
.block_right_top {
font-weight:bold;
text-align:center
}
.block_left_top {
font-weight:bold;
text-align:center
}
.footer {
text-align:center;
width:100%;
}
.footer a {
line-height:43px;
}
В базовом контроллере, помимо стилей, мы подключали скрипт footer.js, задача которого держать footer всегда внизу страницы. Вот он:
Скрипт footer.js. Листинг 13.10
$(function(){
$(window).bind("load", function() {
var footerHeight = 0,
footerTop = 0,
$footer = $(".footer");
positionFooter();
function positionFooter() {
footerHeight = $footer.height();
footerTop = ($(window).scrollTop()+$(window).height()-footerHeight)+"px";
if ( ($(document.body).height()+footerHeight) <$(window).height()) {
$footer.css({
position: "absolute"
}).animate({
top: footerTop
})
} else {
$footer.css({
position: "static"
})
}
}
$(window)
.scroll(positionFooter)
.resize(positionFooter)
});
});
Если мы все правильно сделали, то должны увидеть следующую страницу:
