минимально запускающаяся версия компонента

This commit is contained in:
Artem Vasilev 2024-03-03 00:21:51 +03:00
parent e08f89aaef
commit f4dc0127a9
32 changed files with 761 additions and 2 deletions

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<access component="com_oauthserver">
<section name="component">
<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC"/>
<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC"/>
<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC"/>
<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC"/>
<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC"/>
<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC"/>
<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC"/>
<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC"/>
</section>
</access>

View File

@ -0,0 +1,25 @@
<?xml version="1.0"?>
<config addfieldprefix="Joomla\Component\RadicalMart\Administrator\Field">
<fieldset name="general" label="COM_RADICALMART_GENERAL">
<fieldset name="general_root" label="COM_RADICALMART_GENERAL">
<field name="legacy_mode" type="radio"
label="COM_RADICALMART_PARAMS_LEGACY_MODE"
class="btn-group btn-group-yesno"
default="1">
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
</fieldset>
</fieldset>
<fieldset name="permissions"
label="JCONFIG_PERMISSIONS_LABEL"
description="JCONFIG_PERMISSIONS_DESC">
<field name="rules" type="rules"
label="JCONFIG_PERMISSIONS_LABEL"
class="inputbox"
validate="rules"
filter="rules"
component="com_oauthserver"
section="component"/>
</fieldset>
</config>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<form>
<config>
<inlinehelp button="show"/>
</config>
<fieldset name="global">
<field name="client_name" type="text"
label="COM_OAUTHSERVER_CLIENT_FORM_CLIENT_NAME_LABEL"
description="COM_OAUTHSERVER_CLIENT_FORM_CLIENT_NAME_DESCRIPTION"
required="1"
/>
<field name="client_token"
type="text"
readonly="1"
label="COM_OAUTHSERVER_CLIENT_FORM_CLIENT_TOKEN_LABEL"
description="COM_OAUTHSERVER_CLIENT_FORM_CLIENT_TOKEN_DESCRIPTION"/>
<field name="client_id"
type="text"
readonly="1"
label="COM_OAUTHSERVER_CLIENT_FORM_CLIENT_ID_LABEL"
description="COM_OAUTHSERVER_CLIENT_FORM_CLIENT_ID_DESCRIPTION"/>
</fieldset>
</form>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<form>
<fields name="filter">
<field name="search" type="text"
label="JSEARCH_FILTER"
hint="JSEARCH_FILTER"/>
</fields>
<fields name="list">
<field name="fullordering" type="list"
label="JGLOBAL_SORT_BY"
onchange="Joomla.submitFilter(this.form);"
default="client.id DESC">
<option value="">JGLOBAL_SORT_BY</option>
<option value="client.id ASC">JGRID_HEADING_ID_ASC</option>
<option value="client.id DESC">JGRID_HEADING_ID_DESC</option>
</field>
<field name="limit" type="limitbox"
label="JGLOBAL_LIST_LIMIT"
onchange="Joomla.submitFilter(this.form);"
default="25"/>
</fields>
</form>

View File

@ -1,13 +1,38 @@
<?php
use Joomla\CMS\Component\Router\RouterFactoryInterface;
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
use Joomla\CMS\Extension\ComponentInterface;
use Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
use Joomla\CMS\Extension\Service\Provider\MVCFactory;
use Joomla\CMS\Extension\Service\Provider\RouterFactory;
use Joomla\CMS\HTML\Registry;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Webmasterskaya\Component\OauthServer\Administrator\Extension\Component;
\defined('_JEXEC') or die;
return new class implements ServiceProviderInterface {
public function register(\Joomla\DI\Container $container)
public function register(Container $container): void
{
// TODO: Implement register() method.
$container->registerServiceProvider(new MVCFactory('\\Webmasterskaya\\Component\\OauthServer'));
$container->registerServiceProvider(new ComponentDispatcherFactory('\\Webmasterskaya\\Component\\OauthServer'));
$container->registerServiceProvider(new RouterFactory('\\Webmasterskaya\\Component\\OauthServer'));
$container->set(
ComponentInterface::class,
function (Container $container) {
$component = new Component($container->get(ComponentDispatcherFactoryInterface::class));
$component->setRegistry($container->get(Registry::class));
$component->setMVCFactory($container->get(MVCFactoryInterface::class));
$component->setRouterFactory($container->get(RouterFactoryInterface::class));
return $component;
}
);
}
};

