- •Оглавление
- •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 для продвинутых
Сложные запросы
JOIN Query builder. Листинг 16.11 |
$query = DB::select(‘authors.name’, ‘posts.content’) ->from(‘authors’) ->join(‘posts’) ->on(‘authors.id’, ‘=‘, ‘posts.author_id’) ->where(‘authors.name’, ‘=‘, ‘smith’) |
Агрегирующие запросыQuerybuilder. Листинг 16.12 |
$query = DB::select(‘username’, array(‘COUNT("id")’, ‘total_posts’) ->from(‘posts’) ->group_by(‘username’) ->having(‘total_posts’, ‘>=‘, 10) |
Подзапросы Query builder. Листинг 16.13 |
$sub = DB::select(‘username’, array(‘COUNT("id")’, ‘total_posts’) ->from(‘posts’)->group_by(‘username’)->having(‘total_posts’, ‘>=‘, 10); $query = DB::insert(‘post_totals’, array(‘username’, ‘posts’))->select($sub) |
Вложенные запросы Querybuilder. Листинг 16.14 |
// SELECT * FROM `users` WHERE ( `id` IN (1, 2, 3, 5) OR ( `last_login` <= 1276020805 OR `last_login` IS NULL ) ) AND `removed` IS NULL $query = DB::select()->from(‘users’) ->where_open() ->where(‘id’, ‘IN’, $expired) ->and_where_open() ->where(‘last_login’, ‘<=‘, $last_month) ->or_where(‘last_login’, ‘IS’, NULL) ->and_where_close() ->where_close() ->and_where(‘removed’,’IS’, NULL); |
17. Модуль orm
Задача ORM (англ. Object-relational mapping, - рус. Объектно-реляционное отображение) – упростить организацию связей таблиц баз данных, и данный модуль использует методы Database. Следовательно, для его использования, помимо раскомментирования самого модуля ORM, должен быть подключен модуль Database.
Подключение ORM в файле bootstrap.php. Листинг 17.1 |
Kohana::modules(array( … ‘database’ => MODPATH.’database’, ‘orm’ => MODPATH.’orm’, … )); |
Для того чтобы начать работу с базой данных с помощью модуля ORM, необходимо в папке model создать контроллер, наследующий класс ORM. Имя контроллера должно совпасть с именем таблицы из базы данных. Если таблица в базе данных имеет множественное имя, например, products, то имя модели должно быть в единственном числе: Model_Product.
Создание модели. Листинг 17.2 |
class Model_Maintext extends ORM { } |
Создание такой модели аналогично выполнению следующего SQL-запроса: SELECT * FROMproducts.Причем, по умолчанию считается, что имя модели - это единственное число от имени таблицы, первичный ключ – это поле id, и мы используем дефолтные настройки к базе данных, которые были прописаны в модуле database().
В идеале, одна модель соотносится с одной таблицей.
Но иногда возникают задачи, когда нужно для одной таблицы создать несколько моделей. Например, для таблицы users одна модель будет наследована откласса авторизации, а вторая модель – от класса ORM.
Создание модели extendsORM. 17.3 |
class Model_User extends ORM {
} |
Создание модели extends Model_Auth_User. 17.4 |
class Model_Usersimage extends Model_Auth_User {
} |
В таком случае, у нас будут две модели с разными именами. И для того, чтобы привязать модель с именем usersimage к таблице users, необходимо создать переменную $_table_name, в которой содержится имя таблицы для текущей модели.
Переопределять параметры по умолчанию необходимо в следующихслучаях:
Если имя модели не сопостовимо с множественным числом имени таблицы;
Если имя столбца первичного ключа имеет имя не id, а какое-нибудь другое;
Если для данного модуля необходимо поменять группу настроек базы данных.
Создание модели с переопределенными параметрами. Листинг 17.5 |
class Model_Product extends ORM { protected $_table_name = ‘products’; protected $_primary_key = ‘id’; protected $_db_group = ‘default’; } |
INSERT
INSERT. Листинг 17.6 |
public function action_index() { $a = ORM::factory(‘product’); $a -> id_razdel = 3; $a ->name = “Новаязапись”; $a ->cost = “200 000 руб.”; $a -> save(); } |
При вызове данного экшна выполнится запрос:
INSERT INTO products (id_razdel, name, cost) VALUES (3, “Новаязапись”,“200 000 руб.”);
UPDATE
UPDATE. Листинг 17.7 |
public function action_index() { $a = ORM::factory(‘product’, 1); $a ->name = “Новаязапись”; $a -> save(); } |
