Follow me on...

  • FeedBurner: Joomla15Joomla15
  • Twitter: alexkurgan

Поддержка категорий

E-mail Печать

В Joomla! 2.5 поддержку категорий добавить очень просто, для этого уже существует компонент com_categories.

Обновление SQL файлов

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

Откройте файл admin/sql/install.mysql.utf8.sql и замените в нем код на следующий:

DROP TABLE IF EXISTS `#__helloworld`;
 
CREATE TABLE `#__helloworld` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `greeting` varchar(25) NOT NULL,
  `catid` int(11) NOT NULL DEFAULT '0',
   PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 
INSERT INTO `#__helloworld` (`greeting`) VALUES
	('Привет МИР! :) я из БД'),
	('Прощай МИР! :( я из БД');

Создайте файл admin/sql/updates/mysql/0.0.12.sql с кодом:

ALTER TABLE `#__helloworld` ADD `catid` int(11) NOT NULL DEFAULT '0'

Теперь сообщение может принадлежать какой либо категории. Далее мы должны изменить форму редактирования.

Откройте фале admin/models/forms/helloworld.xml и замените в нем код на следующий:

<?xml version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_helloworld/models/rules"
>
	<fieldset>
		<field
			name="id"
			type="hidden"
		/>
		<field
			name="greeting"
			type="text"
			label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
			description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
			size="40"
			class="inputbox validate-greeting"
			validate="greeting"
			required="true"
			default=""
		/>
		<field
			name="catid"
			type="category"
			extension="com_helloworld"
			class="inputbox"
			default=""
			label="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL"
			description="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC"
			required="true"
		>
			<option value="0">JOPTION_SELECT_CATEGORY</option>
		</field>
	</fieldset>
</form>

Так же, если сообщение может принадлежать какой либо категории, то мы должны добавить название этой категории к сообщению в выпадающем списке при создании пункта меню.

Откройте файл admin/models/fields/helloworld.php и замените в нем код на следующий:

<?php
// No direct access to this file
defined('_JEXEC') or die;
 
// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
 
/**
 * HelloWorld Form Field class for the HelloWorld component
 */
class JFormFieldHelloWorld extends JFormFieldList
{
	/**
	 * The field type.
	 *
	 * @var		string
	 */
	protected $type = 'HelloWorld';
 
	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array		An array of JHtml options.
	 */
	protected function getOptions() 
	{
		$db = JFactory::getDBO();
 
		$query = $db->getQuery(true);
 
		$query->select('#__helloworld.id as id,greeting,#__categories.title as category,catid');
		$query->from('#__helloworld');
		$query->leftJoin('#__categories on catid=#__categories.id');
		$db->setQuery((string)$query);
		$messages = $db->loadObjectList();
		$options = array();
		if ($messages)
		{
			foreach($messages as $message) 
			{
				$options[] = JHtml::_('select.option', $message->id, $message->greeting .
				                      ($message->catid ? ' (' . $message->category . ')' : ''));
			}
		}
		$options = array_merge(parent::getOptions(), $options);
		return $options;
	}
}

Теперь название категории будет находиться в скобках после сообщения.

Создание дочернего меню

Компонент com_categories позволяет добавить подменю на страницу нашего компонента.

Откройте и создайте файл admin/helpers/helloworld.php содержащий код:

<?php
// No direct access to this file
defined('_JEXEC') or die;
 
/**
 * HelloWorld component helper.
 */
abstract class HelloWorldHelper
{
	/**
	 * Configure the Linkbar.
	 */
	public static function addSubmenu($submenu) 
	{
		JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
		                         'index.php?option=com_helloworld', $submenu == 'messages');
		JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
		                         'index.php?option=com_categories&view=categories&extension=com_helloworld',
		                         $submenu == 'categories');
		// set some global property
		$document = JFactory::getDocument();
		$document->addStyleDeclaration('.icon-48-helloworld ' .
		                               '{background-image: url('/../media/com_helloworld/images/hello_icon48.png');}');
		if ($submenu == 'categories') 
		{
			$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION_CATEGORIES'));
		}
	}
}

Этот код выполняет следующее:

  • меняет подменю
  • меняет css стили
  • меняет заголовок браузера если выбраны категории
  • меняет заголовок компонента и показывает (скрывает) кнопки

Теперь для вызова этой функции нам нужно изменить файлы admin/controller.php и admin/helloworld.php, откройте их и замените в них код на следующий:

admin/controller.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla controller library
jimport('joomla.application.component.controller');
 
/**
 * General Controller of HelloWorld component
 */
