•  
  •  
  •  
  •  
1 1 1 1 1 1 1 1 1 1 Рейтинг 5.00 (1 Голос)
Как ведется разработка расширений под Joomla! 3.0 – особенности администраторской панели и доработка кода (Статья 5) - 5.0 out of 5 based on 1 vote

Эта заключительная пятая статья относится к разработке расширений для Joomla 3.0. Она позволит нам разобраться с финальными нюансами, которые заключаются в небольшой чистке. Мы поговорим о дополнительных возможностях, добавлением которых можно заняться в будущем.

Шаг 1: Создание администраторского интерфейса

Lendr используется для создания фронт-энд приложения, поэтому большая часть функционала может быть применена пользователем на фронт-энде. Для нашего примера будет использоваться администраторская панель Lendr как дополнительный функционал с некоторыми базовыми настройками.

Список следующих файлов были созданы для администраторского сегмента. Он представлен хелпером, контроллером, моделью, представлением, файлом доступа, файлом конфигурации и языковым файл.

Нами будет рассмотрен каждый из них, а начать следует с точки входа компонента.

administrator/components/com_lendr/lendr.php

<?php // No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
 
//load classes
JLoader::registerPrefix('Lendr', JPATH_COMPONENT_ADMINISTRATOR);
 
//Load plugins
JPluginHelper::importPlugin('lendr');
 
//application
$app = JFactory::getApplication();
 
// Require specific controller if requested
$controller = $app->input->get('controller','display');
// Create the controller
 
$classname  = 'LendrControllers'.ucwords($controller);
$controller = new $classname();
 
// Perform the Request task
$controller->execute();

Этому коду присуща высокая схожесть с кодом из точки входа фронт-энда. Чаще всего он используется, чтобы перенаправлять трафик для нужного контроллера.

administrator/components/com_lendr/controllers/display.php

<?php defined( '_JEXEC' ) or die( 'Restricted access' ); 
 
class LendrControllersDisplay extends JControllerBase
{
  public function execute()
  {
    // Get the application
    $app = $this->getApplication();
 
    // Get the document object.
    $document     = JFactory::getDocument();
 
    $viewName     = $app->input->getWord('view', 'statistics');
    $viewFormat   = $document->getType();
    $layoutName   = $app->input->getWord('layout', 'default');
    $app->input->set('view', $viewName);
 
    // Register the layout paths for the view
    $paths = new SplPriorityQueue;
    $paths->insert(JPATH_COMPONENT . '/views/' . $viewName . '/tmpl', 'normal');
 
    $viewClass  = 'LendrViews' . ucfirst($viewName) . ucfirst($viewFormat);
    $modelClass = 'LendrModels' . ucfirst($viewName);
    $view = new $viewClass(new $modelClass, $paths);
    $view->setLayout($layoutName);
 
    // Render our view.
    echo $view->render();
 
    return true;
  }
}

Вам должно быть удалось отметить схожие черты, которые роднят данный контроллер и дефолтный контроллер фронт-энда. Ними выполняются одни и те же задачи, но в этом случае нами будет установлено иное представление по умолчанию.

Далее займемся рассмотрением файла html.php, который размещен в папке представления по умолчанию (этим представлением является statistics).

administrator/components/com_lendr/views/statistics/html.php

<?php defined( '_JEXEC' ) or die( 'Restricted access' ); 
 
class LendrViewsStatisticsHtml extends JViewHtml
{
  function render()
  {
    $app = JFactory::getApplication();
 
    //retrieve task list from model
    $model = new LendrModelsStatistics();
    $this->stats = $model->getStats();
    $this->addToolbar();
 
    //display
    return parent::render();
  } 
    /**
     * Add the page title and toolbar.
     * 
     */
    protected function addToolbar()
    {
        $canDo  = LendrHelpersLendr::getActions();
        // Get the toolbar object instance
 
        $bar = JToolBar::getInstance('toolbar');
        JToolbarHelper::title(JText::_('COM_LENDR_STATISTICS'));
 
        if ($canDo->get('core.admin'))
        {
            JToolbarHelper::preferences('com_lendr');
        }
    }
}

