Программное создание категории

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...');
}
​