В процессе работы над одним из своих плагинов мне понадобилось программно добавлять статью в стандартном менеджере материалов. Поскольку мой плагин должен был работать, как под Joomla 3 , так и под Joomla 4 выяснились определенные нюансы и отличия при реализации под разные версии CMS.
Для будущих поколений я написал небольшую функцию, которая выполняет поставленную задачу.
use Joomla\CMS\Factory;
use Joomla\CMS\Table\Table;
function addArticle() {
$introtext = 'Вступительный текст вашей статьи';
$fulltext = 'Полный текст вашей статьи';
$title = 'Заголовок вашей статьи';
$user = Factory::getUser(); // Получаем объект текущего пользователя
$article = Table::getInstance('content');
$article->title = $title; // Добавляем заголовок
$article->alias = JFilterOutput::stringURLSafe($title); // Создаем алиас из заголовка
$article->introtext = $introtext; // Добавляем вступительный текст
$article->fulltext = $fulltext; // Добавляем полный текст
$article->created_by = $user->id; // Указываем автора
$article->modified_by = $user->id; // Также указываем того, кто вносил изменения. Это один и тот же пользователь
// Ниже интересный фрагмент
// Я добавляю статью в категорию "Uncategorised" , которая в Joomla 3 имела id = 1 ,
// а вот в Joomla 4 у нее стал id = 2
if (JVersion::MAJOR_VERSION > 3) {
// Joomla 4
$article->catid = 2; // id категории
$article->metadata = '{"robots":"","author":"","rights":""}';
} else {
// Joomla 3
$article->catid = 1; // id категории
$article->metadata = '{"page_title":"","author":"","robots":""}';
}
$article->created = Factory::getDate()->toSQL(); // Дата создания
$article->state = 1; // Статус : опубликовано
$article->access = 1; // Доступ разрешен
$article->language = '*'; // Языки: все
// Проверка данных на корректность
if (!$article->check()) {
echo 'Отправленные данные не прошли проверку';
die();
}
// Запись в базу данных
if (!$article->store(TRUE)) {
echo 'Запись в базу данных завершилась с ошибкой';
die();
}
// Далее фрагмент, который необходимо запускать исключительно под Joomla 4
// Если не добавить запись в таблицу workflow_associations
// то в административной панели в списке статей статья будет не видна
if (JVersion::MAJOR_VERSION > 3) {
$object = new stdClass();
$object->item_id = $article->id;
$object->stage_id = 1;
$object->extension = 'com_content.article';
Factory::getDbo()->insertObject('#__workflow_associations', $object);
}
}
Заключение
Как видим, сложного ничего нет. Хочу отметить, что использовались так называемые «deprecated» методы. Например, объект пользователя в Joomla 4 я бы получил немножко по другому.
Если у вас остались вопросы, пожелания, отзывы и предложения: добро пожаловать в мою группу Вконтакте по ссылке ниже:
С уважением, Владимир Егоров