Первым, чем следует заняться, так это расширением класса JViewHtml. Это обеспечит нам доступ к базовому функционалу.

Далее мы переходим к обычному вызову нашей модели, чтобы загрузить данные, необходимые для нашего представления.

Функция addToolbar() чаще всего является добавлением элементов для верхней панели инструментов. Так как нами создается простая администраторская панель, в которой используется ограниченный функционал, у нас будет всего один компонент на панели инструментов. Значит, для начала нам необходимо получить экземпляр обычного toolbar-класса. После этого можно перейти к назначению заголовка и кнопок этого экземпляра. Следует обратить внимание на тот факт, что нами используются языковые константы.

После этого мы переходим к отображению нашего представления. Это делается так же, как и для фронт-энда. Эта функция нами также вызывает наш хелпер класс. Поэтому следует перейти к его рассмотрению.

Каким образом разрабатываются расширения для Joomla! 3.0 – интерфейс администратора и доработка кода (Статья 5)

administrator/components/com_lendr/helpers/lendr.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_lendr
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
/**
 * Lendr component helper.
 *
 * @package     Joomla.Administrator
 * @subpackage  com_lendr
 */
class LendrHelpersLendr
{
  public static $extension = 'com_lendr';
 
  /**
   * @return  JObject
   */
  public static function getActions()
  {
    $user = JFactory::getUser();
    $result = new JObject;
    $assetName = 'com_lendr';
    $level = 'component';
    $actions = JAccess::getActions('com_lendr', $level);
 
    foreach ($actions as $action)
    {
      $result->set($action->name, $user->authorise($action->name, $assetName));
    }
 
    return $result;
  }
}

Хелпер у нас заключается в одной функции getActions(), которой обеспечивается обращение к файлу access.xml, который расположен в корневом каталоге папки элемента, и загружает в объект значения, найденные в XML.

Следует рассмотреть файл access.xml

administrator/components/com_lendr/access.xml

<?xml version="1.0" encoding="utf-8"?>
<access component="com_lendr">
  <section name="component">
    <action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
  </section>
</access>

Этот файл используется для установки администраторских привилегий. Для их проверки используется метода addToolbar(), и если пользователь обладает этими привилегиями, мы отображаем ему кнопку настроек компонента.

Настройка элемента

Настройка нашего элемента может проходить через кнопку на администраторской панели. Также как и с другими компонентами, во время клика на эту кнопку нас перенаправят на компонент com_config и представят соответствующий компонент. Данные для этого представления находятся в одном конкретном файле - config.xml. Для его расположения используется корень папки компонента.

administrator/components/com_lendr/config.xml

<?xml version="1.0" encoding="utf-8"?>
<config>
  <fieldset name="component"
    label="COM_LENDR_OPTIONS"
    description="COM_LENDR_OPTIONS_DESC"
  >
    <field name="required_account" type="radio"
      default="0"
     
      label="COM_LENDR_REQUIRED_ACCOUNT"
      description="COM_LENDR_REQUIRED_ACCOUNT_DESC">
      
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="new_reviews" type="radio"
      default="1"
     
      label="COM_LENDR_ALLOW_NEW_REVIEWS"
      description="COM_LENDR_ALLOW_NEW_REVIEWS_DESC">
      
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="new_wishlists" type="radio"
      default="1"
     
      label="COM_LENDR_ALLOW_NEW_WISHLISTS"
      description="COM_LENDR_ALLOW_NEW_WISHLISTS_DESC">
      
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
    <field name="new_waitlists" type="radio"
      default="1"
     
      label="COM_LENDR_ALLOW_NEW_WAITLISTS"
      description="COM_LENDR_ALLOW_NEW_WAITLISTS_DESC">
      
      <option value="0">JNO</option>
      <option value="1">JYES</option>
    </field>
  </fieldset>
  <fieldset name="permissions"
    description="JCONFIG_PERMISSIONS_DESC"
    label="JCONFIG_PERMISSIONS_LABEL"
  >
    <field name="rules" type="rules"
      component="com_lendr"
      filter="rules"
      validate="rules"
      label="JCONFIG_PERMISSIONS_LABEL"
      section="component" />
  </fieldset>
</config>

