Skip to content

Commit

Permalink
Merge branch 'release/9.0.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianstein committed Nov 22, 2022
2 parents 0fb589e + 23d90d0 commit 954a37c
Show file tree
Hide file tree
Showing 96 changed files with 3,978 additions and 2,068 deletions.
2 changes: 1 addition & 1 deletion .ddev/config.yaml
@@ -1,7 +1,7 @@
name: in2studyfinder
type: php
docroot: .build/public
php_version: "7.4"
php_version: "8.0"
webserver_type: apache-fpm
router_http_port: "80"
router_https_port: "443"
Expand Down
17 changes: 17 additions & 0 deletions .github/hooks/pre-commit
@@ -0,0 +1,17 @@
#!/bin/bash

# This is a git pre-commit hook that prevents a commit from being created if the code style isn't proper

# first we get everything we need to check, which are the staged changes
CHANGES=$(git diff --name-status --cached)

# if the changelist contains .php files, run php-cs-fixer in the PHP container
if echo "$CHANGES" | grep -q -E "^[AMCR].+(\.php)$"; then
echo "Running PHP QA checks..."
ddev exec -s web .build/bin/phpcs
ddev exec -s web .build/bin/phpmd Classes/ ansi .phpmd.xml

if [[ $? -ne 0 ]]; then
exit 1
fi
fi
18 changes: 18 additions & 0 deletions .github/hooks/setup.sh
@@ -0,0 +1,18 @@
#!/bin/sh

if [ -e .git/hooks/pre-commit ];
then
PRE_COMMIT_EXISTS=1
else
PRE_COMMIT_EXISTS=0
fi

cp ./.github/hooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

if [ "$PRE_COMMIT_EXISTS" = 0 ];
then
echo "Pre-commit git hook is installed!"
else
echo "Pre-commit git hook is updated!"
fi
20 changes: 20 additions & 0 deletions .phpcs.xml
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="PHPCS ruleset"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd"
>
<description>Test Classes and Tests. Config optimized for local CLO and CI/CD.</description>

<rule ref="PHPCompatibility"/>
<rule ref="PSR12"/>

<file>Classes</file>

<config name="testVersion" value="7.4-"/>

<arg name="extensions" value="php" />
<arg name="basepath" value="."/>
<arg name="colors"/>
<arg name="parallel" value="75"/>
<arg value="nps"/>
</ruleset>
31 changes: 31 additions & 0 deletions .phpmd.xml
@@ -0,0 +1,31 @@
<?xml version="1.0"?>
<ruleset name="PHPMD ruleset"
xmlns="http://pmd.sf.net/ruleset/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
>
<description>
Adapted the phpmd default config.
* Import all rule sets
* Allow variables as long as 25 chars
</description>

<rule ref="rulesets/codesize.xml" />
<rule ref="rulesets/controversial.xml" />
<rule ref="rulesets/design.xml" />
<rule ref="rulesets/naming.xml">
<exclude name="LongVariable" />
</rule>
<rule ref="rulesets/naming.xml/LongVariable">
<properties>
<property name="maximum" value="26" />
</properties>
</rule>
<rule ref="rulesets/unusedcode.xml" />
<rule ref="rulesets/cleancode.xml">
<exclude name="StaticAccess" />
<exclude name="ElseExpression" />
<exclude name="StaticAccess"/>
</rule>
</ruleset>
202 changes: 51 additions & 151 deletions Classes/Controller/BackendController.php
Expand Up @@ -4,42 +4,30 @@

namespace In2code\In2studyfinder\Controller;

use In2code\In2studyfinder\Domain\Model\StudyCourse;
use In2code\In2studyfinder\Domain\Repository\StudyCourseRepository;
use In2code\In2studyfinder\Domain\Service\CourseService;
use In2code\In2studyfinder\Service\ExportService;
use In2code\In2studyfinder\Utility\ExtensionUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
use TYPO3\CMS\Core\Messaging\AbstractMessage;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
use TYPO3\CMS\Extbase\Reflection\ReflectionService;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;

