В процессе работы над одним из своих плагинов мне понадобилось программно добавлять статью в стандартном менеджере материалов. Поскольку мой плагин должен был работать, как под 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 я бы получил немножко по другому.
Если у вас остались вопросы, пожелания, отзывы и предложения: добро пожаловать в мою группу Вконтакте по ссылке ниже:
С уважением, Владимир Егоров