В этом файле все определяется благодаря набору полей. Набор полей соответствует закладкам, которые видны нам во время открытия настроек элемента. Первым набором полей отображаются разнообразные параметры, которые нами должны быть установлены. Вторым набором полей отображается настройка прав доступа.

Теперь перейдем к рассмотрению кода, который добавляется на фронт-энд и обеспечивает поддержку этих параметров. Нами будет уделено внимание двум вещам. Первой является опция required_account. Она обеспечивает определение того, должен ли пользователь быть залогинен для того, чтобы иметь доступ к нашему компоненту.

components/com_lendr/controllers/default.php

// Line 11 - 19
$params = JComponentHelper::getParams('com_lendr');
if ($params->get('required_account') == 1) 
{
    $user = JFactory::getUser();
    if ($user->get('guest'))
    {
        $app->redirect('index.php',JText::_('COM_LENDR_ACCOUNT_REQUIRED_MSG'));
    }
}

Вначале нами получается объект параметров с помощью Joomla Component Helper. Как только нами получены данные параметры, мы можем перейти к проверке, нужно ли пользователю быть залогиненым.

Следует посмотреть на то, как еще нами используются параметры из настроек элемента.

components/com_lendr/views/book/tmpl/_entry.php

// Line 43 - 48
<?php if($this->params->get('new_wishlists') == 1 ): ?>
  <li><a href="javascript:void(0);" on-click="addToWishlist('<?php echo $this->book->book_id; ?>');"><?php echo JText::_('COM_LENDR_ADD_WISHLIST'); ?></a></li>
<?php endif; ?>
<?php if($this->params->get('new_reviews') == 1 ): ?>
  <li><a href="#newReviewModal" data-toggle="modal"><?php echo JText::_('COM_LENDR_WRITE_REVIEW'); ?></a></li>
<?php endif; ?>

Здесь нами используется тот же принцип, что и для контроллера. Единственным отличием является то, что нами вызывается Joomla Component Helper, что установить объект параметров в представлении html.php. Обращение к нему происходит через $this->params.

Шаг 2: Доработка кода

Нами будут рассмотрены два аспекта доработок. В первом нам следует добавить возможности по удалению объектов. Второе, нам необходимо обладать списком книг для просмотра всех книг в системе.

Удаление

Удалить объекты можно благодаря нескольким способам. В одном методе мы не будем удалять данные из базы данных, а в другом происходит их полное удаление. В распространенных случаях необходимо лишь сокрытие информации, а не удаление данных с ресурса. Самый простой и эффективный способ для этого заключается в установке значения переменной published в 0 (ноль). Некоторые другие компоненты значение 0 не ведут к удалению, поэтому вами может быть встречено значение -1.

components/com_lendr/controllers/delete.php

<?php defined( '_JEXEC' ) or die( 'Restricted access' ); 
 
class LendrControllersDelete extends JControllerBase
{
  public function execute()
  {
    $app = JFactory::getApplication();
    $return = array("success"=>false);
    
    $type = $app->input->get('type','waitlist');
 
    $modelName = 'LendrModels'.ucfirst($type);    
    $model = new $modelName();
 
    if ( $row = $model->delete() )
    {
      $return['success'] = true;
      $return['msg'] = JText::_('COM_LENDR_BOOK_DELETE_SUCCESS');
    } else {
      $return['msg'] = JText::_('COM_LENDR_BOOK_DELETE_FAILURE');
    }
 
    echo json_encode($return);
  }
}

Наш контроллер удаления обладает функцией, которая обеспечивает передачу данных для соответствующей модели для обработки. Нами она устанавливается, основываясь на типе, который передан с помощью переменной в JInput.

components/com_lendr/models/book.php

/**
  * Delete a book
  * @param int      ID of the book to delete
  * @return boolean True if successfully deleted
  */
  public function delete($id = null)
  {
    $app  = JFactory::getApplication();
    $id   = $id ? $id : $app->input->get('book_id');
    $book = JTable::getInstance('Book','Table');
    $book->load($id);
    $book->published = 0;
 
    if($book->store()) 
    {
      return true;
    } else {
      return false;
    }
  }

