Все ленты — последние статьи

*Работа с базой данных в Joomla (СБОРНИК РАЗНЫХ СТАТЕЙ ПО ТЕМЕ)

Общая информация

При старте Joomla в числе прочих, создается объект класса database (исходники класса лежат в /includes/database.php), позволяющий Joomla работать с базой данных — выбирать данные и изменять их. Исторически сложилось, что данный класс лишь обертка над myslq_* функциями, пусть и очень удобная.

Префикс таблиц в Joomla

Так как Joomla изначально создавалась для учета реальных требований хостинга, то в ней заложен функционал доступа к таблицам, согласно их префиксу. Т.е. если ваш тарифный план на хостинге дает вам возможность использовать одну лишь базу данных MySQL, а вы хотите поставить, например две Joomla или какой-либо дополнительный скрипт, названия таблиц которого совпадают с некоторыми таблицами в Joomla, то это можно реализовать при помощи префикса таблиц.

Сам префикс задается еще при установке и чаще всего представляет собой нечто вроде “jos_” (JOS расшифровывается как Joomla Open Source) и записывается в файл конфигурации configuration.php.

 

Конечно, при работе с базой данных можно считывать эту переменную и каждый раз приписывать ее к именам таблиц в SQL-запросах, но намного удобнее использовать механизм, встроенный в Joomla, а именно макроподстановку #__ (знак решетки и два подчеркивания). В классе database данный символ будет заменен на текущий префикс таблиц, с которым работает Joomla. Например, если при установке вы оставили префикс пустым, то он и будет заменен на пустую строку, и названия таблиц будут самыми читабельными: users, session.

Методы класса database

  • setQuery — один из самых часто используемых методов. Нужен для того, что бы объект записал запрос в свою внутреннюю переменную и заменил префикс на тот, который записан в файле конфигурации.
  • query — используется для исполнения запроса, не возвращающего никаких данных. Например, вставки или удаления строк из таблицы по некоторому условию.
  • loadObjectList — используется для выборки массива объектов представляющих собой наследники stdClass с именами полей совпадающих с именами столбцов в таблице.
  • loadResultArray — загрузка массива результатов. Удобно при выборке одной колонки, а не нескольких.
  • loadResult — загрузка одного поля. Т.е. мы знаем что результат будет только один.

Примеры использования:

  • Загрузка списка пользователей
$database->setQuery("SELECT * FROM #__users");
$list = $database->loadObjectList();
 
foreach($list as $user) {
 
echo $user->name;
}

В результате мы увидим на экране имена всех пользователей на сайте. Отмечу, что для некоторых людей, ранее работавших с другими CMS и их слоями абстракции от БД, такой подход может оказаться немного странным. Они могли привыкнуть в цикле производить выборку данных и в этом же цикле с ними что-то делать, а здесь цикл выборки спрятан от глаз программиста, он сразу работает с данными. Надо просто привыкнуть, и позволить такие рутинные функции делать самой Joomla, а в цикле уже манипулировать данными, а не функциями выборки этих данных.

  • Загрузка ID-статей из определенного раздела
$database->setQuery("SELECT id FROM #__content WHERE section_id=1");
$ids = $database->loadResultArray();
echo implode(',',$ids);//выведет нечто вроде "1,2,3,4,5,6"
  • Загрузка email текущего пользователя
global $my;
$database->setQuery("SELECT email FROM #__users WHERE id='{$my->id}'");
$email = $database->loadResult();
  • Удаление из таблицы
$database->setQuery("DELETE FROM #__xxx WHERE id>20");
$database->query();
 
  • Вставка данных
$database->setQuery("INSERT INTO #__table (name,value) VALUES ('волк','голодный')");
$database->query();

Если в таблице было создано поле типа AUTO_INCREMENT, то получить идентификатор вновь созданного поля можно при помощи метода insertid, если вызвать его сразу после непосредственной вставки данных.

$new_id = $database->insertid();

Отладка обращений к базе данных

Порой, во время написания компонента или модуля возникает такая ситуация, что метод loadObjectList возвращает не нужные нам значения, а NULL. Это происходит из-за того, что вы совершили ошибку в синтаксисе SQL-запроса. Для того, что бы узнать ее, вам необходимо вызвать специальный метод, отображающий последнюю ошибку, которая произошла в данном сеансе работы с сервером MySQL.

$database->setQuery(“SELECT * FROM qwerty”);
$list = $database->loadObjectList();
echo $database->stderr();

Если таблицы не существует, то будет выведено сообщение примерно такого вида: “Table 'joomla.qwerty' doesn't exist”. Для других ситуаций ошибки будут другими.

 

ВТОРАЯ СТАТЬЯ

Как подключиться к внешней базе данных в joomla