/**
* StudyCourseController
*
* @SuppressWarnings(PHPMD.LongVariable)
*/
class BackendController extends AbstractController
{
/**
* @var ReflectionService
*/
protected $reflectionService;
protected CourseService $courseService;

/**
* @var StudyCourseRepository
*/
protected $studyCourseRepository;

public function initializeAction()
public function __construct(StudyCourseRepository $studyCourseRepository, CourseService $courseService)
{
parent::initializeAction();

$this->reflectionService = GeneralUtility::makeInstance(ReflectionService::class);
$this->studyCourseRepository = $this->setStudyCourseRepository();
$this->studyCourseRepository = $studyCourseRepository;
$this->courseService = $courseService;
}

/**
Expand All @@ -50,32 +38,36 @@ public function listAction(): void
$this->validateSettings();

$recordLanguage = 0;
$propertyArray = [];

if ($this->request->hasArgument('recordLanguage')) {
$recordLanguage = (int)$this->request->getArgument('recordLanguage');
}

$studyCourses = $this->getStudyCoursesForExportList($recordLanguage);
$studyCourses =
$this->studyCourseRepository->findAllForExport(
$recordLanguage,
(bool)($this->settings['backend']['export']['includeDeleted'] ?? false),
(bool)($this->settings['backend']['export']['includeHidden'] ?? false)
);

$possibleExportDataProvider = $this->getPossibleExportDataProvider();
$propertyArray = [];

if ($studyCourses !== null && empty($studyCourses)) {
if (empty($studyCourses)) {
$this->addFlashMessage(
LocalizationUtility::translate('messages.noCourses.body', 'in2studyfinder'),
LocalizationUtility::translate('messages.noCourses.title', 'in2studyfinder'),
AbstractMessage::WARNING
);
} else {
$this->getFullPropertyList(
$propertyArray,
$this->reflectionService->getClassSchema(
$this->studyCourseRepository->findOneByDeleted(0)
)->getProperties()
);
$propertyArray =
$this->courseService->getCourseProperties(
$studyCourses[0],
$this->settings['backend']['export']['excludedPropertiesForExport'] ?? []
);
}

$itemsPerPage = $this->settings['pagination']['itemsPerPage'];
$itemsPerPage = $this->settings['pagination']['itemsPerPage'] ?? 10;

if ($this->request->hasArgument('itemsPerPage')) {
$itemsPerPage = $this->request->getArgument('itemsPerPage');
Expand All @@ -92,6 +84,34 @@ public function listAction(): void
);
}

/**
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
*/
public function exportAction(
string $exporter,
int $recordLanguage,
array $selectedProperties,
array $courseList
): void {
if (empty($selectedProperties) || empty($courseList)) {
$this->addFlashMessage(
LocalizationUtility::translate('messages.notAllRequiredFieldsSet.body', 'in2studyfinder'),
LocalizationUtility::translate('messages.notAllRequiredFieldsSet.title', 'in2studyfinder'),
AbstractMessage::ERROR
);

$this->forward('list');
}

$courses = $this->studyCourseRepository->findByUidsAndLanguage($courseList, (int)$recordLanguage);

$exportService =
GeneralUtility::makeInstance(ExportService::class, $exporter, $selectedProperties, $courses->toArray());

$exportService->export();
}

protected function getSysLanguages(): array
{
$sysLanguages = [
Expand All @@ -118,49 +138,14 @@ protected function getSysLanguages(): array
}

/**
* @param int $languageUid
* @return array|null
*/
protected function getStudyCoursesForExportList(int $languageUid = 0)
{
$queryBuilder =
GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(StudyCourse::TABLE);
$includeDeleted = (int)$this->settings['backend']['export']['includeDeleted'];
$includeHidden = (int)$this->settings['backend']['export']['includeHidden'];
$storagePid = (int)$this->settings['storagePid'];

if ($includeDeleted) {
$queryBuilder->getRestrictions()->removeByType(DeletedRestriction::class);
}

if ($includeHidden) {
$queryBuilder->getRestrictions()->removeByType(HiddenRestriction::class);
}

$records = $queryBuilder
->select('uid', 'l10n_parent', 'title', 'hidden', 'deleted')
->from(StudyCourse::TABLE)
->where(
$queryBuilder->expr()->eq(
'sys_language_uid',
$queryBuilder->createNamedParameter($languageUid, \PDO::PARAM_INT)
),
$queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($storagePid, \PDO::PARAM_INT))
)
->orderBy('title')
->execute()->fetchAll();

return $records;
}

/**
* @return array
* @SuppressWarnings(PHPMD.Superglobals)
*/
public function getPossibleExportDataProvider(): array
protected function getPossibleExportDataProvider(): array
{
$possibleDataProvider = [];

if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['in2studyfinder']['exportTypes'])
if (
isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['in2studyfinder']['exportTypes'])
&& is_array($GLOBALS['TYPO3_CONF_VARS']['EXT']['in2studyfinder']['exportTypes'])
) {
foreach ($GLOBALS['TYPO3_CONF_VARS']['EXT']['in2studyfinder']['exportTypes'] as $providerName => $providerClass) {
Expand All @@ -179,91 +164,6 @@ public function getPossibleExportDataProvider(): array
return $possibleDataProvider;
}

/**
* @param string $exporter
* @param integer $recordLanguage
* @param array $selectedProperties
* @param array $courseList
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
*/
public function exportAction(
string $exporter,
int $recordLanguage,
array $selectedProperties,
array $courseList
): void {
if (empty($selectedProperties) || empty($courseList)) {
$this->addFlashMessage(
LocalizationUtility::translate('messages.notAllRequiredFieldsSet.body', 'in2studyfinder'),
LocalizationUtility::translate('messages.notAllRequiredFieldsSet.title', 'in2studyfinder'),
AbstractMessage::ERROR
);

$this->forward('list');
}

$courses = $this->studyCourseRepository->findByUidsAndLanguage($courseList, (int)$recordLanguage);

$exportService =
GeneralUtility::makeInstance(ExportService::class, $exporter, $selectedProperties, $courses->toArray());

$exportService->export();
}

/**
* @param $propertyArray
* @param $objectProperties
*/
protected function getFullPropertyList(
&$propertyArray,
$objectProperties
): void {
foreach ($objectProperties as $propertyName => $propertyInformation) {
if (!in_array($propertyName, $this->settings['backend']['export']['excludedPropertiesForExport'])) {
$elementType = $propertyInformation->getElementType();
$type = $propertyInformation->getType();

if ($type === ObjectStorage::class) {
if (class_exists($elementType)) {
$this->getFullPropertyList(
$propertyArray[$propertyName],
$this->reflectionService->getClassSchema($elementType)
->getProperties()
);
}
} else {
if (class_exists($type)) {
$this->getFullPropertyList(
$propertyArray[$propertyName],
$this->reflectionService->getClassSchema($type)->getProperties()
);
} else {
$propertyArray[$propertyName] = $propertyName;
}
}
}
}
}

/**
* set the studyCourseRepository
*/
protected function setStudyCourseRepository()
{
$extendedRepositoryName = 'In2code\\In2studyfinderExtend\\Domain\\Repository\\StudyCourseRepository';

if (ExtensionUtility::isIn2studycoursesExtendLoaded()
&& class_exists($extendedRepositoryName)) {
return GeneralUtility::makeInstance($extendedRepositoryName);
}

return GeneralUtility::makeInstance(StudyCourseRepository::class);
}

/**
* @return void
*/
protected function validateSettings(): void
{
if (!isset($this->settings['storagePid']) || empty($this->settings['storagePid'])) {
Expand Down

0 comments on commit 954a37c

Please sign in to comment.