Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP для продвинутых.docx
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
12.54 Mб
Скачать

19. Использование orm в виджетах

Процесс подключения виджетов был описан ранее. Сейчас рассмотрим тот же процесс, но с использованием ORM.

Этапы разработки:

  1. Прописание роута для виджетов в файле bootstrap.php

  2. Создание переменной, которая содержит контроллер с виджетом. И передача данной переменной в шаблон. Мы создали массив $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);

    }

  3. В шаблоне 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?>…

  4. А вот, непосредственно, и сам виджет. Данный виджет подключает шаблон 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 = 'Товары даром или на обмен';

    }

    }

  5. Модель 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',

    ),

    );

    }

  6. Данный виджет подключает шаблон 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);

}

Получим следующее:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]