Follow me on...

  • FeedBurner: Joomla15Joomla15
  • Twitter: alexkurgan

Использование базы данных

E-mail Печать

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

Создайте два файла admin/sql/install.mysql.utf8.sql и admin/sql/updates/mysql/0.0.6.sql содержащих следующий код:

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

Файл admin/sql/install.mysql.utf8.sql будет выполнен во время установки. Для этого нужно в файл helloworld.xml добавить следующие строки:


<install> <!-- Runs on install -->
	<sql>
		<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
	</sql>
</install>

Теперь создайте файл admin/sql/uninstall.mysql.utf8.sql со следующим кодом:

DROP TABLE IF EXISTS `#__helloworld`;

Этот файл будет выполнен во время удаления компонента. Для этого нужно в файл helloworld.xml добавить следующие строки:


<uninstall> <!-- Runs on uninstall -->
	<sql>
		<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
	</sql>
</uninstall>

В итоге файл helloworld.xml должен содержать следующий код:

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
 
	<name>com_helloworld</name>
	<!-- The following elements are optional and free of formatting constraints -->
	<creationDate>Март 2012</creationDate>
	<author>Имя автора</author>
	<authorEmail>автор@домен.рф</authorEmail>
	<authorUrl>http://домен.рф</authorUrl>
	<copyright>Copyright Info</copyright>
	<license>Лицензия</license>
	<!--  The version string is recorded in the components table -->
	<version>0.0.6</version>
	<!-- The description is optional and defaults to the name -->
	<description>Это простой компонент приветствия ...</description>
 
	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>
	<update> <!-- Runs on update; New in 2.5 -->
		<schemas>
			<schemapath type="mysql">sql/updates/mysql</schemapath>
		</schemas>
	</update>
 
	<!-- Site Main File Copy Section -->
	<!-- Note the folder attribute: This attribute describes the folder
		to copy FROM in the package to install therefore files copied
		in this section are copied from /site/ in the package -->
	<files folder="site">
		<filename>index.html</filename>
		<filename>helloworld.php</filename>
		<filename>controller.php</filename>
		<folder>views</folder>
		<folder>models</folder>
	</files>
 
	<administration>
		<!-- Administration Menu Section -->
		<menu>Привет МИР!</menu>
		<!-- Administration Main File Copy Section -->
		<!-- Note the folder attribute: This attribute describes the folder
			to copy FROM in the package to install therefore files copied
			in this section are copied from /admin/ in the package -->
		<files folder="admin">
			<!-- Admin Main File Copy Section -->
			<filename>index.html</filename>
			<filename>helloworld.php</filename>
			<!-- SQL files section -->
			<folder>sql</folder>
			<!-- tables files section -->
			<folder>tables</folder>
			<!-- models files section -->
			<folder>models</folder>
		</files>
	</administration>
 
</extension>

Добавление нового типа поля

Для использования базы данных в качестве источника строк в параметрах меню откройте файл
site/views/helloworld/tmpl/default.xml и замените в нем код на следующий:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
		<message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message>
	</layout>
	<fields
		name="request"
		addfieldpath="/administrator/components/com_helloworld/models/fields"
	>
		<fieldset name="request">
			<field
				name="id"
				type="helloworld"
				label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
				description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
			/>
		</fieldset>
	</fields>
</metadata>

Этот код добавляет новый тип поля и указывает путь где находится его определение, в нашем случае это в папке administrator/components/com_helloworld/models/fields

Создайте файл 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('id,greeting');
		$query->from('#__helloworld');
		$db->setQuery((string)$query);
		$messages = $db->loadObjectList();
		$options = array();
		if ($messages)
		{
			foreach($messages as $message) 
			{
				$options[] = JHtml::_('select.option', $message->id, $message->greeting);
			}
		}
		$options = array_merge(parent::getOptions(), $options);
		return $options;
	}
}

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

006

Для вывода нужного сообщения в зависимости от выбранных параметров в меню откройте файл
site/models/helloworld.php и замените в нем код на следующий:

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla modelitem library
jimport('joomla.application.component.modelitem');
 
/**
 * HelloWorld Model
 */
class HelloWorldModelHelloWorld extends JModelItem
{
	/**
	 * @var string msg
	 */
	protected $msg;
 
	/**
	 * Returns a reference to the a Table object, always creating it.
	 *
	 * @param	type	The table type to instantiate
	 * @param	string	A prefix for the table class name. Optional.
	 * @param	array	Configuration array for model. Optional.
	 * @return	JTable	A database object
	 * @since	2.5
	 */
	public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array()) 
	{
		return JTable::getInstance($type, $prefix, $config);
	}
	/**
	 * Get the message
	 * @return string The message to be displayed to the user
	 */
	public function getMsg() 
	{
		if (!isset($this->msg)) 
		{
			$id = JRequest::getInt('id', 1);
			// Get a TableHelloWorld instance
			$table = $this->getTable();
 
			// Load the message
			$table->load($id);
 
			// Assign the message
			$this->msg = $table->greeting;
		}
		return $this->msg;
	}
}

Теперь модель получает сообщение у TableHelloWorld . Этот класс таблицы должен быть описан в файле admin/tables/helloworld.php .

Создайте файл admin/tables/helloworld.php со следующим кодом:

<?php
// No direct access
defined('_JEXEC') or die('Restricted access');
 
// import Joomla table library
jimport('joomla.database.table');
 
/**
 * Hello Table class
 */
class HelloWorldTableHelloWorld extends JTable
{
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__helloworld', 'id', $db);
	}
}

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

<!-- tables files section -->
<folder>tables</folder>
<!-- models files section -->
<folder>models</folder>

и конечно же измените версию компонента на 0.0.6

Создайте архив с компонентом, установите на сайт. После установки новой версии компонента изменений вы не увидите, но компонент уже будет работать с БД и данные будут браться из нее.

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

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

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