Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .ddev/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ APIVersion: v1.10.2
name: querybuilder
type: typo3
docroot: .build/public
php_version: "7.2"
php_version: "7.4"
webserver_type: nginx-fpm
router_http_port: "80"
router_https_port: "443"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
max-parallel: 4
fail-fast: false
matrix:
php: ['7.2', '7.3']
php: ['7.4']
steps:
- name: Start database server
run: |
Expand Down
32 changes: 24 additions & 8 deletions Classes/Controller/QuerybuilderController.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,35 @@

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Context\AspectInterface;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Context\UserAspect;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Http\JsonResponse;
use TYPO3\CMS\Core\Utility\GeneralUtility;

/**
* Main script class for saving query
*/
class QuerybuilderController
{

/**
* @var ConnectionPool
*/
protected $connectionPool;

/**
* @var Context
*/
protected $context;

public function __construct(ConnectionPool $connectionPool, Context $context)
{
$this->connectionPool = $connectionPool;
$this->context = $context;
}

/**
* @param ServerRequestInterface $request
* @param ResponseInterface $response
Expand All @@ -39,9 +56,9 @@ public function ajaxSaveQuery(ServerRequestInterface $request): ResponseInterfac
$result->status = 'ok';

$requestParams = $request->getQueryParams();
/** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('sys_querybuilder');
/** @var QueryBuilder $queryBuilder */
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_querybuilder');

$uid = (int)$requestParams['uid'];
if ($uid > 0 && (int)$requestParams['override'] === 1) {
$result->uid = $uid;
Expand Down Expand Up @@ -83,8 +100,7 @@ public function ajaxGetRecentQueries(ServerRequestInterface $request): ResponseI
{
$requestParams = $request->getQueryParams();
/** @var QueryBuilder $queryBuilder */
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('sys_querybuilder');
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_querybuilder');

$results = $queryBuilder
->select('uid', 'queryname', 'where_parts')
Expand All @@ -106,8 +122,8 @@ public function ajaxGetRecentQueries(ServerRequestInterface $request): ResponseI
* @return UserAspect
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
protected function getBackendUserAspect(): UserAspect
protected function getBackendUserAspect(): AspectInterface
{
return GeneralUtility::makeInstance(Context::class)->getAspect('backend.user');
return $this->context->getAspect('backend.user');
}
}
33 changes: 20 additions & 13 deletions Classes/Hooks/PageRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,17 @@
*/
class PageRenderer
{
/**
* @var \TYPO3\CMS\Core\Page\PageRenderer
*/
protected $pageRenderer;

public function __construct(\TYPO3\CMS\Core\Page\PageRenderer $pageRenderer, QueryBuilder $queryBuilder)
{
$this->pageRenderer = $pageRenderer;
$this->queryBuilder = $queryBuilder;
}

/**
* @param array $params
*
Expand All @@ -37,13 +48,11 @@ public function renderPreProcess(array $params): void
$table = $queryParams['table'] ?? '';
$route = $queryParams['route'] ?? '';
if (!empty($table) && $route === '/module/web/list') {
$pageRenderer = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Page\PageRenderer::class);
$this->pageRenderer->addInlineLanguageLabelFile('EXT:querybuilder/Resources/Private/Language/querybuilder-js.xlf');
$this->pageRenderer->addCssFile('EXT:querybuilder/Resources/Public/Css/query-builder.default.css');
$this->pageRenderer->addCssFile('EXT:querybuilder/Resources/Public/Css/custom-query-builder.css');

$pageRenderer->addInlineLanguageLabelFile('EXT:querybuilder/Resources/Private/Language/querybuilder-js.xlf');
$pageRenderer->addCssFile('EXT:querybuilder/Resources/Public/Css/query-builder.default.css');
$pageRenderer->addCssFile('EXT:querybuilder/Resources/Public/Css/custom-query-builder.css');

$pageRenderer->addRequireJsConfiguration([
$this->pageRenderer->addRequireJsConfiguration([
'paths' => [
'query-builder' => PathUtility::getAbsoluteWebPath('../typo3conf/ext/querybuilder/Resources/Public/JavaScript/query-builder.standalone'),
'query-builder/lang' => PathUtility::getAbsoluteWebPath('../typo3conf/ext/querybuilder/Resources/Public/JavaScript/Language'),
Expand All @@ -56,16 +65,14 @@ public function renderPreProcess(array $params): void
}

$query = json_decode($queryParams['query'] ?? '');
$pageRenderer->addJsInlineCode('tx_querybuilder_query', 'var tx_querybuilder_query = ' . json_encode($query) . ';');

$queryBuilder = GeneralUtility::makeInstance(QueryBuilder::class);
$this->pageRenderer->addJsInlineCode('tx_querybuilder_query', 'var tx_querybuilder_query = ' . json_encode($query) . ';');

$pageId = (int)$queryParams['id'];
$filter = $queryBuilder->buildFilterFromTca($table, $pageId);
$pageRenderer->addJsInlineCode('tx_querybuilder_filter', 'var tx_querybuilder_filter = ' . json_encode($filter) . ';');
$filter = $this->queryBuilder->buildFilterFromTca($table, $pageId);
$this->pageRenderer->addJsInlineCode('tx_querybuilder_filter', 'var tx_querybuilder_filter = ' . json_encode($filter) . ';');

$pageRenderer->loadRequireJsModule($languageModule);
$pageRenderer->loadRequireJsModule('TYPO3/CMS/Querybuilder/QueryBuilder', 'function(QueryBuilder) {
$this->pageRenderer->loadRequireJsModule($languageModule);
$this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Querybuilder/QueryBuilder', 'function(QueryBuilder) {
QueryBuilder.initialize(tx_querybuilder_query, tx_querybuilder_filter);
}');
}
Expand Down
42 changes: 37 additions & 5 deletions Classes/QueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,38 @@ class QueryBuilder
private const FORMAT_DATE = 'YYYY-MM-DD';
private const FORMAT_TIME = 'HH:mm';

/**
* @var FilterFactory
*/
protected $filterFactory;

/**
* @var PluginFactory
*/
protected $pluginFactory;

/**
* @var ValidationFactory
*/
protected $validationFactory;

/**
* @var TcaDatabaseRecord
*/
protected $formDataGroup;

public function __construct(
FilterFactory $filterFactory,
PluginFactory $pluginFactory,
ValidationFactory $validationFactory,
TcaDatabaseRecord $formDataGroup
) {
$this->filterFactory = $filterFactory;
$this->pluginFactory = $pluginFactory;
$this->validationFactory = $validationFactory;
$this->formDataGroup = $formDataGroup;
}

/**
* Build the filter configuration from TCA
*
Expand All @@ -50,7 +82,7 @@ public function buildFilterFromTca(string $table, int $pageId) : array
}
// Filter:Types: string, integer, double, date, time, datetime and boolean.
// Filter:Required: id, type, values*
$filter = GeneralUtility::makeInstance(FilterFactory::class)
$filter = $this->filterFactory
->create([
'id' => $filterField,
'type' => $this->determineFilterType($fieldConfig),
Expand Down Expand Up @@ -196,7 +228,7 @@ protected function determineAndAddExtras(Filter $filter): void
default:
}
$filter->setPlugin(
GeneralUtility::makeInstance(PluginFactory::class)
$this->pluginFactory
->create([
'identifier' => 'datetimepicker',
'configuration' => $pluginConfiguration,
Expand All @@ -205,7 +237,7 @@ protected function determineAndAddExtras(Filter $filter): void

if (!empty($pluginConfiguration['format'])) {
$filter->setValidation(
GeneralUtility::makeInstance(ValidationFactory::class)
$this->validationFactory
->create([
'format' => $pluginConfiguration['format'],
])
Expand All @@ -221,8 +253,8 @@ protected function determineAndAddExtras(Filter $filter): void
*/
protected function prepareTca(string $tableName, int $pageId) : array
{
$formDataGroup = GeneralUtility::makeInstance(TcaDatabaseRecord::class);
$formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
// TODO: check how to DI this?
$formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $this->formDataGroup);

$formDataCompilerInput = [
'tableName' => $tableName,
Expand Down
17 changes: 17 additions & 0 deletions Configuration/Services.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
services:
_defaults:
autowire: true
autoconfigure: true
public: false

T3G\Querybuilder\:
resource: '../Classes/*'

T3G\Querybuilder\Hooks\PageRenderer:
public: true;

T3G\Querybuilder\Controller\QuerybuilderController:
public: true;

T3G\Querybuilder\QueryBuilder:
public: true;
32 changes: 14 additions & 18 deletions Resources/Public/JavaScript/QueryBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ define(['jquery',
'TYPO3/CMS/Backend/Storage/Client',
'TYPO3/CMS/Backend/Modal',
'TYPO3/CMS/Backend/Notification',
'twbs/bootstrap-datetimepicker',
'TYPO3/CMS/Backend/DateTimePicker',
'query-builder'
], function ($, moment, Severity, ClientStorage, Modal, Notification) {
'use strict';
Expand All @@ -47,12 +47,6 @@ define(['jquery',
table: $('table[data-table]').data('table'),
querySelector: null,
instance: null,
plugins: {
'bt-tooltip-errors': {delay: 100},
//'sortable': { icon: 'fa fa-sort' },
'invert': {},
'filter-description': {icon: 'fa fa-info'}
},
icon: 'fa fa-sort',
// Filter:Types: string, integer, double, date, time, datetime and boolean.
// Filter:Required: id, type, values*
Expand Down Expand Up @@ -195,18 +189,20 @@ define(['jquery',
table: QueryBuilder.table
},
success: function(data) {
for (var j = 0; j < data.length; j++) {
var $query = $('<option />', {value: data[j].uid, 'data-query': data[j].where_parts}).text(data[j].queryname);
$querySelector.append($query);
}
$querySelector.on('change', function() {
var $option = $(this.options[this.selectedIndex]);
try {
QueryBuilder.instance.queryBuilder('setRules', $option.data('query'));
} catch (err) {
console.log(err.message);
if (data !== undefined) {
for (var j = 0; j < data.length; j++) {
var $query = $('<option />', {value: data[j].uid, 'data-query': data[j].where_parts}).text(data[j].queryname);
$querySelector.append($query);
}
});
$querySelector.on('change', function() {
var $option = $(this.options[this.selectedIndex]);
try {
QueryBuilder.instance.queryBuilder('setRules', $option.data('query'));
} catch (err) {
console.log(err.message);
}
});
}
}
});
};
Expand Down
10 changes: 5 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,20 +64,20 @@
]
},
"require": {
"php": ">=7.2.0",
"php": ">=7.4.0",
"ext-json": "*",
"ext-pdo": "*",
"psr/http-message": "^1.0.0",
"typo3/cms-backend": "^10.1",
"typo3/cms-core": "^10.1",
"typo3/cms-recordlist": "^10.1"
"typo3/cms-backend": "^11.0",
"typo3/cms-core": "^11.0",
"typo3/cms-recordlist": "^11.0"
},
"require-dev": {
"overtrue/phplint": "^1.1",
"bk2k/extension-helper": "^1.0",
"friendsofphp/php-cs-fixer": "^2.12",
"roave/security-advisories": "dev-master",
"typo3/testing-framework": "^5.0"
"typo3/testing-framework": "^6.0"
},
"minimum-stability": "dev",
"prefer-stable": true
Expand Down
4 changes: 2 additions & 2 deletions ext_emconf.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
'clearCacheOnLoad' => 0,
'author' => 'TYPO3 GmbH',
'author_email' => 'info@typo3.com',
'version' => '10.4.0',
'version' => '11.0.0',
'constraints' => [
'depends' => [
'typo3' => '10.0.0 - 10.5.99',
'typo3' => '11.0.0 - 11.0.99',
],
'conflicts' => [],
'suggests' => [],
Expand Down
4 changes: 1 addition & 3 deletions ext_localconf.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@
* LICENSE file that was distributed with this source code.
*/

if (!defined('TYPO3_MODE')) {
die('Access denied.');
}
defined('TYPO3_MODE') || die();

// PageRenderer Hook to add CSS and JS modules
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_pagerenderer.php']['render-preProcess'][] =
Expand Down
2 changes: 0 additions & 2 deletions ext_tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ CREATE TABLE sys_querybuilder (
queryname varchar(255) DEFAULT '' NOT NULL,
where_parts text,
user varchar(255) DEFAULT '' NOT NULL,
hidden tinyint(1) unsigned DEFAULT '0' NOT NULL,
deleted tinyint(1) unsigned DEFAULT '0' NOT NULL,

PRIMARY KEY (uid)
);