Код модели отличается простотой. Нам необходимо найти id книги, которая должна быть удалена. После этого следует получение экземпляра таблицы Book и загрузка соответствующей строки. Как только заканчивается загрузка строки, нами с легкостью будет изменен статус published в 0. После этого следует сохранение результата. Если строка сохраняется успешно, мы возвращаем значение true, в противном случае false.

Также, удаление книги следует сделать и в модели waitlist.

components/com_lendr/models/waitlist.php

/**
  * Delete a book from a waitlist
  * @param int      ID of the book to delete
  * @return boolean True if successfully deleted
  */
  public function delete($id = null)
  {
    $app  = JFactory::getApplication();
    $id   = $id ? $id : $app->input->get('waitlist_id');
 
    if (!$id)
    {
      if ($book_id = $app->input->get('book_id')) 
      {
        $db = JFactory::getDbo();
        $user = JFactory::getUser();
        $query = $db->getQuery(true);
        $query->delete()
            ->from('#__lendr_waitlists')
            ->where('user_id = ' . $user->id)
            ->where('book_id = ' . $book_id);
        $db->setQuery($query);
        if($db->query()) {
          return true;
        }
      } 
    } else {
      $waitlist = JTable::getInstance('Waitlist','Table');
      $waitlist->load($id);
 
      if ($waitlist->delete()) 
      {
        return true;
      }      
    }
 
    return false;
  }

Этот пример направлен на жесткое удаление строки в таблице базы данных.

Если мы обладаем конкретным waitlist ID, то можем заняться загрузкой нужного объекта и удалить его непосредственным образом. Если информации о waitlist ID нет, то нами может быть выполнена процедура поиска необходимой нам строки, благодаря использованию book ID и user ID персоны, после чего следует удаление соответствующей строки.

В Lendr нами обрабатывается удаление книг через AJAX. Это значит, что неплохо было бы удалить строку со страницы, на которой мы жмем кнопку удаления. Вот javascript, которым можно воспользоваться для обработки AJAX вызова, что приведет к последующему удалению строки.

components/com_lendr/assets/js/lendr.js

function deleteBook(book_id,type) 
{
  jQuery.ajax({
    url:'index.php?option=com_lendr&controller=delete&format=raw&tmpl=component',
    type:'POST',
    data: 'book_id='+book_id+'&type='+type,
    dataType: 'JSON',
    success:function(data)
    {
      alert(data.msg);
      if(data.success)
      {
        jQuery("tr#bookRow"+book_id).hide();
      }
    }
  });
}

Здесь нами передается book_id и type. Тип используется для удаления в контроллере (таким образом нами перенаправляется запрос к нужной модели). Далее нами отображается завершающее сообщение, которое генерирует контроллер удаления. В случае, если удаление является успешным, то переходим к удалению соответствующей строки из списка.

Представление списка книг

Список книг является еще одной задачей, которая нуждается в доработке. Она также отличается простотой и не нуждается в написании объемного кода. Вначале, нам следует заняться изменением представления books. Вот что следует сделать:

components/com_lendr/views/book/html.php

// Lines 8 - 19
$layout = $this->getLayout();
$this->params = JComponentHelper::getParams('com_lendr');
 