View File

@ -0,0 +1,12 @@
CREATE TABLE IF NOT EXISTS `#__webmasterskaya_oauthserver_clients`
(
`id` int unsigned NOT NULL AUTO_INCREMENT,
`client_name` varchar(150) NOT NULL,
`client_token` varchar(255) NOT NULL,
`client_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `client_token` (`client_token`),
UNIQUE KEY `client_id` (`client_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
DEFAULT COLLATE = utf8mb4_unicode_ci;

View File

@ -0,0 +1,17 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\Controller;
use Joomla\CMS\MVC\Controller\FormController;
class ClientController extends FormController
{
/**
* The prefix to use with controller messages.
*
* @var string
*
* @since 1.0.0
*/
protected $text_prefix = 'COM_OAUTHSERVER_CLIENT';
}

View File

@ -0,0 +1,17 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\Controller;
use Joomla\CMS\MVC\Controller\BaseController;
class DisplayController extends BaseController
{
/**
* The default view.
*
* @var string
*
* @since 1.0.0
*/
protected $default_view = 'clients';
}

View File

@ -0,0 +1,10 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\Dispatcher;
use Joomla\CMS\Dispatcher\ComponentDispatcher;
use Joomla\CMS\MVC\Controller\BaseController;
class Dispatcher extends ComponentDispatcher
{
}

View File

@ -0,0 +1,40 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\Model;
use Joomla\CMS\Form\Form;
use Joomla\CMS\MVC\Model\AdminModel;
class ClientModel extends AdminModel
{
/**
* Model context string.
*
* @var string
*
* @since 1.0.0
*/
protected string $context = 'com_oauthserver.client';
/**
* Client item.
*
* @var array|null
*
* @since 1.0.0
*/
protected ?array $_item = null;
/**
* @param array $data
* @param bool $loadData
* @return \Joomla\CMS\Form\Form|bool
* @throws \Exception
* @since version
*/
public function getForm($data = [], $loadData = true): Form|bool
{
return $this->loadForm('com_oauthserver.client', 'client',
['control' => 'jform', 'load_data' => $loadData]);
}
}

View File

@ -0,0 +1,116 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\Model;
use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Database\ParameterType;
class ClientsModel extends ListModel
{
/**
* Model context string.
*
* @var string
*
* @since 1.0.0
*/
protected $context = 'com_oauthserver.clients';
/**
* Constructor.
*
* @param array $config An optional associative array of configuration settings.
* @param MVCFactoryInterface|null $factory The factory.
*
* @throws \Exception
*
* @since 1.0.0
*/
public function __construct($config = [], MVCFactoryInterface $factory = null)
{
// Add the ordering filtering fields whitelist
if (empty($config['filter_fields'])) {
$config['filter_fields'] = [
'id', 'client.id'
];
}
parent::__construct($config, $factory);
}
/**
* Method to auto-populate the model state.
*
* @param string $ordering An optional ordering field.
* @param string $direction An optional direction (asc|desc).
*
* @throws \Exception
*
* @since 1.0.0
*/
protected function populateState($ordering = null, $direction = null): void
{
$app = Factory::getApplication();
// Adjust the context to support modal layouts.
if ($layout = $app->input->get('layout')) {
$this->context .= '.' . $layout;
}
// List state information
$ordering = empty($ordering) ? 'client.id' : $ordering;
parent::populateState($ordering, $direction);
}
/**
* Method to get a store id based on model configuration state.
*
* @param string $id A prefix for the store id.
*
* @return string A store id.
*
* @since 1.0.0
*/
protected function getStoreId($id = ''): string
{
$id .= ':' . $this->getState('filter.search');
return parent::getStoreId($id);
}
/**
* Method to get a DatabaseQuery object for retrieving the data set from a database.
*
* @return \Joomla\Database\QueryInterface A QueryInterface object to retrieve the data set.
*
* @throws \Exception
*
* @since 1.0.0
*/
protected function getListQuery(): \Joomla\Database\QueryInterface
{
$db = $this->getDatabase();
$query = $db->getQuery(true);
$query->select(['client.id', 'client.client_name', 'client.client_token', 'client.client_id',])
->from($db->qn('#__webmasterskaya_oauthserver_clients', 'client'));
// Filter by search state
$search = $this->getState('filter.search');
if (!empty($search)) {
$query->where('client.name LIKE :search')
->bind(':search', $search, ParameterType::STRING);
}
// Add the list ordering clause
$ordering = $this->state->get('list.ordering', 'client.id');
$direction = $this->state->get('list.direction', 'desc');
$query->order($db->escape($ordering) . ' ' . $db->escape($direction));
return $query;
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\Table;
use Joomla\CMS\Table\Table;
use Joomla\Database\DatabaseDriver;
class ClientTable extends Table
{
/**
* Constructor.
*
* @param DatabaseDriver $db Database connector object
*
* @since 1.0.0
*/
public function __construct(DatabaseDriver $db)
{
parent::__construct('#__webmasterskaya_oauthserver_clients', 'id', $db);
}
}

View File

@ -0,0 +1,131 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\View\Client;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\Object\CMSObject;
use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarFactoryInterface;
use Joomla\CMS\Toolbar\ToolbarHelper;
class HtmlView extends \Joomla\CMS\MVC\View\HtmlView
{
/**
* Model state variables.
*
* @var \Joomla\CMS\Object\CMSObject
*
* @since 1.0.0
*/
protected CMSObject $state;
/**
* Form object.
*
* @var \Joomla\CMS\Form\Form
*
* @since 1.0.0
*/
protected Form $form;
/**
* The active item.
*
* @var object
*
* @since 1.0.0
*/
protected object $item;
/**
* Execute and display a template script.
*
* @param string $tpl The name of the template file to parse.
*
* @throws \Exception
*
* @since 1.0.0
*/
public function display($tpl = null): void
{
$this->state = $this->get('State');
$this->form = $this->get('Form');
$this->item = $this->get('Item');
// Check for errors
if (count($errors = $this->get('Errors'))) {
throw new GenericDataException(implode('\n', $errors), 500);
}
// Hard set layout
$this->setLayout('edit');
// Add title and toolbar
$this->addToolbar();
parent::display($tpl);
}
/**
* Add title and toolbar.
*
* @throws \Exception
* @since 1.0.0
*/
protected function addToolbar(): void
{
// Hide main menu
Factory::getApplication()->input->set('hidemainmenu', true);
$canDo = ContentHelper::getActions('com_oauthserver', 'client');
$user = $this->getCurrentUser();
$toolbar = Toolbar::getInstance('toolbar');
// Set page title
$isNew = ($this->item->id == 0);
$title = ($isNew) ? Text::_('COM_OAUTHSERVER_CLIENT_ADD') : Text::_('COM_OAUTHSERVER_CLIENT_EDIT');
ToolbarHelper::title(Text::_('COM_OAUTHSERVER') . ': ' . $title, 'edit');
if ($isNew && (count($user->getAuthorisedCategories('com_oauthserver', 'core.create')) > 0)) {
$toolbar->apply('client.apply');
$dropdown = $toolbar->dropdownButton('save-group');
$dropdown->configure(
function (Toolbar $actions) use ($user) {
$actions->save('client.save');
$actions->save2new('client.save2new');
}
);
} else {
$itemEditable = $canDo->get('core.edit');
if ($itemEditable) {
$toolbar->apply('client.apply');
}
$dropdown = $toolbar->dropdownButton('save-group');
$dropdown->configure(
function (Toolbar $childBar) use ($itemEditable, $canDo) {
if ($itemEditable) {
$childBar->save('client.save');
if ($canDo->get('core.create')) {
$childBar->save2new('client.save2new');
}
$childBar
->standardButton('save-reset', 'COM_OAUTHSERVER_CLIENT_SAVE_AND_RESET')
->task('client.save2reset')
->formValidation(true);
}
}
);
}
$toolbar->cancel('client.cancel');
ToolbarHelper::inlinehelp();
}
}

View File

@ -0,0 +1,142 @@
<?php
namespace Webmasterskaya\Component\OauthServer\Administrator\View\Clients;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\Object\CMSObject;
use Joomla\CMS\Pagination\Pagination;
use Joomla\CMS\Toolbar\ToolbarFactoryInterface;
use Joomla\CMS\Toolbar\ToolbarHelper;
class HtmlView extends \Joomla\CMS\MVC\View\HtmlView
{
/**
* Model state variables.
*
* @var \Joomla\CMS\Object\CMSObject
*
* @since 1.0.0
*/
protected CMSObject $state;
/**
* An array of items.
*
* @var array
*
* @since 1.0.0
*/
protected array $items;
/**
* Pagination object.
*
* @var \Joomla\CMS\Pagination\Pagination
*
* @since 1.0.0
*/
protected Pagination $pagination;
/**
* Form object for search filters.
*
* @var \Joomla\CMS\Form\Form;
*
* @since 1.0.0
*/
public Form $filterForm;
/**
* The active search filters.
*
* @var array
*
* @since 1.0.0
*/
public array $activeFilters;
/**
* Is this view an Empty State.
*
* @var bool
*
* @since 1.0.0
*/
private bool $isEmptyState = false;
/**
* Display the view.
*
* @param string $tpl The name of the template file to parse.
*
* @throws \Exception
*
* @since 1.0.0
*/
public function display($tpl = null): void
{
$this->state = $this->get('State');
$this->items = $this->get('Items');
$this->pagination = $this->get('Pagination');
$this->filterForm = $this->get('FilterForm');
$this->activeFilters = $this->get('ActiveFilters');
// Set empty state
if (empty($this->items) && $this->isEmptyState = $this->get('IsEmptyState')) {
$this->setLayout('emptystate');
}
// Check for errors
if (count($errors = $this->get('Errors'))) {
throw new GenericDataException(implode('\n', $errors), 500);
}
if ($this->getLayout() !== 'modal') {
// Add title and toolbar
$this->addToolbar();
}
// Set status field value
$this->filterForm->setValue('status', null, $this->state->get('filter.status'));
parent::display($tpl);
}
/**
* Add title and toolbar.
*
* @since 1.0.0
*/
protected function addToolbar(): void
{
$canDo = ContentHelper::getActions('com_oauthserver', 'clients');
$user = $this->getCurrentUser();
$toolbar = Factory::getContainer()->get(ToolbarFactoryInterface::class)->createToolbar('toolbar');
// Set page title
ToolbarHelper::title(Text::_('COM_OAUTHSERVER') . ': ' . Text::_('COM_OAUTHSERVER_CLIENTS'));
// Add create button
if ($canDo->get('core.create')
|| \count($user->getAuthorisedCategories('com_oauthserver', 'core.create')) > 0) {
$toolbar->addNew('client.add');
}
// Add actions dropdown
if (!$this->isEmptyState) {
// TODO: Что мы тут в дропдаун пихаем?
}
// Add preferences button
if ($user->authorise('core.admin', 'com_oauthserver')
|| $user->authorise('core.options', 'com_oauthserver')) {
$toolbar->preferences('com_oauthserver');
}
}
}

View File

@ -0,0 +1,49 @@
<?php
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
defined('_JEXEC') or die;
/**
* @var \Webmasterskaya\Component\OauthServer\Administrator\View\Client\HtmlView $this
*/
$wa = $this->document->getWebAssetManager();
$wa->useScript('keepalive')
->useScript('form.validate');
?>
<form action="<?php echo Route::_('index.php?option=com_oauthserver&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="client-form" aria-label="<?php echo Text::_('COM_OAUTHSERVER_CLIENT_FORM_' . ((int) $this->item->id === 0 ? 'NEW' : 'EDIT'), true); ?>" class="form-validate">
<?php echo LayoutHelper::render('joomla.edit.title_alias', $this); ?>
<div class="main-card">
<?php echo HTMLHelper::_('uitab.startTabSet', 'myTab', ['active' => 'details', 'recall' => true, 'breakpoint' => 768]); ?>
<?php echo HTMLHelper::_('uitab.addTab', 'myTab', 'details', Text::_('COM_BANNERS_BANNER_DETAILS')); ?>
<div class="row">
<div class="col-12">
<fieldset id="fieldset-publishingdata" class="options-form">
<legend><?php echo Text::_('COM_OAUTHSERVER_CLIENT'); ?></legend>
<div>
<?php echo $this->form->renderFieldset('global');?>
</div>
</fieldset>
</div>
</div>
<?php echo HTMLHelper::_('uitab.endTab'); ?>
<?php echo HTMLHelper::_('uitab.endTabSet'); ?>
</div>
<input type="hidden" name="task" value="">
<?php echo HTMLHelper::_('form.token'); ?>
</form>

View File

@ -0,0 +1,2 @@
<?php

View File

@ -0,0 +1,27 @@
<?php
use Joomla\CMS\Layout\LayoutHelper;
\defined('_JEXEC') or die;
/**
* @var \Webmasterskaya\Component\OauthServer\Administrator\View\Clients\HtmlView $this
*/
$displayData = [
'textPrefix' => 'COM_OAUTHSERVER_ORDERS',
'icon' => 'icon-copy',
];
$user = $this->getCurrentUser();
if ($user->authorise('core.create', 'com_oauthserver')
|| count($user->getAuthorisedCategories('com_oauthserver', 'core.create')) > 0
|| $user->authorise('product.create', 'com_oauthserver')
|| count($user->getAuthorisedCategories('com_oauthserver', 'client.create')) > 0
) {
$displayData['createURL'] = 'index.php?option=com_oauthserver&task=client.add';
}
echo LayoutHelper::render('joomla.content.emptystate', $displayData);

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<name>COM_OAUTHSERVER</name>
<description>COM_OAUTHSERVER_DESCRIPTION</description>
<author>Artem Vasilev</author>
<authorEmail>kern.usr@gmial.com</authorEmail>
<authorUrl>https://webmasterskaya.xyz</authorUrl>
<creationDate>March 2024</creationDate>
<copyright>Copyright (C) 2024 Webmasterskaya. All rights reserved.</copyright>
<license>MIT; see LICENSE.txt</license>
<version>RELEASE_VERSION</version>
<namespace path="src">Webmasterskaya\Component\OauthServer</namespace>
<install>
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update>
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<files folder="site">
<folder>forms</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<languages folder="site">
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.ini</language>
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.sys.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.sys.ini</language>
</languages>
<administration>
<menu>COM_OAUTHSERVER</menu>
<submenu>
<menu
link="option=com_oauthserver"
view="clients"
img="class:clients"
alt="Oauth Server/Clients"
>
com_oauthserver_clients
</menu>
</submenu>
<files folder="administrator">
<folder>forms</folder>
<folder>services</folder>
<folder>sql</folder>
<folder>src</folder>
<folder>tmpl</folder>
<filename>access.xml</filename>
<filename>config.xml</filename>
</files>
<languages folder="admin">
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.ini</language>
<language tag="en-GB">language/en-GB/en-GB.com_oauthserver.sys.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_oauthserver.sys.ini</language>
</languages>
</administration>
</extension>

View File

View File

View File