class HelloWorldController extends JController
{
	/**
	 * display task
	 *
	 * @return void
	 */
	function display($cachable = false) 
	{
		// set default view if not set
		JRequest::setVar('view', JRequest::getCmd('view', 'HelloWorlds'));
 
		// call parent behavior
		parent::display($cachable);
 
		// Set the submenu
		HelloWorldHelper::addSubmenu('messages');
	}
}

admin/helloworld.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// require helper file
JLoader::register('HelloWorldHelper', dirname(__FILE__) . DS . 'helpers' . DS . 'helloworld.php');
 
// import joomla controller library
jimport('joomla.application.component.controller');
 
// Get an instance of the controller prefixed by HelloWorld
$controller = JController::getInstance('HelloWorld');
 
// Perform the Request task
$controller->execute(JRequest::getCmd('task'));
 
// Redirect if set by the controller
$controller->redirect();

Так же внесем изменения в языковые файлы:

admin/language/en-GB/en-GB.com_helloworld.ini

COM_HELLOWORLD="Hello World!"
COM_HELLOWORLD_ADMINISTRATION="HelloWorld - Administration"
COM_HELLOWORLD_ADMINISTRATION_CATEGORIES="HelloWorld - Categories"
COM_HELLOWORLD_HELLOWORLD_CREATING="HelloWorld - Creating"
COM_HELLOWORLD_HELLOWORLD_DETAILS="Details"
COM_HELLOWORLD_HELLOWORLD_EDITING="HelloWorld - Editing"
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Some values are unacceptable"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC="The category the messages belongs to"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL="Category"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC="This message will be displayed"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL="Message"
COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING="Greeting"
COM_HELLOWORLD_HELLOWORLD_HEADING_ID="Id"
COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT="HelloWorld manager: Edit Message"
COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW="HelloWorld manager: New Message"
COM_HELLOWORLD_MANAGER_HELLOWORLDS="HelloWorld manager"
COM_HELLOWORLD_N_ITEMS_DELETED_1="One message deleted"
COM_HELLOWORLD_N_ITEMS_DELETED_MORE="%d messages deleted"
COM_HELLOWORLD_SUBMENU_MESSAGES="Messages"
COM_HELLOWORLD_SUBMENU_CATEGORIES="Categories"

admin/language/ru-RU/ru-RU.com_helloworld.ini

COM_HELLOWORLD="Привет МИР!"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC="Сообщение для отображения"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL="Сообщение"
COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING="Приветствие"
COM_HELLOWORLD_HELLOWORLD_HEADING_ID="Id"
COM_HELLOWORLD_ADMINISTRATION="Привет МИР! - Администрирование"
COM_HELLOWORLD_ADMINISTRATION_CATEGORIES="Привет МИР! - Категории"
COM_HELLOWORLD_HELLOWORLD_CREATING="Привет МИР! - Приветствие"
COM_HELLOWORLD_HELLOWORLD_DETAILS="Подробно"
COM_HELLOWORLD_HELLOWORLD_EDITING="Привет МИР! - Изменить"
COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT="Привет Мир!: Изменить сообщение"
COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW="Привет Мир!: Добавить сообщение"
COM_HELLOWORLD_MANAGER_HELLOWORLDS="Привет МИР! управление"
COM_HELLOWORLD_N_ITEMS_DELETED_1="Одно сообщение удалено"
COM_HELLOWORLD_N_ITEMS_DELETED_MORE="%d сообщений удалено"
COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL="Сообщение"
COM_HELLOWORLD_HELLOWORLD_GREETING_DESC="Введите сообщение для отображения"
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Некоторые значения недопустимы"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC="Сообщение в категории"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL="Категория"
COM_HELLOWORLD_SUBMENU_MESSAGES="Сообщения"
COM_HELLOWORLD_SUBMENU_CATEGORIES="Категории"

Ну и наконец в файл helloworld.xml в секцию <files folder="admin"> добавим строки:

<!-- helpers files section -->
<folder>helpers</folder>

и изменим версию на 0.0.12


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

Создайте файл admin/access.xml, со следующим кодом:

<?xml version="1.0" encoding="utf-8" ?>
<access component="com_helloworld">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
	</section>
</access>

Об этом файле будет написано подробнее в следующих статьях.

В файл helloworld.xml в секцию <files folder="admin"> добавим строки:

<filename>access.xml</filename>

Создайте архив с компонентом, установите его на сайт.

Скачать архив для этой части курса

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

Mark
 
Интересная статья? Поделись ей с другими: