Создание категории с фронтенда в Joomla 4



Постановка задачи о создании категории во фронтенде Joomla 4.

Зарегистрированный пользователь получает права доступа "Автор". Через меню можно сделать кнопку "Создать материал" и Автор, зайдя на сайт, может создать этот материал. Это и ежу понятно.

Необходимо, чтобы Автор, нажав кнопку в своем профиле, мог создать Категорию, имея только Название и Алиас.

Как это реализовать в Joomla 4? Все, что я нашел, устарело и не работает.

Ход мыслей о том, как создать категорию из фронтенда Joomla 4.

В файле: templates/mytemplate/html/com_users/profile/default.php есть кнопка и скрипт:

$(".url").click(function(){
    var url = $("#basic-url").val();
    var idbtnclick1 = $(this).attr('id');
    $.ajax({
        type: 'post',
        url: "/property/profile/page.php", 
        data: {
            'user': "<?php echo $user ?>",
            'url': url,
            'command': idbtnclick1
            },
        response: 'text',
        //location.reload();
        //success: function(data){
        //  $("#eddd").html(data); 
        //}
    })
    //console.log(url);
});

В файле: /property/profile/page.php

define('_JEXEC', 1);
define('JPATH_BASE', realpath(dirname(__FILE__) . '/../..'));
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';

$user = $_POST["user"];
$url = $_POST["url"];
$command = $_POST["command"];

if ($command === 'urlplus') {

/* ???????????????????????????????????????????????? */

}

if ($command === 'urledit') {
    $object = new stdClass();
    $object->title = $user;
    $object->alias = $url;
    $object->path = $url;
    $object->modified_user_id = 419;
    $object->modified_time = null;

    $result = JFactory::getDbo()->updateObject('#__categories', $object, 'title');
}

Часть, в которой вносятся изменения, работает. Нужно сделать часть, которая создает новую категорию. Нашел пример, но он не работает.

Совет по решению задачи о создании категории с фронтенда в Joomla 4.

К этой задаче можно подойти несколькими разными способами. Я просто хотел бы дать краткую версию того, как создается новая Категория в Joomla 4 - content (не большая разница с Joomla 3 на самом деле). Кроме моего примера ниже, вы также должны учитывать дополнительные, важные шаги безопасности в коде, такие как проверка CSRF при POST запросе, например, также extension_name, откуда мы отправляем запрос, и может быть дополнительная обработка исключений в фильтрах. Так что эти коды должны/могут быть улучшены, но в основном это работает следующим образом) :

Я бы предложил вам создать свой собственный класс для этого, как я сделал в своём тесте этих методов (в специальном модуле).

В самом верху php файла мы не должны забыть включить базовые классы Joomla, которые мы будем использовать.

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;

1. Проверка разрешений пользователя на создание новой категории

В первый метод добавлена проверка, действительно ли у пользователя есть разрешение на создание новой категории. (Это проверяется таким же образом в контроллере категорий в Joomla 4)

/**
 * Метод проверки возможности добавления новой записи.
 *
 * @param   array  $data  Массив входных данных.
 *   мы должны включить $this->input->get('extension', 'com_content');
 *   я просто жестко закодировал com_content здесь для тестирования.
 *
 * @return  boolean
 *
 * @since   1.6
 */
protected function allowAdd()
{
    $app = Factory::getApplication();
    $user = $app->getIdentity();
    $contentExtension = 'com_content';

    return ($user->authorise('core.create', $contentExtension) || count($user->getAuthorisedCategories($contentExtension, 'core.create')));
}

2. Создание метода для проверки разрешений, подготовке и записи данных в базу данных

Создается метод addCategory(), который использует проверку разрешений, подготавливает данные из входных данных (POST-запрос) и вызывает сохранение данных в базе данных.

public static function addCategory()
{
    if ((new self)->allowAdd()) {
        $input = Factory::getApplication()->input;
        $data = array();
        $data['title'] = $input->get('categoryname', '');
        $data['alias'] = $input->get('categoryalias', '');
        $data['extension'] = 'com_content';
        $data['parent_id'] = 1;

        (new self)->createCategory($data);
        return true;
    } 
    else {
        Factory::getApplication()->enqueueMessage(Text::_('MY_COMPONENT_YOU_DO_NOT_HAVE_PERMISSION'), 'error');
    }
}

3. Создание метода для вызова модель из компонента Categories в Joomla 4

Добавляется метод createCategory(), который вызывает модель из компонента Categories в Joomla и использует его метод для сохранения новых данных.

protected function createCategory($data) 
{        
    $app = Factory::getApplication();
    $model = $app->bootComponent('com_categories')
    ->getMVCFactory()->createModel('Category', 'Administrator', ['ignore_request' => true]);

    $model->save($data);
}

Перевод с английского:
joomla.stackexchange.com

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню