Компонент com_content: как получить и вывести статьи программно
Как эффективно получить список статей с помощью встроенного API?
Программное получение статей через com_content
Решение для Joomla 4 с использованием фабрики компонента
use Joomla\CMS\Factory;
use Joomla\Component\Content\Site\Model\ArticlesModel;
$app = Factory::getApplication();
$model = $app->bootComponent('com_content')->getMVCFactory()->createModel('Articles', 'Site');
$items = $model->getItems();
foreach ($items as $article) {
echo $article->title . "\n";
}
Этот метод автоматически учитывает фильтры, права доступа и состояние публикации. Модель возвращает объекты статей со всеми полями.
Типичная ошибка
Если модель не найдена, убедитесь, что компонент com_content установлен. В Joomla 3 используйте require_once JPATH_SITE . '/components/com_content/models/articles.php'; $model = new ContentModelArticles();
Как получить одну статью по ID через таблицу?
Использование JTableContent
Можно загрузить статью напрямую через класс таблицы JTableContent. Это быстрее, но не вызывает все события модели.
use Joomla\CMS\Table\Table;
$table = Table::getInstance('Content', 'JTable', array());
$id = 42; // ID статьи
$table->load($id);
echo $table->title;
Метод load загружает запись из таблицы #__content. После вызова доступны все поля как свойства объекта.
Проблема
Если ID не существует, load вернет false, и свойства будут содержать значения по умолчанию. Всегда проверяйте результат: if (!$table->load($id)) { // обработка ошибки }
Как выполнить прямой SQL запрос к таблице статей?
Использование JDatabase
Для сложных выборок используйте драйвер базы данных Joomla. Важно учитывать префикс таблиц.
use Joomla\CMS\Factory;
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('id, title, alias, catid')
->from($db->quoteName('#__content'))
->where($db->quoteName('state') . ' = 1')
->order('created DESC');
$db->setQuery($query);
$results = $db->loadObjectList();
foreach ($results as $row) {
echo $row->title;
}
Этот подход обходит модели и может быть быстрее, но не обрабатывает плагины контента. Подходит для фоновых задач или кастомных списков.
Распространенная ошибка
Использование #__content без quoteName может привести к SQL-инъекции. Всегда используйте quoteName для имен таблиц и столбцов.
Как вывести статью с применением плагинов контента?
Использование JHtml::_('content.prepare')
Для отображения полного текста статьи с плагинами (например, шорткоды, оценки) используйте хелпер JHtml.
$text = $article->introtext . $article->fulltext;
$text = JHtml::_('content.prepare', $text, null, 'com_content.article');
echo $text;
Третий параметр - группа плагинов (например, 'com_content.article', 'com_content.category'). Плагины будут применены.
Ошибка
Если текст обрабатывается дважды, плагины могут сработать некорректно. Избегайте повторного вызова prepare.
Как использовать событие onContentPrepare в своем плагине?
Запуск событий плагинов вручную
Можно напрямую вызвать событие через диспетчер плагинов для обработки контента.
$dispatcher = JEventDispatcher::getInstance();
$article = new stdClass();
$article->text = 'Пример текста';
$dispatcher->trigger('onContentPrepare', array('com_content.article', &$article, &$params, 0));
Это полезно для кастомной обработки, когда не подходит стандартный вывод.
Примечание
В Joomla 4 JEventDispatcher устарел. Используйте Factory::getApplication()->triggerEvent('onContentPrepare', ...).
Как получить статьи из определенной категории с помощью ContentHelper?
Использование ContentHelperQuery
Для построения сложных запросов с учётом прав доступа используйте ContentHelperQuery.
use Joomla\Component\Content\Administrator\Helper\ContentHelperQuery;
$db = Factory::getDbo();
$query = ContentHelperQuery::getArticlesByCategory($db, $categoryId, $published = true);
$db->setQuery($query);
$articles = $db->loadObjectList();
Этот метод возвращает запрос, готовый к выполнению, с уже наложенными фильтрами по языку, доступу и состоянию.
Требование
Класс ContentHelperQuery доступен в Joomla 4. Для Joomla 3 используйте ContentHelper::getArticlesByCategory или аналогичные методы.
Расширенные примеры работы с com_content
Пример 1: Получение статей с пагинацией через модель
use Joomla\CMS\Factory;
use Joomla\Component\Content\Site\Model\ArticlesModel;
$app = Factory::getApplication();
$model = $app->bootComponent('com_content')->getMVCFactory()->createModel('Articles', 'Site');
$model->setState('list.limit', 5);
$model->setState('list.start', 0);
$model->setState('filter.category_id', 10);
$items = $model->getItems();
$pagination = $model->getPagination();
echo 'Всего статей: ' . $pagination->total;
foreach ($items as $item) {
echo $item->title . '
';
}
Всего статей: 23 Статья 1 Статья 2 ...
Пример 2: Вставка новой статьи через JTable
use Joomla\CMS\Table\Table;
use Joomla\CMS\Factory;
$table = Table::getInstance('Content', 'JTable', array());
$data = array(
'title' => 'Новая статья',
'alias' => 'novaya-statya',
'introtext' => 'Вступительный текст',
'fulltext' => 'Основной текст',
'catid' => 3,
'state' => 1,
'created_by' => Factory::getUser()->id
);
$table->bind($data);
if ($table->check()) {
$table->store();
echo 'Статья создана с ID ' . $table->id;
} else {
echo 'Ошибка: ' . implode(', ', $table->getErrors());
}
Статья создана с ID 57
Пример 3: Обновление статьи через SQL (с использованием транзакции)
$db = Factory::getDbo();
$db->transactionStart();
try {
$query = $db->getQuery(true);
$query->update($db->quoteName('#__content'))
->set($db->quoteName('title') . ' = ' . $db->quote('Обновленное название'))
->where($db->quoteName('id') . ' = 42');
$db->setQuery($query);
$db->execute();
$db->transactionCommit();
echo 'Обновлено успешно';
} catch (Exception $e) {
$db->transactionRollback();
echo 'Ошибка: ' . $e->getMessage();
}
Обновлено успешно
Пример 4: Поиск статей по тексту с использованием плагина поиска
$dispatcher = Factory::getApplication()->getDispatcher();
$results = $dispatcher->triggerEvent('onContentSearch', array('search' => 'joomla', 'limit' => 10));
// $results содержит массив строк с результатами
array( 0 => 'Как установить Joomla', 1 => 'Расширения для Joomla' )
Пример 5: Загрузка изображений из статьи с помощью регулярных выражений
$text = $article->introtext . $article->fulltext;
preg_match_all('/src="([^"]+)"/i', $text, $matches);
$images = $matches[1];
foreach ($images as $img) {
echo $img . '
';
}
images/sampledata/fruitshop/apple.jpg images/sampledata/fruitshop/banana.jpg