$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-кода.
Создание/редактирование записи таблицы
Как правило, для создания или редактирования записи таблицы во фронтенде или бэкенде создается HTML-форма. Значения, введенные в нее пользователем, можно получить с помощью класса JRequest в виде массива. Полученный массив необходимо связать с объектом JTable. Связываниезаключается в том, что каждому полю класса присваивается значение элемента массива, ключ которого совпадает с названием этого поля. Для этого используется метод
bool bind(mixed $src, mixed $ignore=array())
где:
$src - ассоциативный массив или объект для связывания с экземпляром класса; $ignore - массив или разделенный пробелами список полей, которые нужно игнорировать при связывании.
Например:
if (!$row->bind(JRequest::get('post'))) return JError::raiseWarning(500, $row->getError());
Обычно ошибка связывания возникает, если поля класса не соответствуют ключам массива, - например, когда в HTML-форме в название элемента input вкралась опечатка.
Для сохранения записи используется метод bool store(bool $updateNulls=false)
Если параметр $updateNulls равен false, то те поля объекта JTable, которые имеют значение null, будут игнорироваться при связывании.
Пример использования метода store():
if (!$row->store()) JError::raiseError(500, $row->getError());
Метод store() на основе хранящихся в $row значений генерирует запрос UPDATE или INSERT, в зависимости от значения id. Если запись создается впервые, то она не имеет значения id и будет сконструирован запрос INSERT, в противном случае - UPDATE. Это позволяет использовать данный метод как для создания новых записей, так и для обновления существующих.
Получение записи из таблицы
Для получения записи используется метод
bool load(mixed $keys = NULL, bool $reset = true)
где
$keys - первичный ключ записи, которую необходимо получить, или массив полей для поиска соответствий; $reset - задает, будут ли перед получением новой записи заново присвоены полям значения по умолчанию.
Например:
$row->load($id);
Удаление записи
Для удаления записи используется метод
bool delete(mixed $id=null)
где $id - первичный ключ записи, которую требуется удалить. Если он не задан, то используется значение соответствующего поля объекта.
Пример:
$row->delete($id);
Управление полями ordering, checked_out/checked_out_time, published и hits
Существуют методы класса JTable для управления часто используемыми полями ordering, checked_out/checked_out_time, published и hits.
ordering
Поле ordering позволяет пользователю упорядочить список объектов по своему желанию. Чтобы пересчитать значения в поле ordering, используется метод void reorder([string $where = ''])
При этом записи сортируются по значению ordering, а затем в это поле записываются натуральные числа, начиная с 1. Параметр $where позволяет задать условие ограничения выборки, к которой будет применена эта операция.
Пример использования метода:
$table->reorder();
Изменить значение ordering для одной записи, передвинув ее выше или ниже в списке, можно с помощью метода