Вывод одной записи через модель и вид с шаблоном в Joomla 1.7

Май 27, 2012

Вывод списка значений, полученных из базы данных можно сделать посредством модели и класса JModelList, что было описано в следующей записи:

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

Класс модели компонента открытой части сайта является дочерним от JModel, а по сути даже не использует его.

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

jimport('joomla.application.component.model');

class SimpleModelUser extends JModel
{
	public function getItem()
	{
		$user_id = JRequest::getInt('id');

		$row = JTable::getInstance('user', 'SimpleTable');
		$row->load($user_id);

		return $row;
	}
}

Как видно, сначала получается значение idint) посредством класса JRequest.

Объект на класс JTable, а точнее класс SimpleTableUser, получается из закрытой части сайта:
/administrator/components/com_simple/tables/user.php

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

class SimpleTableUser extends JTable
{
	public function __construct(&$db)
	{
		parent::__construct('#__users', 'id', $db);
	}
}

Класс SimpleTableUser всего лишь вызывает конструктор родительского класса JTable, чтобы обозначить использование таблицы users и идентификатора id.

Файл с классом SimpleTableUser специально хранится в закрытой части сайта ради безопасности.

В переменную $row записывается созданный объект класса JTable.

Далее выполняется загрузка информации из базы данных с помощью метода load класса JTable. Часть кода метода load:

$query	= $this->_db->getQuery(true);
$query->select('*');
$query->from($this->_tbl);
$fields = array_keys($this->getProperties());

foreach ($keys as $field => $value)
{
	// Check that $field is in the table.
	if (!in_array($field, $fields)) {
		$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CLASS_IS_MISSING_FIELD', get_class($this), $field));
		$this->setError($e);
		return false;
	}
	// Add the search tuple to the query.
	$query->where($this->_db->quoteName($field).' = '.$this->_db->quote($value));
}

$this->_db->setQuery($query);
$row = $this->_db->loadAssoc();

С помощью метода loadAssoc в объект $row записываются переменные с именами, равными именам в указанной таблице базы данных. Полученная запись в методе load в виде ассоциативного массива записывается в объект $row и после этого возвращается:

return $this->bind($row);

Метод bind находится в классе JTable.

/**
 * Method to bind an associative array or object to the JTable instance.This
 * method only binds properties that are publicly accessible and optionally
 * takes an array of properties to ignore when binding.
 *
 * @param   mixed    $src     An associative array or object to bind to the JTable instance.
 * @param   mixed    $ignore  An optional array or space separated list of properties
 *                            to ignore while binding.
 *
 * @return  boolean  True on success.
 *
 * @link    http://docs.joomla.org/JTable/bind
 * @since   11.1
 */
public function bind($src, $ignore = array())
{
	// If the source value is not an array or object return false.
	if (!is_object($src) && !is_array($src)) {
		$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_BIND_FAILED_INVALID_SOURCE_ARGUMENT', get_class($this)));
		$this->setError($e);
		return false;
	}

	// If the source value is an object, get its accessible properties.
	if (is_object($src)) {
		$src = get_object_vars($src);
	}

	// If the ignore value is a string, explode it over spaces.
	if (!is_array($ignore)) {
		$ignore = explode(' ', $ignore);
	}

	// Bind the source value, excluding the ignored fields.
	foreach ($this->getProperties() as $k => $v)
	{
		// Only process fields not in the ignore array.
		if (!in_array($k, $ignore)) {
			if (isset($src[$k])) {
				$this->$k = $src[$k];
			}
		}
	}

	return true;
}

Из вида view.html.php, расположенного в открытой части сайта:
/components/com_simple/views/user

Получается строка из базы данных по id, записывается в переменную $item и затем используется в виде default.php вида user:

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

jimport( 'joomla.application.component.view');

class SimpleViewUser extends JView
{
	protected $item;

	public function display($tpl = null)
	{
		$this->item = $this->get('Item');

		parent::display($tpl);
	}
}

Вид /user/view.html.php взаимодействует с моделью SimpleModelUser и затем выводит содержимое шаблона default.php:

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

<h1><?php echo $this->escape($this->item->name); ?></h1>
<p>E-Mail: <?php echo $this->item->email; ?></p>

Tags: , , , , , , ,

Запись опубликована Воскресенье, Май 27, 2012 в 16:23 и находится в Joomla, Программирование . Вы можете следить за ответами к этой записи через RSS 2.0 ленту. Вы можете оставить комментарий, или обратиться к записи со своего сайта.

Оставить Комментарий

*