Программное создание категории
Joomla 4-5
$mvcFactory = $app->bootComponent('com_categories')->getMVCFactory();
$catModel = $mvcFactory->createModel('Category', 'Administrator', ['ignore_request' => true]);
$category_data['note'] = 'parsed';
$category_data['parent_id'] = !empty($parent) ? $parent['id'] : 1;
$category_data['title'] = $way;
$category_data['alias'] = $alias;
$category_data['path'] = $path;
$category_data['extension'] = 'com_content';
$category_data['published'] = 1;
$category_data['language'] = '*';
$category_data['params'] = array('category_layout' => '','image' => '');
$category_data['metadata'] = array('author' => '','robots' => '');
$catModel->save($category_data);
// jimport( 'joomla.database.table.category' );
//Получаем объект базы данных
$db = JFactory::getDbo();
$categoryTable = new JTableCategory($db);
//Данные категории
$dataContent = array(
'id' => null,
'title' => $cat,
'alias' => parsef::translit($cat),
'extension' => "com_content",
'published' => 1,
'language' => "*",
);
//Вносим данные в таблицу
$categoryTable->bind($dataContent);
//Проверяем или данные корректны
if($categoryTable->check()){
//Создаем новую запись
$categoryTable->store();
// Если запись создана, то прописываем родителя и уровень, запрашиваем получившуюся категорию
if($categoryTable->id){
$categoryTable->parent_id = $parentId;
$categoryTable->level = $parent->level+1;
$categoryTable->path = $parent->path."/".$categoryTable->alias;
$categoryTable->store();
}
}
// Если выполнять это не из среды Joomla, то при при выполнении метода store() будет вылетать ошибка приложения (хотя категория создается)
// И еще после импорта желательно зайти в админке в категории и перестроить дерево (или рыть как это сделать программно - пока не нашел, что-то про JTableNested::rebuild() пишут, но у меня не заработало).
// Также стоит помнить, что порядок добавленных категорий получится обратным
Joomla 4+
<?php
if(!isset($_SERVER['HTTP_HOST'])) $_SERVER['HTTP_HOST'] = 'mysite.ru';
if(empty($_SERVER['DOCUMENT_ROOT'])) $_SERVER['DOCUMENT_ROOT'] = dirname(__DIR__);
define('_JEXEC', 1);
require_once $_SERVER['DOCUMENT_ROOT'] . '/api/includes/defines.php';
define('JPATH_COMPONENT',JPATH_BASE . '/components/com_content');
require_once $_SERVER['DOCUMENT_ROOT'] . '/api/includes/framework.php';
// Boot the DI container
$container = \Joomla\CMS\Factory::getContainer();
$container->alias('session.web', 'session.web.site')
->alias('session', 'session.web.site')
->alias('JSession', 'session.web.site')
->alias(\Joomla\CMS\Session\Session::class, 'session.web.site')
->alias(\Joomla\Session\Session::class, 'session.web.site')
->alias(\Joomla\Session\SessionInterface::class, 'session.web.site');
// Instantiate the application.
$app = $container->get(\Joomla\CMS\Application\SiteApplication::class);
// Set the application as global app
\Joomla\CMS\Factory::$application = $app;
//необходимо зарегистрировать пространства имен расширений, чтобы использовать классы расширений.
$app->createExtensionNamespaceMap();
$category_data['id'] = 0;
$category_data['parent_id'] = 0;
$category_data['title'] = "my title" ;
$category_data['alias'] = "my alias";
$category_data['extension'] = 'com_content';
$category_data['published'] = 1;
$category_data['language'] = '*';
$category_data['params'] = array('category_layout' => '','image' => '');
$category_data['metadata'] = array('author' => '','robots' => '');
$mvcFactory = $app->bootComponent('com_categories')->getMVCFactory();
$catModel = $mvcFactory->createModel('Category', 'Administrator', ['ignore_request' => true]);
$category_id = $catModel->save($category_data);
if (!$category_id ){
throw new Exception('Can\'t create Category...');
}