Разрботка расширений для CMS Joomla
Шрифт:
array loadRowList(int key)
Метод загружает список массивов или ассоциативный массив массивов. Если задан параметр key, то ключами возвращаемого массива будут значения поля, идущего в таблице под номером key, начиная с нуля.
$db =& JFactory::getDbo; $query = 'SELECT * FROM '.$db->nameQuote('#__categories'); $db->setQuery($query); print_r($db->loadRowList(7));
В данном примере из таблицы #__categories ядра Joomla извлекаются все записи, причем ключами полученного массива
Array ( [system]=>Array([0]=>1 … [25]=>*) [com_content]=>Array([0]=>2 … [25]=>*) [com_banners]=>Array([0]=>3 … [25]=>*) [com_contact]=>Array([0]=>4 … [25]=>*) [com_newsfeeds]=>Array([0]=>5 … [25]=>*) [com_weblinks]=>Array([0]=>6 … [25]=>*) )
Если не указать параметр key, то вместо ассоциативного массива мы получим список:
Array ( [0]=>Array([0]=>1 … [25]=>*) [1]=>Array([0]=>2 … [25]=>*) [2]=>Array([0]=>3 … [25]=>*) [3]=>Array([0]=>4 … [25]=>*) [4]=>Array([0]=>5 … [25]=>*) [5]=>Array([0]=>6 … [25]=>*) )
array loadAssocList(string key='', string column='')
Метод загружает список ассоциативных массивов или ассоциативный массив ассоциативных массивов. Если задан параметр key, то ключами полученного массива будут значения столбца под названием key. Если задан параметр column, то в полученном массиве будет всего один столбец column.
$db =& JFactory::getDbo; $query = 'SELECT * FROM '.$db->nameQuote('#__categories'); $db->setQuery($query); print_r($db->loadAssocList('extension'));
Результат запроса:
Array ( [system]=>Array([id]=>1 [asset_id]=>0 ... [language]=>*) [com_content]=>Array([id]=>2 [asset_id]=>27 ... [language]=>*) [com_banners]=>Array([id]=>3 [asset_id]=>28 ... [language]=>*) [com_contact]=>Array([id]=>4 [asset_id]=>29 ... [language]=>*) [com_newsfeeds]=>Array([id]=>5 [asset_id]=>30 ... [language]=>*) [com_weblinks]=>Array([id]=>6 [asset_id]=>31 ... [language]=>*) )
Как видим, ключи полученного массива - это значения поля extension, заданного параметром в метод loadAssocList.
Зададим значение второго параметра, чтобы получить только значение id для каждой строки таблицы:
$db =& JFactory::getDbo; $query = 'SELECT * FROM '.$db->nameQuote('#__categories'); $db->setQuery($query); print_r($db->loadAssocList('extension','id'));
Результат запроса:
Array([system]=>1 [com_content]=>2 [com_banners]=>3 [com_contact]=>4 [com_newsfeeds]=>5 [com_weblinks]=>6)
array loadObjectList(string key='')
Метод загружает список объектов stdClass или ассоциативный массив объектов stdClass. Если задан параметр key, то ключами полученного массива будут значения поля под названием key:
$db =& JFactory::getDbo; $query = 'SELECT * FROM '.$db->nameQuote('#__categories'); $db->setQuery($query); print_r($db->loadObjectList('extension'));
Результат
Array ( [system]=>stdClass Object([id]=>1 [asset_id]=>0 ... [language]=>*) [com_content]=>stdClass Object([id]=>2 [asset_id]=>27 ... [language]=>*) [com_banners]=>stdClass Object([id]=>3 [asset_id]=>28 ... [language]=>*) [com_contact]=>stdClass Object([id]=>4 [asset_id]=>29 ... [language]=>*) [com_newsfeeds]=>stdClass Object([id]=>5 [asset_id]=>30 ... [language]=>*) [com_weblinks]=>stdClass Object([id]=>6 [asset_id]=>31 .. [language]=>*) )
Таблицы базы данных (класс JTable)
Класс JTable реализует паттерн Active Record и используется для управления таблицами базы данных.
Для каждой таблицы, которую вы будете создавать для своего компонента, необходимо создать класс, производный от JTable. Каждый такой класс помещается в отдельном файле в папке /administrator/components/com_<имя компонента>/tables. Имя класса строится по схеме Table<название таблицы>, а файла - <название таблицы>.php.
Для каждого поля таблицы необходимо создать одноименное поле класса.
Кроме того, создается конструктор класса, принимающий ссылку на объект JDatabase. Конструктор вызывает родительский конструктор, передавая ему название таблицы, название поля, являющегося первичным ключом таблицы, и объект JDatabase.
Например, пусть имеется таблица #__mycomponent_mytable из двух столбцов: id и name. Тогда производный от JTable класс должен выглядеть так:
class TableMytable extends JTable { var $id = null; var $name = null; function __construct(&$db) { parent::__construct('#__mycomponent_mytable', 'id', $db); } }
Чтобы использовать в коде вашего компонента файл, содержащий этот класс, нужно добавить папку tables в список директорий, в которых JTable может искать классы таблиц:
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_mycomponent'.DS.'tables');
Теперь при создании экземпляра класса TableMytable Joomla будет искать файл mytable.php.
Для получения экземпляра данного класса используется метод getInstance:
object getInstance(string $type, string $prefix= 'JTable', array $config=array)
где
$type - вторая часть имени класса; $prefix - первая часть имени класса; $config - массив, содержащий настройки конфигурации.
В их числе может находиться объект-представитель базы данных, и тогда он будет использован вместо глобального объекта JDatabase. Например:
$row =& JTable::getInstance('mytable', 'Table');
Производный от JTable класс наследует в числе прочих методы bind, store, load и delete, позволяющие управлять записями таблицы без единой строки SQL-кода.