//retrieve task list from model
$model = new LendrModelsBook();
if($layout == 'list')
{
  $this->books = $model->listItems();
  $this->_bookListView = LendrHelpersView::load('Book','_entry','phtml');
} else {
…

Здесь нами добавляется вызов, чтобы получить переменную layout. После этого следует проверка того, какое представление нами загружается. Если мы находимся в представлении списка, то нуждаемся в отображении списка со всеми доступными элементами. Иначе нами загружается то же самое представление, что и раньше.

Переходим к добавлению шаблона списка книг:

components/com_lendr/views/book/tmpl/list.php

<table cellpadding="0" cellspacing="0" width="100%">
  <thead>
    <tr>
      <th><?php echo JText::_('COM_LENDR_DETAILS'); ?></th>
      <th><?php echo JText::_('COM_LENDR_STATUS'); ?></th>
      <th><?php echo JText::_('COM_LENDR_ACTIONS'); ?></th>
    </tr>
  </thead>
  <tbody id="book-list">
    <?php for($i=0, $n = count($this->books);$i<$n;$i++) { 
            $this->_bookListView->book = $this->books[$i];
            $this->_bookListView->type = 'book';
            echo $this->_bookListView->render();
    } ?>
  </tbody>
</table>

Следует сказать о сходстве, которое роднит данный шаблон и шаблон библиотеки. Единственное различие заключается в том, что нами загружаются все книги, а не книги, которые входят в конкретную библиотеку.

Шаг 3: Меню и чистка файлов

Процесс создания ссылок меню

Не редко мы сталкиваемся с необходимостью, которая заключается в добавлении ссылки меню, которая будет отображаться на нашем ресурсе. В таком случае нам необходимо заняться добавлением нового пункта меню, где будет выбран тип меню и ссылка для добавления. Мы нуждаемся в определении представления, которые которое следует отображать в модальном окне добавления пункта меню. Мы займемся созданием двух вариантов:

  • ссылка на список профилей
  • ссылка на список всех книг

Ссылка меню основывается на оперировании соответствующими XML-файлами метаданных, которые размещаются в папках представлений. Ниже мы приводим пример подобного файла для списка профилей.

joomla_root/components/com_lendr/views/profile/tmpl/list.xml

<?xml version="1.0" encoding="utf-8"?>
<metadata>
  <layout title="COM_LENDR_PROFILE_LIST">
    <message><![CDATA[COM_LENDR_PROFILE_LIST_DESC]]></message>
  </layout>
</metadata>

Каким образом разрабатываются расширения для Joomla! 3.0 – интерфейс администратора и доработка кода (Статья 5)

Необходимо отметить, что во время создания ссылки на файл шаблона, нами определяется объект <layout>, а мы занимается созданием ссылки на представление, то создаём объект <view>. Языковым файлам необходимо быть сохраненными в системном языковом файле администраторской части.

administrator/languages/en-GB/en-GB.com_lendr.sys.ini

COM_LENDR = "Lendr"
COM_LENDR_SETTINGS = "Lendr Settings"
COM_LENDR_PROFILE_LIST = "Profile List"
COM_LENDR_PROFILE_LIST_DESC = "Display list of all profiles"
COM_LENDR_BOOK_LIST = "Book List"
COM_LENDR_BOOK_LIST_DESC = "Display list of all books"

Этими строками мы воспользуется в том случае, когда нам необходимо обращаться к ним извне компонента Lendr. Это говорит о том, что эти строки всегда должны загружаться в саму Joomla и не только тогда, когда мы находимся внутри index.php?option=com_lendr. Одно из таких мест заключается в модальном окне создания ссылки меню.

Добавляя XML-файлы метаданных в нужную нам папку, мы сможем увидеть этот шаблон в разделе меню. В этом файле могут содержаться разные настройки для добавления дополнительных параметров (к примеру, возможности по созданию конкретной книги или профиля).

Удаление ненужных файлов и функций

Нами проделываются неплохая работа, без добавления ненужных функций или файлов, так что нам почти не нужно заниматься удалением. Некоторые контроллеры на фронт-энде для удаления, которые не были реализованы в этой серии статей. Также могут подчистить некоторые представления и шаблоны. Но основная идея в этом шагу, это напоминание о том, что всегда следует релизить чистый код.

Важным для соблюдения безопасности, размер дистрибутива и вообще для стандартов по чистке удостовериться в том, что нет лишних файлов, папок или функций, которые могут быть проблемой в будущих моментах. Следует помнить, что хорошая привычка заключается в разработке для кого-то другого. Оно заключается в корректном документировании кода и удаления всего того, что является ненужным.

Шаг 4: о дополнительных возможностях

Тэги

Тэги были добавлены в Joomla 3.1. При помощи них вы можете назначать тэги для книг и заниматься их группировкой по тэгам.

Категории

Категории обеспечивают для вас возможности добавления книг для конкретных категорий. Это является удобным для группировки книг.

Web сервисы / JSON

Пользуясь базовой моделью веб-сервисов нам доступна демонстрация методов для того, чтобы получить данные непосредственно из Lendr компонента. При этом не будут использоваться стандартные представления и шаблоны. Получайте данные в формате JSON, чтобы пользоваться ними в других системах.

Все статьи цикла:

  1. Каким образом разрабатываются расширения для Joomla! 3.0 – подготовка (Статья 1)
  2. Каким образом разрабатываются расширения для Joomla! 3.0 – начинаем разработку (Статья 2)
  3. Каким образом разрабатываются расширения для Joomla! 3.0 – создаем ядро (Статья 3)
  4. Каким образом разрабатываются расширения для Joomla! 3.0 – больше функционала (Статья 4)
  5. Текущая статья
Портфолио
Память о Вас и Ваших близких на многие поколения
Подробнее
Прокат металла
Подробнее
Интернет-магазин кожи и меха
Подробнее
100% оригинальная парфюмерия в Москве
Подробнее
Вьетнамский ресторан премиум класса
Подробнее
Внедрение информационных систем
Подробнее
Организация международных конференций
Подробнее
Производство молочной продукции
Подробнее
Спортивный сайт
Подробнее
Интернет-магазин мебели и аксессуаров
Подробнее
Интернет-магазин электротранспорта
Подробнее
Сайт института актуальной экономики
Подробнее
Наши клиенты
Парк развлечений Boom Zoom
Алгор
Норбит
Molga Consulting
Metrotile
Нетология
Monqi
Премиум Пак
Aasha Herbals
Аджва
Салон красоты Сударушка
Пава
ТЦ &quot;Панфиловский&quot;
Фитнес Лаборатория
Система Главбух
Vanguard
GoAsia
ТЦ «Солнечный ветер»
Teledoc
Tchernov Cable
Отзывы
Благодарю компанию web-now.pro за помощь в разработке и запуске проекта POLITSECRETS.RU. Перед нами стояла задача – внедрить проект в сжатые сроки и по оптимальной цене. Порадовало то, что мне подроб...
Вера БлашенковаСекреты успешных выборов, Москва... апр.2016
Мне очень понравился подход с которым нас встретили "Ваша задача заниматься бизнесом, наша - сделать Вам представительство в сети". После этого ребята разработали полное тз на проект, мы внесли пожела...
МаксимIT-TASK, Москва... янв.2016
Работа проделана хорошо! Дизайнер и менеджер на отлично. Надеюсь на сотрудничество в дальнейшем. Есть шероховатости в деталях по задачам, но приятно сказывается оперативность и желание исправить, внес...
БруноСоциальная сеть След Жизни, Москва... янв.2016
Работой остались очень довольны. К работе подходят ответственно, аккуратно, открыто. Проект был сдан чуть раньше срока, по ходу работы возникали изменения, все они принимались безоговорочно, работа вы...
ЕвгенийМагазин текстиля, Москва... дек.2015
Сотрудничаем с 2007 года и сделали не один проект. Самое главное - команда умеет отстаивать своё мнение и постоянно развивается.
МарияМеждународные конференции, Москва... дек.2015
Спасибо всему коллективу компании! Разработали красивый и что самое главной рабочий интернет магазин! Реклама настроена и запущена, продажи идут, бизнес развивается! Нам постоянно подсказывают о новых...
ВадимИнтернет магазин Aromatic.pro, Москва... сен.2015
Большое спасибо команде за оперативность, качественные работы, отличный креатив и привлекательные цены!
Виктория, ОАО "Фармстандарт... июль.2015
Здравствуйте уважаемые партнеры! С наступающим Новым Годом! Желаю Вам дальнейшего процветания и успехов в Вашей благородной работе! С вами приятно сотрудничать! Очень благодарен Вам за своевременное о...
Сергей ЮрченкоКинотруд, Москва... дек.2014
Благодарим команду Brand Now и лично Дениса Логинова за оригинальное видение,разнообразие идей, четкость взаимодействия и безукоризненное соблюдение сроков выполнения проекта! Планируем продолжить сот...
ТатьянаBizness Linkerz... июль.2014
Компания КУН выражает благодарность за сотрудничество: непростая задача была выполнена в требуемые сроки и полностью удовлетворила заявленному ТЗ. Приятно удивила готовность Генерального директора нач...
Мария, Компания КУНhttp://www.kuhn.com/... апр.2014
Все отзывы
Добавить отзыв