- •Оглавление
- •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 для продвинутых
19. Использование orm в виджетах
Процесс подключения виджетов был описан ранее. Сейчас рассмотрим тот же процесс, но с использованием ORM.
Этапы разработки:
Прописание роута для виджетов в файле bootstrap.php
Создание переменной, которая содержит контроллер с виджетом. И передача данной переменной в шаблон. Мы создали массив $block_left, который содержит пока один элемент – виджет левого меню для товаров. Таким образом, мы изначально продумали, что переменная $block_left может содержать любое количество подключаемых виджетов (либо элементов массива $block_left).
Индексный контоллер с подключаемым виджетом. Листинг 19.1
publicfunctionbefore() {
parent::before();
// формируемпеременнуювиджета
$widget_leftmenu =
REQUEST::factory('widgets/menuleft/index')->execute();
…
// Вывод в шаблон
$this->template->block_left = array($widget_leftmenu);
$this->template->block_right = array($widget);
}
В шаблоне v_base мы проверяем, существует ли массив $block_left. Если существует, то проходимся по всем элементам массива и выводим каждый элемент. Каждый элемент массива – это отдельный виджет.
Подключение виджетов в шаблоне v_base.php. Листинг 19.2
…
<? if (isset($block_left)):?>
<divclass="block_left">
<?foreach($block_left as $left):?>
<div class="block_left_small">
<?=$left?>
</div>
<?endforeach?>
</div>
<?endif?>…
А вот, непосредственно, и сам виджет. Данный виджет подключает шаблон v_left_menu и передает в шаблон следующие параметры: переменные link, menu_text и массив $left_block. Массив $left_block содержит список категорий с подкатегориями.
ВиджетWidgets_Menuleft из папки widgets. Листинг 19.3
<?php defined('SYSPATH') or die('No direct script access.');
/*
* Общий базовый класс
*/
class Controller_Widgets_Menuleft extends Controller_Template {
//определение шаблона по-умолчанию
public $template = 'widget/v_left_menu';
public function action_index() {
$leftmenu = ORM::factory('bookscategorie')->find_all();
$this->template->left_block = $leftmenu;
$this->template->link = 'tovars/subcat';
$this->template->menu_text = 'Товары даром или на обмен';
}
}
Модель bookscategorie. В данной модели мы создали связь с таблицей bookssubcategories.
Модель bookscategorie. Листинг 19.4
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Bookscategorie extends ORM {
protected $_has_many = array(
'subcategories' => array(
'model' =>'bookssubcategorie',
'foreign_key' => 'category_id',
),
);
}
Данный виджет подключает шаблон v_left_menu. Название блока меню мы выводим в переменной $menu_text, ссылки формируются в переменной $link. Для того чтобы вывести категории с подкатегориями, нужно пройтись по массиву $left_block.
Передача переменных из виджета в шаблон. Листинг 19.5 |
<div class="left_title"><?=$menu_text?></div> <ul class="navigation"> <?foreach ($left_block as $left_small):?> <li><a href='#'><?=$left_small->name; ?></a> <?if($left_small->subcategories->find_all()) :?> <ul> <?foreach ($left_small->subcategories->find_all() as $sub) :?> <li><?= HTML::anchor($link.'/'.$sub->id, $sub->name)?></li> <?endforeach?> </ul> <?endif?> </li> <?endforeach?> </ul> |
Вот что мы получим:
Чтобы помимо данного виджета вывести еще один блок, нам достаточно в контроллере, который вызывает данный виджет, прописать еще один элемент массива.
Добавление элемента массива в $block_left. Листинг 19.6 |
publicfunctionbefore() { parent::before(); // формируемпеременнуювиджета $widget_leftmenu = REQUEST::factory('widgets/menuleft/index')->execute(); … // Вывод в шаблон $this->template->block_left = array($widget_leftmenu, “Привет! Тут может быть еще один виджет!” ); $this->template->block_right = array($widget); } |
Получим следующее:
