Создание сайтов в Челябинске. Продвижение. Оптимизация

Разработка сайтов, поисковая оптимизация, продвижение, техническая поддержка и обслуживание вебсайтов любой сложности. Быстро, качественно и по разумной цене.

Создание компонента "Каталог" для Joomla 3 (Часть 4)

Разработка компонента для Joomla 3 с нуляВ прошлой статье мы написали класс модели JModelList и познакомились с основными функциями, которые необходимы чтобы создать рабочий компонент. Теперь пришло время сделать вывод данных в браузер, для этого нам понадобится еще один класс JViewLegacy. Приступим к его созданию! Для тех кто не читал предыдущие статьи вот ссылка создание модели JModelList и таблицы JTable

7. Шаг - создание класса JViewLegacy

Сначала надо создать файловую структуру. Папка views у нас уже должна быть, но до сих пор пустая, сейчас там нужно создать папку с названием вида т.е. catalogue, если еще не заметили то поройтесь в компонентах Joomla и везде заметите что основной вид и сам компонент обычно совпадают по названию (переопределить конечно можно, но лучше оставить там как требует Joomla). Итак создаем в папке views папку catalogue в ней файл view.html.php и папку tmpl, а в ней default.php. Папка tmpl хранит HTML шаблоны (layouts) для вывода информации полученной из модели. В итоге должна получится такая структура:

Ну а теперь код файла view.html.php

 <?php defined('_JEXEC') or die;

JLoader::register('CatalogueHelper', JPATH_COMPONENT.'/helpers/catalogue.php');

class CatalogueViewCatalogue extends JViewLegacy
{
  protected $categories;
  protected $items;
  protected $pagination;
  protected $state;

  public function display($tpl = null)
  {
    $this->items    = $this->get('Items');
    $this->pagination  = $this->get('Pagination');
    $this->state    = $this->get('State');
    $this->categories  = $this->get('Categories');

    if (count($errors = $this->get('Errors')))
    {
      JError::raiseError(500, implode("\n", $errors));
      return false;
    }

    CatalogueHelper::addSubmenu('catalogue');

    $this->addToolbar();
    $this->sidebar = JHtmlSidebar::render();
    parent::display($tpl);
  }

  protected function addToolbar()
  {
    $canDo = CatalogueHelper::getActions();
    $bar = JToolBar::getInstance('toolbar');

    JToolbarHelper::title(JText::_('COM_CATALOGUE_MANAGER'), 'component.png');
    if ($canDo->get('core.create'))
    {
      JToolbarHelper::addNew('item.add');
    }

    if (($canDo->get('core.edit')))
    {
      JToolbarHelper::editList('item.edit');
    }

    if ($canDo->get('core.edit.state'))
    {
      if ($this->state->get('filter.state') != 2)
      {
        JToolbarHelper::publish('item.publish', 'JTOOLBAR_PUBLISH', true);
        JToolbarHelper::unpublish('item.unpublish', 'JTOOLBAR_UNPUBLISH', true);
      }

      if ($this->state->get('filter.state') != -1)
      {
        if ($this->state->get('filter.state') != 2)
        {
          JToolbarHelper::archiveList('item.archive');
        }
        elseif ($this->state->get('filter.state') == 2)
        {
          JToolbarHelper::unarchiveList('item.publish');
        }
      }
    }

    if ($canDo->get('core.edit.state'))
    {
      JToolbarHelper::checkin('item.checkin');
    }

    if ($this->state->get('filter.state') == -2 && $canDo->get('core.delete'))
    {
      JToolbarHelper::deleteList('', 'items.delete', 'JTOOLBAR_EMPTY_TRASH');
    }
    elseif ($canDo->get('core.edit.state'))
    {
      JToolbarHelper::trash('catalogue.trash');
    }


    if ($canDo->get('core.admin'))
    {
      JToolbarHelper::preferences('com_catalogue');
    }
    

    JHtmlSidebar::setAction('index.php?option=com_catalogue&view=catalogue');

    JHtmlSidebar::addFilter(
      JText::_('JOPTION_SELECT_PUBLISHED'),
      'filter_published',
      JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true)
    );

    JHtmlSidebar::addFilter(
      JText::_('JOPTION_SELECT_CATEGORY'),
      'filter_cat_id',
      JHtml::_('select.options', CatalogueHelper::getCategoriesOptions(), 'value', 'text', $this->state->get('filter.cat_id'))
    );

  }

}

Теперь разберемся с каждой строчкой:

1: Все стандартно;

3: Загрузка класса помошника (вернемся к нему чуть позже);

5: Объявление класса CatalogueViewCatalogue;

7 - 10: Подготовка переменных;

12: Функция JView::display() - если помните у контроллера тоже есть эта функция при ее вызове срабатывает и эта функция! В данном случае она позволяет нам обратиться к модели, загрузить нужные данные и отправиться дальше;

14 - 17: Вызовы функций Модели JModelList, которые мы писали в прошлой статье, обратите внимание на функцию getCategories() ее не было чтобы не усложнять модель, но сейчас она нужно и мы ее добавим в модель чуть позже;

19 - 23: Функция класса JObject getErrors() возвращает список всех ошибок и если таковые есть, то нужно сказать об этом пользователю;

25: Вызов функции из класса-помошника;

27: Вызов функции addToolbar() - она формирует панель кнопок Joomla.

29: Формируем боковую понель;

30: Действие по умолчанию для класса JViewLegacy;

33: Объявление функции addToolbar();

34: Получаем объект класса JAccess чтобы проверять права пользователя и в зависимости от них решаем показывать или скрывать определенные действия;

37: Создаем заголовок;

39 - 41: Проверяем права на создание новой записи и если все ок то добавляем кнопку в тулбар;

43 - 46: Проверяем права на редактирование;

48 - 67: Проверка прав на изменение состояния (опубликовано или не опубликовано и т.д.)

69 - 72: Кнопка "Разблокировать";

74 - 81: Условие для показа кнопок "В корзину" и "Очистить корзину". В Joomla объект считается в корзине если поле state = -2. Данное условие как раз и проверяет сначало состояние поля state а потом права пользователя на удаление.

84 - 87: Проверка прав на администрирование компонента и добавление кнопки "Настройки" если это администратор;

92 - 102: Формирование сайдбара, добавляем списки фильтров категорий и состояний записей, чтобы была возможность выводить удаленные объекты или товары из определенной категории каталога.

Понравилась статья? Возник вопрос? Вступайте в нашу группу и смело задавайте vk.com/saity74