Joomla frontend

’tag’

Определение нахождения на Главной странице в Joomla 2.5

Июнь 5, 2012

Задача тривиальная. Решение беру из официальной документации по Joomla:

Думаю, что лучший способ, который подойдет для любого сайта следующий:

<?php
$app = JFactory::getApplication();
$menu = $app->getMenu();
$lang = JFactory::getLanguage();
if ( $menu->getActive() == $menu->getDefault( $lang->getTag() ) ) {
	echo 'Главная страница';
}
else {
	echo 'Второстепенная';
}
?>

Решение работает, начиная с версии 1.6.

Tags: , , ,
Записано в Joomla, Программирование    |    Постоянная ссылка

Переопределение шаблона компонента в Joomla 1.7

Май 29, 2012

Ранее я уже писал про переопределение шаблона модуля в используемой теме Joomla.

Шаблоны отображения определенного вида для компонента com_simple открытой части сайта, к примеру, user, хранятся в следующей папке:
/components/com_simple/views/user/tmpl

Как и для модуля, сначала в папке с выбранной темой, к примеру, beez_20 создаются последовательно папки html и com_simple:
/templates/beez_20/html/com_simple

Единственная особенность переопределения шаблона компонента от модуля является необходимость создать подпапку равную имени вида:
/templates/beez_20/html/com_simple/user

Далее из папки шаблона компонента в эту папку переносится нужный вид:
/templates/beez_20/html/com_simple/user/default.php

Теперь остается поменять сам файл default.php.

Tags: , , , , , ,
Записано в Joomla, Программирование    |    Постоянная ссылка

Вывод одной записи через модель и вид с шаблоном в 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: , , , , , , ,
Записано в Joomla, Программирование    |    Постоянная ссылка

Добавление модели и вида с шаблоном к компоненту в Joomla 1.7

Май 27, 2012

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

В папке models должен быть файл с именем равным виду. Например:
http://localhost/index.php?option=com_simple&view=users

В данном случае в папке models должен быть файл users.php.

В то же время необходимо создать папку views с подпапкой users, которая должна содержать файл view.html.php и папку tmpl с файлом default.php.

Файл users.php должен содержать класс модели, имя которого начинается с названия компонента и заканчивается на название модели:
SimpleModelUsers

Судя по содержимому следующей папки:
/libraries/joomla/application/component

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

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

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

Импортируем класс и определяем наследование класса:

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

class SimpleModelUsers extends JModelList

Теперь через родителя вызываем функцию getListQuery, которая всего лишь создаст почву для нового запроса:

public function getListQuery()
{
	$query = parent::getListQuery();

Теперь добавляем запрос и возвращаем его:

public function getListQuery()
{
	$query = parent::getListQuery();

	$query->select('name');
	$query->from('#__users')
		->where('id > 42');
	return $query;
}

Значения из базы данных могут быть получены посредством вызова функции getItems класса JModelList. Вызов производится из вида, а именно файла view.html.php:

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

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

class SimpleViewUsers extends JView
{
	protected $items;

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

		parent::display($tpl);
	}
}

Видно, что изначально импортируется файл с классом JView:

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

Файл находится здесь:
/libraries/joomla/application/component/view.php

Класс вида только один – JView.

Метод display класса JView всего лишь загружает файл шаблона из папки tmpl:

function display($tpl = null)
{
	$result = $this->loadTemplate($tpl);
	if (JError::isError($result)) {
		return $result;
	}
		echo $result;
}

В классе компонента сначала в переменную $items записываются данные из базы данных, полученные через запрос, созданный в модели компонента и выполненный посредством функции getItems класса JModelList.

Функция getItems вызывается через $this->get('Items'). Метод get класса вида JView сначала ищет метод, образованный через слияние "get" и передаваемого названия. В нашем случае "get + Items". Если метод не найден, то метод get класса вида JView обращается к своему родительскому классу JObject.

Полученные данные записываются в переменную $items класса вида компонента:

protected $items;

В завершение вызывается родительский метод display:

parent::display($tpl);

Теперь в файле default.php в папке с шаблонами tmpl можно вывести данные из переменной $items:

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

<?php foreach ($this->items as $item) : ?>
	<?php echo $this->escape($item->name); ?><br />
<?php endforeach; ?>

После запуска в стоке браузера следующего url:
http://localhost/joomla17/index.php?option=com_simple&view=users

На экране будет виден список пользователей.

Заключение

Вид view.html.php:

  • обращается к модели;
  • загружает шаблон.

Tags: , , , , , , , , , , ,
Записано в Joomla, Программирование    |    Постоянная ссылка