Компонент com_content: как получить и вывести статьи программно

Раздел: Joomla -> Joomla

Как эффективно получить список статей с помощью встроенного 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

Компонент com_content в Joomla - comments

En
Php option com content (php)