- Постановка задачи о создании категории во фронтенде Joomla 4
- Ход мыслей о том, как создать категорию из фронтенда Joomla 4
- Совет по решению задачи о создании категории с фронтенда в 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
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)