Если в разрабатываемом расширении для joomla вам требуется доступ к таблицам в одной базе данных, созданной при инсталляции joomla, то вы можете просто использовать JFactory->getDBO метод. При этом используя уже установленное соединение с базой данных Joomla, которое используется для подключения. Например вот так:

 
<?php $db = JFactory::getDBO(); ?>  

После этого $db будет содержать объект типа JDatabase, и вы можете выполнять операции с базой данных используя стандартные методы joomla для работы с базой данных.

Но что если вы хотите подключиться к внешней базе данных в joomla?. Это может быть другая база данных на том же сервере, что и ваша база данных установки Joomla! Или это может быть база данных абсолютно на другом удаленном хосте, и для соединения с ней возможно даже потребуется другой драйвер базы данных. Реализовать такое соединение к удаленной базе данных в joomla, возможно при использовании метода JDatabase->getInstance, как в примере ниже:

 
<?php $option = array(); //prevent problems   $option['driver'] = 'mysql'; // Имя драйвера удаленной базы данных $option['host'] = 'mysql.host.com'; // Имя сервера удаленной базы данных $option['user'] = 'user_name'; // Имя пользователя учетной записи удаленной базы данных $option['password'] = 'sjy6j6t8y'; // Пароль доступа учетной записи к удаленной базе данных $option['database'] = 'db_name'; // Имя удаленной базы данных $option['prefix'] = 'pref_'; // Префикс таблиц удаленной базы данных (может быть пустым)   $db = & JDatabase::getInstance($option); ?>  

После этого $db как и в первом случае будет содержать объект типа JDatabase, и вы также можете выполнять операции с базой данных используя стандартные методы joomla для работы с базой данных.

Заметим, что если база данных использует нестандартный номер порта, то это может быть указано, добавив его в конце имени хоста. Например, ваша база данных MySQL использует порт 3307 (по умолчанию используется порт 3306), в этом случае имя хоста может быть "mysql.host.com: 3307".

Одной из особенностей использования JDatabase::getInstance является то, что если еще одно соединение сделано с теми же параметрами, он вернет ранее созданный объект, и не будет создавать новый.

Однако следует отметить, что параметры должны в точности совпадать, чтобы это произошло. Например, если два соединения были сделаны с базой данных MySQL с использованием JDatabase::getInstance, при первом использовании имени хоста "mysql.host.com", а второе с помощью "mysql.host.com: 3306", то будут сделаны два отдельных соединения, несмотря на то, что порт 3306 является портом по умолчанию для MySQL и остальные параметры указанные в option соединения являются одинаковыми.

 

ТРЕТЬЯ СТАТЬЯ

 

Работа с базой данных в Joomla 2.5

Подключение к базе данных:

$db = JFactory::getDbo();

Также используется и в файле модели.

Получение экземпляра класса JDatabaseQuery:

$query = $db->getQuery(true);

Выбор данных из одной таблицы:

// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
// Select all records from the user profile table where key begins with "custom.".
// Order it by the ordering field.
$query->select(array('user_id', 'profile_key', 'profile_value', 'ordering'));
$query->from('#__user_profiles');
$query->where('profile_key LIKE \'custom.%\'');
$query->order('ordering ASC');
// Reset the query using our newly populated query object.
$db->setQuery($query);
// Load the results as a list of stdClass objects.
$results = $db->loadObjectList();

Выбор данных из двух таблиц:

// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
// Select all articles for users who have a username which starts with 'a'.
// Order it by the created date.
$query
->select(array('a.*', 'b.username', 'b.name'))
->from('#__content AS a')
->join('INNER', '#__users AS b ON (a.created_by = b.id)')
->where('b.username LIKE \'a%\'')
->order('a.created DESC');
// Reset the query using our newly populated query object.
$db->setQuery($query);
// Load the results as a list of stdClass objects.
$results = $db->loadObjectList();

Выбор данных из больше чем двух таблиц:

$query
->select(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*'))
->from('#__content AS a')
->join('INNER', '#__users AS b ON (a.created_by = b.id)')
->join('LEFT', '#__user_profiles AS c ON (b.id = c.user_id)')
->join('RIGHT', '#__categories AS d ON (a.catid = d.id)')
->where('b.username LIKE \'a%\'')
->order('a.created DESC');

Вставка записи

с помощью SQL:

// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
// Insert columns.
$columns = array('user_id', 'profile_key', 'profile_value', 'ordering');
// Insert values.
$values = array(1001, $db->quote('custom.message'), $db->quote('Inserting a record using insert()'), 1);
// Prepare the insert query.
$query
->insert($db->quoteName('#__user_profiles'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
// Reset the query using our newly populated query object.
$db->setQuery($query);

Задали sql запрос, теперь его выполняем:

try {
// Execute the query in Joomla 2.5.
$result = $db->query();
} catch (Exception $e) {
// catch any database errors.
}

Для Joomla Framework 12.1 и выше:

try {
// Execute the query in Joomla 3.0.
$result = $db->execute();
} catch (Exception $e) {
// catch any database errors.
}

с помощью объекта записи:

// Create and populate an object.
$profile = new stdClass();
$profile->user_id = 1001;
$profile->profile_key='custom.message';
$profile->profile_value='Inserting a record using insertObject()';
$profile->ordering=1;
try {
// Insert the object into the user profile table.
$result = JFactory::getDbo()->insertObject('#__user_profiles', $profile);
catch (Exception $e) {
// catch any errors.
}

Обновление записи

с помощью SQL:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
// Fields to update.
$fields = array(
'profile_value=\'Updating custom message for user 1001.\'',
'ordering=2');
// Conditions for which records should be updated.
$conditions = array(
'user_id=42',
'profile_key=\'custom.message\'');
$query->update($db->quoteName('#__user_profiles'))->set($fields)->where($conditions);
$db->setQuery($query);
try {
$result = $db->query(); // Use $db->execute() for Joomla 3.0.
catch (Exception $e) {
// Catch the error.
} 

с помощью объекта:

// Create an object for the record we are going to update.
$object = new stdClass();
// Must be a valid primary key value.
$object->id = 1;
$object->title = 'My Custom Record';
$object->description = 'A custom record being updated in the database.';
try {
// Update their details in the users table using id as the primary key.
$result = JFactory::getDbo()->updateObject('#__custom_table', $object, 'id');
} catch (Exception $e) {
// catch the error.
}

Удаление записи:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
// delete all custom keys for user 1001.
$conditions = array(
'user_id=1001',
'profile_key LIKE \'custom.%\'');
$query->delete($db->quoteName('#__user_profiles'));
$query->where($conditions);
$db->setQuery($query);
try {
$result = $db->query(); // $db->execute(); for Joomla 3.0.
} catch (Exception $e) {
// catch the error.
} 

Транзакция:

$db = JFactory::getDbo();
try {
$db->transactionStart();
$query = $db->getQuery(true);
$values = array($db->quote('TEST_CONSTANT'), $db->quote('Custom'), $db->quote('/path/to/translation.ini'));
$query->insert($db->quoteName('#__overrider'));
$query->columns($db->quoteName(array('constant', 'string', 'file')));
$query->values(implode(',',$values));
$db->setQuery($query);
$result = $db->query();
$db->transactionCommit();
} catch (Exception $e) {
$db->transactionRollback();
// catch any database errors.
}

 

ЧЕТВЕРТАЯ СТАТЬЯ

Работа с базой данных в Joomla

Материал из База знаний Joomla

Это статья из раздела Программирование для Joomla. Вернитесь в него для более полной информации.


Содержание

Общая информация

При старте Joomla в числе прочих, создается объект класса database (исходники класса лежат в /includes/database.php), позволяющий Joomla работать с базой данных — выбирать данные и изменять их. Исторически сложилось, что данный класс лишь обертка над myslq_* функциями, пусть и очень удобная.

 

Префикс таблиц в Joomla

Так как Joomla изначально создавалась для учета реальных требований хостинга, то в ней заложен функционал доступа к таблицам, согласно их префиксу. Т.е. если ваш тарифный план на хостинге дает вам возможность использовать одну лишь базу данных MySQL, а вы хотите поставить, например две Joomla или какой-либо дополнительный скрипт, названия таблиц которого совпадают с некоторыми таблицами в Joomla, то это можно реализовать при помощи префикса таблиц.

Сам префикс задается еще при установке и чаще всего представляет собой нечто вроде “jos_” (JOS расшифровывается как Joomla Open Source) и записывается в файл конфигурации configuration.php.

Конечно, при работе с базой данных можно считывать эту переменную и каждый раз приписывать ее к именам таблиц в SQL-запросах, но намного удобнее использовать механизм, встроенный в Joomla, а именно макроподстановку #__ (знак решетки и два подчеркивания). В классе database данный символ будет заменен на текущий префикс таблиц, с которым работает Joomla. Например, если при установке вы оставили префикс пустым, то он и будет заменен на пустую строку, и названия таблиц будут самыми читабельными: users, session.

 

Методы класса database

  • setQuery — один из самых часто используемых методов. Нужен для того, что бы объект записал запрос в свою внутреннюю переменную и заменил префикс на тот, который записан в файле конфигурации.
  • query — используется для исполнения запроса, не возвращающего никаких данных. Например, вставки или удаления строк из таблицы по некоторому условию.
  • loadObjectList — используется для выборки массива объектов представляющих собой наследники stdClass с именами полей совпадающих с именами столбцов в таблице.
  • loadResultArray — загрузка массива результатов. Удобно при выборке одной колонки, а не нескольких.
  • loadResult — загрузка одного поля. Т.е. мы знаем что результат будет только один.

 

Примеры использования:

  • Загрузка списка пользователей
$database->setQuery("SELECT * FROM #__users"); $list = $database->loadObjectList();   foreach($list as $user) {   echo $user->name; }

В результате мы увидим на экране имена всех пользователей на сайте. Отмечу, что для некоторых людей, ранее работавших с другими CMS и их слоями абстракции от БД, такой подход может оказаться немного странным. Они могли привыкнуть в цикле производить выборку данных и в этом же цикле с ними что-то делать, а здесь цикл выборки спрятан от глаз программиста, он сразу работает с данными. Надо просто привыкнуть, и позволить такие рутинные функции делать самой Joomla, а в цикле уже манипулировать данными, а не функциями выборки этих данных.

  • Загрузка ID-статей из определенного раздела
$database->setQuery("SELECT id FROM #__content WHERE section_id=1"); $ids = $database->loadResultArray(); echo implode(',',$ids);//выведет нечто вроде "1,2,3,4,5,6"
  • Загрузка email текущего пользователя
global $my; $database->setQuery("SELECT email FROM #__users WHERE id='{$my->id}'"); $email = $database->loadResult();
  • Удаление из таблицы
$database->setQuery("DELETE FROM #__xxx WHERE id>20"); $database->query();  
  • Вставка данных
$database->setQuery("INSERT INTO #__table (name,value) VALUES ('волк','голодный')"); $database->query();

Если в таблице было создано поле типа AUTO_INCREMENT, то получить идентификатор вновь созданного поля можно при помощи метода insertid, если вызвать его сразу после непосредственной вставки данных.

$new_id = $database->insertid();

 

Отладка обращений к базе данных

Порой, во время написания компонента или модуля возникает такая ситуация, что метод loadObjectList возвращает не нужные нам значения, а NULL. Это происходит из-за того, что вы совершили ошибку в синтаксисе SQL-запроса. Для того, что бы узнать ее, вам необходимо вызвать специальный метод, отображающий последнюю ошибку, которая произошла в данном сеансе работы с сервером MySQL.

$database->setQuery(“SELECT * FROM qwerty”); $list = $database->loadObjectList(); echo $database->stderr();

Если таблицы не существует, то будет выведено сообщение примерно такого вида: “Table 'joomla.qwerty' doesn't exist”. Для других ситуаций ошибки будут другими.

 

ПЯТАЯ СТАТЬЯ

 

JTable — работа с таблицами базы данных

Joomla CRUD

Joomla! предоставляет нам мощный абстрактный класс JTable; при этом мы можем выполнять все основные функции по работе с таблицей. Для каждой таблицы, которую мы хотим использовать в классе JTable, мы должны создать новый подкласс.

При создании подкласса JTable, мы должны придерживаться некоторых правил. Эти правила позволят нам интегрировать наше расширение в Фреймворк Joomla.

Итак, каждый подкласс JTable должен быть расположен в отдельном файле в каталоге tables (в административной части компонента). Имя создаваемого класса должно иметь префикс table. Имя файла обязательно должно быть в единственном числе.

Используем описанную выше схему таблицы, чтобы показать на примере как работать с классом JTable.

Класс должен называться Table[Название класса], например, TableMyData и расположен в каталоге  JPATH_COMPONENT_ADMINISTRATOR.DS.'tables'.DS.'mydata.php'.  При первом использовании нашего класса мы должны определить глобальные свойства. Глобальные свойства соответствуют полям таблицы и должны иметь такие же названия. Мы используем эти свойства как буфер для хранения отдельных записей.

Во-вторых, в целях использования метода JTable::getInstance() мы должны определить конструктор.

В-третьих, нам нужно переопределить метод check(). Этот метод проверяет содержимое буфера и возвращает булево значение. Если метод вернул значение false, то используем метод setError() для пояснения ошибки.

class TableMyData extends JTable
{
    /** @var int Primary key */
    var $id = null;
 
    /** @var string Content */
    var $content = null;
 
    /** @var int Checked-out owner */
    var $checked_out = null;
 
    /** @var string Checked-out time */
    var $checked_out_time = null;
 
    /** @var string Parameters */
    var $params = null;
 
    /** @var int Order position */
    var $ordering = null;
 
    /** @var int Number of views */
    var $hits = null;
 
    /**
    * Constructor
    *
    * @param database Database object
    */
    function __construct( &$db )
    {
        parent::__construct('#__myextension_mydata', 'id', $db);
    }
     
    /**
    * Проверка
    *
    * @return boolean True if buffer is valid
    */
    function check()
    {
        if(!$this->content)
        {
            $this->setError(JText::_('Ошибка'));
            return false;
        }
        return true;
    }
}

Теперь, когда мы создали TableMyData класс нужно инстанцировать объект с помощью статического метода JTable:: getInstance().

JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');
$table = JTable::getInstance('mydata', 'Table');

Заметьте, что мы подключаем не mydata.php а только каталог с таблицами. Когда JTable начинает инстанцировать TableMyData на объект, автоматически подключается mydata.php.

CRUD

CRUD (Create Read Update Delete) — это общее название основных задач по управлению таблицей. 
Все CRUD примеры $table ссылаются на класс TableMyData и $id ссылается на идентификатор записи которую мы в данный момент обрабатываем. В этом примере мы создаем новую запись; $table — экземпляр класса TableMyData.

$table->reset();
$table->set('content', "Наш контент");
$table->set('ordering', $table->getNextOrder());
if ($table->check())
{
    if (!$table->store())
    {
        // обработчик ошибок записи
        // используем $table->getError()
    }
} else {
    // обработчик ошибки проверки буфера
    // тоже используем $table->getError()
}

Метод reset() очищает наш буфер и приводит значения всех свойств к значениям по-умолчанию. Метод getNextOrder() определяет следующий по порядку вложенности элемент. Если запись не существующая, то он ставит значение 1.

Давайте рассмотрим наш пример подробнее. Некоторые из полей имели значение по-умолчанию, и после записи, значение даты будет пустым. После выполнения предыдущего примера буфер $table выглядит так:

array (
    'id' => '1',
    'content' => 'Наш контент',
    'checked_out' => '',
    'checked_out_time' => '',
    'params' => '',
    'ordering' => '1',
    'hits' => '0'
);


После выполнения метода store() (сохранения записи), мы можем загрузить его:

<samp>$table->load($table->id);</samp>


Теперь наш буфер выглядит так:

array (
    'id' => '1',
    'content' => 'Наш контент',
    'checked_out' => '0',
    'checked_out_time' => '0000-00-00 00:00:00',
    'params' => '',
    'ordering' => '1',
    'hits' => '0',
);


Вместо загрузки нашей сохраненной записи, мы могли бы изначально верно установить значения по-умолчанию, и нам бы не пришлось перезагружать запись.

Однако некоторые значения по-умолчанию зависят от типа данных. Поэтому нам нужно переопределить метод reset(). Для примера значение checked_out_time будет равно $db->getNullDate(). Итак для загрузки конкретной записи используем метод:

if (!$table->load($id))
{
    // обработчик загрузки
    // используем $table->getError() для ловли ошибок
}


Для обновления записи в буфере мы можем использовать два метода: первый — это загрузить запись из БД, второй — это установить конкретные значения для свойств буфера.

В этом примере покажем как обновить запись:

// установка значений
$table->reset();
$table->setVar('id', $id);
$table->setVar('content', JRequest::getString('content'));
if ($table->check())
{
    if (!$table->store())
    {
        // обрабатываем ошибки записи с помощью $table->getError()
    }
} else {
    // обрабатываем ошибки ввода в буфер $table->getError()
}


Последнее что мы рассмотрим — это удаление записи:

if (!$table->delete($id))
{
    // обрабатываем ошибки
}


Если мы не указываем в методе delete() номер id, то id будет браться из буфера.

Если наша запись в таблице имеет родственные записи с другими таблицами, то мы должны сначала выполнить проверку методом canDelete(). Этот метод имеет всего один параметр в виде двумерного массива. Внутри массива должно быть несколько ключей — idfield, name, joinfield, и label. idfield — это имя первичного ключа в соответствующей таблице. name — это название самой таблицы. joinfield — это имя внешнего ключа соответствующей таблицы. label — это описание отношения между таблицами, для вывода сообщения об ошибке, если родственных связей не найдено.

Представьте что есть еще одна таблица #__myextension_children. Эта таблица имеет первичный ключ childid и внешний ключ primary, который ссылается на запись в таблице #__myextension_mydata. В этом примере мы проверим нет ли зависимости между записями таблицами #__myextension_children и #__myextension_mydata, перед удалением записи из таблицы #__myextension_mydata.

$join1 = array(
    'idfield'   => 'childid',
    'name'      => '#__myextension_children',
    'joinfield' => 'parent',
    'label'     => 'Children'
);
  
$joins = array($join1);
if ($table->canDelete($id, $joins))
{
    if (!$table->delete($id))
    {
        // обрабатываем ошибки удаления
    }
} else {
    // обрабатываем в случае нахождения зависимостей
}

Мы можем определить более одной межтабличной связи. Допустим еще существует таблица #__myextension_illegitimate_children:

$join1 = array(
    'idfield'   => 'childid',
    'name'      => '#__myextension_children',
    'joinfield' => 'parent',
    'label'     => 'Children');
$join2 = array(
    'idfield'   => 'ichildid',
    'name'      => '#__myextension_illegitimate_children',
    'joinfield' => 'parent',
    'label'     => 'illegitimate Children');
$joins = array($join1, $join2);

Управление зарезервированными полями

Наша таблица содержит все зарезервированные поля, которыми мы можем управлять с помощью методов класса JTable. Рассмотрим управление этими полями подробнее.

Publishing

Для публикации и снятия с публикации мы можем использовать метод publish(). Если таблица содержит поле checked_ out, то мы можем быть уверены что запись таблицы не редактируется другим пользователем. Приведем пример публикации:

$publishIds = array($id);
$user =& JFactory::getUser();
if (!$table->publish($publishIds, 1, $user->get('id')))
{
    // обрабатываем ошибки
}


Первый параметр — это массив из id записей, которые нужно опубликовать или снять с публикации. Второй параметр необязательный, и указывает публикуем мы запись (значение 1), или снимаем с публикации (значение 0). По-умолчанию имеет значение 1. Последний параметр используется только в случае, если существует поле checked_out, и указывает id пользователя редактирующего запись. Метод возвращает значение true если все прошло успешно.

Hits

Произвести инкремент над записью можно с помощью метода hit(). Для примера мы установим id записи и выполним инкремент.

$table->set('id', $id);
$table->hit();


Также мы можем указать в параметре метода hit() нужный нам id. Но мы должны помнить что при этом обновиться буфер.

$table->hit($id);

Checking Out

Перед тем как мы начнем блокировать наши записи, мы должны убедиться что запись уже не заблокирована. Это нужно, чтобы не получилось, что несколько пользователей одновременно редактируют одну запись. Для этого мы можем использовать метод isCheckOut(). В этом примере мы выполняем проверку:

$table->load($id);
$user =& JFactory::getUser();
if ($table->isCheckedOut($user->get('id')))
{
    // выполняем действия если запись заблокирована
}

Далее мы блокируем запись под пользователя:

$table->load($id);
$user =& JFactory::getUser();
if (!$table->checkout($user->get('id')))
{
    // обрабатываем ошибки
}


Для того чтобы обрабатывать запись используем следующий метод:

$table->load($id);
$user =&amp; JFactory::getUser();
if (!$table->checkin($user->get('id')))
{
    // обрабатываем ошибки
}

Запомните, что эти методы можно использовать только для залогенных пользователей.

Ordering

Когда мы хотим расположить элементы в определенном порядке, JTable предоставляет нам для этого набор методов. Первый из рассмотренных нами методов будет reorder(). Этот метод исправляет ошибки в порядке расположения записей в таблице.

$table->reorder();


В более сложных таблицах записи обычно разбиты по группам, и для этого в метод reorder() нужно дописать дополнительный параметр. Представим, что в нашей таблице есть поле group. В этом примере мы упорядочим записи в группе 1.

$db =& $table::getDBO();
$where = $db->nameQuote('group').' = 1';
$table->reorder($where);


Заметьте, что мы получаем объект базы данных не из JFactory, а из таблицы!
Ранее мы уже использовали метод getNextOrder(). Метод выдает нам следующую позицию в порядке упорядочивания. Как и в случае с reorder(), мы имеем возможность определения групп. Например, получим следующий номер порядка для группы 1.

$db =& $table::getDBO();
$where = $db->nameQuote('group').' = 1';
$nextPosition = $table->getNextOrder($where);


И последний метод — это move(). Он нужен для перемещения записи на одну позицию вверх или вниз. Переместим на примере запись вверх.
$table->load($id); $table->move(-1); Опять у нас есть возможность для указания групп. Покажем это на примере:

$db =& $table::getDBO();
$where = $db->nameQuote('group').' = 1';
$table->load($id);
$table->move(1, $where);

Поле параметров params

Класс JTable не имеет каких-то специальных методов по управлению параметрами INI. Буфер JTable предназначен для хранения RAW данных параметров, которые необходимо сохранить.

Для обработки поля параметров используется класс JParameter. Для начала нам нужно создать новый объект JParameter, и если мы получили доступ к существующей записи отпарсить его.

Класс JParameter расширяет класс JRegistry. В этом примере мы рассмотрим как можно парсить параметры используя класс JParameter.

$params = new JParameter($table->params);


Как только мы получили доступ к параметрам, мы можем изменять их используя методы get() и set().

$value = $params->get('someValue');
$params->set('someValue', ++$value);


Также мы можем получить данные в виде INI строки используя метод toString().

$table->params = $params->toString();


Мы также можем сами создать строку параметров. Для этого нужно указать сами параметры и путь к XML файлу манифеста.

$params = new JParameter('foo=bar', $pathToXML_File);


Для вывода параметров на экран в виде формы используется метод render().

echo $params->render('params');

Поля даты

При сохранении даты, очень важно чтобы она была в правильном формате. Для MySql мы должны сохранять дату в виде YYYY-MM-DD HH:MM:SS. Самый простой способ сделать это — использовать класс JDate. В этом классе нам потребуется метод toMySQL(), для приведения даты к правильному виду.

// import JDate class
jimport('joomla.utilities.date');
// получаем текущую дату и время
$myDate = gmdate();
// создаем новый объект JDate
// для joomla 1.5.0 надо было писать $jdate = new JDate($myDate);
$jdate = &amp; JFactory::getDate($myDate);
// создаем запрос используя toMySQL()
$query = 'SELECT * FROM #__example WHERE date < '.$jdate->toMySQL();


$myDate — это дата в формате UNIX (timestamp).

 

СЛЕДУЮЩАЯ СТАТЬЯ

JDatabase — прямые запросы в базу данных Joomla

с примерами запросов

Безопасная вставка данных

Главное при работе с базой данных — это безопасность, поэтому предохраняйтесь от случайных данных. Таким средством является метод getEscaped();

$_REQUEST["sometext"] = "Безопасность превыше всего, всевозоможные апострофы — (') нужно экранировать   ";
$mytext = JRequest::getVar('sometext','');
$db =& JFactory::getDBO();
$mytext = $db->getEscaped($mytext);
echo $mytext;

Установка используемой базы данных

Эта возможность полезна, когда нужно получить данные из базы данных, отличной от текущей. Однако нужно заметить, чтобы этот метод был выполнен успешно, нужно, чтобы пользователь mysql установленный в настройках Джумла имел право работать с обеими базами данных.

$db =& JFactory::getDBO();
$database_name = "db2";
if ($db->select($database_name)) {
    //запросы к другой базе данных
 
}

Отладка текущего запроса

От ошибок не застрахован никто, поэтому полезно иногда посмотреть что возвращает ваш запрос. И для этого не обязательно копировать его и вставлять в phpmyadmin.

$db = JFactory::getDBO();
$q = "SELECT * FROM #__content LIMIT 5";
 
$db->setQuery($q);
$db->explain();

Проверка соединения с базой данных

Иногда полезно знать, что сервер mysql не «упал» и соединение с ним работает. Например перед тем как обновить данные в базе об оплате счета и т. п.

$db =& JFactory::getDBO();
if (!$db->connected()) {
    echo "Нет соединения с сервером баз данных";   
    jexit();
} else {
 
    echo "Все отлично, мы можем выполнять важные действия с базой данных";
}

Получение данных о пользователе

Работа с записью пользователя Joomla 1.5.x получение данных о пользователе

Частенько приходится отделять зерна от плевел. Как это сделать в Джумла? — Очень просто — назначить группы. А как же узнать к какой группе принадлежит пользователь, конечно же по идентификатору группы.

Вот табличка соответствия стандартных групп Джумла.

Идентификатор Название Группы
18 Зарегистрированные пользователи
19 Автор
20 Редактор
21 Публикатор
23 Менеджер
24 Администратор
25 Супер администратор
//для текущего пользвоателя
$user =& JFactory::getUser();
$user62 =& JFactory::getUser(62);
echo "ИД группы текущего пользователя:".$user->get( 'gid' );
echo "ИД группы пользователя с ИД=62:".$user62->get('gid' );
 
 
 
if ($user->get( 'guest' )) {
    echo "Пользователь проходимец или просто гость";
 
} else {
    echo "Пользователь зарегистрирован";
    echo "Дата последнего визита:".$user->get('lastvisitDate');
    echo "Дата регистрации:".$user->get('registerDate');
    echo "Имя пользователя/никнейм:".$user->get('name'). "/".$user->get('username');
    echo "ID пользователя:".$user->get('id');
    echo "Тип пользователя:".$user->get('usertype');
 
    echo "email пользователя:".$user->get('email');
    echo "MD5 хеш от пароля:".$user->get('password');
}

Получить количество обработанных строк в последнем запросе

Показывает сколько строк было задействовано в ходе выполнения запроса.

//1. Создадим экземпляр класса
$db=&JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном случае мы выбираем статьи
$sql = 'SELECT id,title FROM jos_content ORDER BY id ASC  ';
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($sql);
 
//4.  Выполним запрос
$db->query();
 
//5. Посмотрим  сколько было задействовано строк
echo $db->getAffectedRows ();

Исполнение нескольких запросов

В основном следующая конструкция используется при установке или удалении данных о компоненте в базе данных

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();
 
$sql = "";
 
//2. Создадим запросы к базе данных, в данном случае мы статью вне категорий
for ($i=0;$i<10;$i++) {
    $sql .=" INSERT INTO `jos_content` (`title`, `introtext`) VALUES  ('Тест$i', 'test$i') ; ";
}
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($sql);
 
//4.  Для того чтобы выполнить эти запросы будем использовать следующую конструкцию
$db->queryBatch();

Выполнение запросов

В основном следующая конструкция используется для выполнения запроса INSERT,UPDATE,DELETE.

//1. Создадим экземпляр класса
 
$db =& JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном случае мы статью вне категорий
$sql = " INSERT INTO `jos_content` (`title`, `introtext`) VALUES  ('Тест', 'test') ";
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($sql);
 
//4.  Для того чтобы выполнить этот запрос будем использовать следующую конструкцию
if(!$db->query()) {
    // 5. Выводим ошибку, в случае если запрос не выполнился
    echo __LINE__.$db->stderr();
}

После этого в менеджере статей вы можете увидеть эту статью.

Получаем результат запроса из базы в виде неассоциативного массива

Фактически результат функции php — mysql_fetch_row.

//1. Создадим экземпляр класса
$db=& JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном случае мы выбираем первую статью
$q='SELECT id,title FROM jos_content ORDER BY id ASC LIMIT 1 ';
 
//3. Установим этот запрос в экземпляр класса  работы с базами данных
$db->setQuery($q);
 
//4.  Выполним запрос и получим данные
$data_row = $db->loadRow();
 
//5. Посмотрим  что нам вернул этот метод, должен быть массив из 2-х элементов id и  title
print_r($data_row);

Результат:

Array
(
    [0] => 1
    [1] => Welcome to Joomla!
)

Получаем единичное значение из базы

Иногда нужно просто получить одно значение из базы.

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном  случае мы выбираем первую статью
$query='SELECT title FROM jos_content ORDER BY id ASC LIMIT 1 ';
 
//3. Установим этот запрос в экземпляр класса  работы с базами данных
$db->setQuery($query);
 
//4.  Выполним запрос и получим данные
$datavalue = $db->loadResult();
 
//5. Посмотрим  что нам вернул этот метод,  это должна быть строка с заголовком первой статьи.
print_r($datavalue);

Загружаем данные одной записи таблицы в массив

Мы можем получить массив элементами которого будут поля записи.

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном случае мы выбираем первую статью
$q = 'SELECT title FROM jos_content ORDER BY id ASC LIMIT 1 ';
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($q);
 
//4.  Выполним запрос и получим данные
$data_array = $db->loadResultArray();
 
//5. Посмотрим  что нам вернул этот метод,  должен быть массив с элементами id и  title
print_r($data_array);

Результат:

Array
 
(
    [0] => Welcome to Joomla!
)

Загружаем данные одной записи таблицы в объект

Мы можем получить объект свойствами которого будут поля записи.

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном случае мы выбираем 1 статью
$query = 'SELECT * FROM  jos_content ORDER BY id ASC  LIMIT 1';
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($query);
 
//4.  Выполним запрос
$row = $db->loadObject();
 
//5. Посмотрим  что нам вернул этот метод
print_r($row);

Получение ассоциативного списка записей

Иногда список объектов не очень удобен, гораздо удобнее работать с ассоциативным списком данных.

//1. Создадим экземпляр класса
$db =& JFactory::getDBO();
 
//2. Создадим запрос к базе данных, в данном случае мы выбираем только первые 10 статей
$query = 'SELECT id,title FROM jos_content ORDER BY id ASC LIMIT 10 ';
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($query);
 
//4.  Выполним запрос и получим данные в качестве списка объектов
$data_rows_assoc_list = $db->loadAssocList();
 
//5. Посмотрим  что нам вернул этот метод
print_r($data_rows_assoc_list);

Получение списка объектов

Многие, кто пишет расширения для Joomla сталкивается с тем что нужно выполнить запрос к базе данных для получения или вставки данных. Попробуем получить простейший список объектов.

//1. Создадим экземпляр класса
$db=& JFactory::getDBO();
 
//2. Создадим запрос к базе данных
$q = 'SHOW TABLES';
 
//3. Установим этот запрос в экземпляр класса работы с базами данных
$db->setQuery($q);
 
//4.  Выполним запрос и получим данные в качестве списка объектов
$data_object_list = $db->loadObjectList();
 
//5. Посмотрим какие таблицы у нас есть. Распечатав список

print_r($data_object_list);