Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 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
32 changes: 16 additions & 16 deletions Classes/Controller/GalleryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,11 @@
class GalleryController extends ActionController
{
protected ImageGalleryRepository $galleryRepository;

protected DemandFactory $demandFactory;

protected OrderFactory $orderFactory;
protected CategoryRepository $categoryRepository;

protected array $configuration = array();

protected $settings = [];

protected array $allowedColumns = [
Expand All @@ -48,32 +46,38 @@ class GalleryController extends ActionController
'uid',
];

public function initializeAction(): void
{
$this->galleryRepository = GeneralUtility::makeInstance(ImageGalleryRepository::class);
$this->orderFactory = GeneralUtility::makeInstance(OrderFactory::class);
$this->demandFactory = GeneralUtility::makeInstance(DemandFactory::class);
public function __construct(
ImageGalleryRepository $galleryRepository,
DemandFactory $demandFactory,
OrderFactory $orderFactory,
CategoryRepository $categoryRepository
) {
$this->galleryRepository = $galleryRepository;
$this->demandFactory = $demandFactory;
$this->orderFactory = $orderFactory;
$this->categoryRepository = $categoryRepository;
}

/**
* @return void|string
*/
public function listAction()
public function listAction(): \Psr\Http\Message\ResponseInterface
{


if (!isset($this->settings['imagesPerRow'])) {
return '<strong style="color: red">Please save your plugin settings in the BE beforehand.</strong>';
return $this->htmlResponse('<strong style="color: red">Please save your plugin settings in the BE beforehand.</strong>');
}

$images = $this->galleryRepository->findByDemand($this->getDemand(), (array)$this->getOrderings(),0,0);
$identifiers = GeneralUtility::trimExplode(',', $this->settings['categories'], TRUE);
$categories = $this->getCategoryRepository()->findByIdentifiers($identifiers);
$categories = $this->categoryRepository->findByIdentifiers($identifiers);
// Assign template variables
$this->view->assign('settings', $this->settings);
$this->view->assign('data', $this->configurationManager->getcontentObject()->data);
$this->view->assign('data', $this->request->getAttribute('currentContentObject')->data);
$this->view->assign('images', $images);
$this->view->assign('categories', $categories);
return $this->htmlResponse();
}

protected function getOrderings(): \Fab\NaturalGallery\Persistence\Order
Expand All @@ -83,10 +87,6 @@ protected function getOrderings(): \Fab\NaturalGallery\Persistence\Order

}

protected function getCategoryRepository(): CategoryRepository
{
return GeneralUtility::makeInstance(CategoryRepository::class);
}

protected function getDemand(): array
{
Expand Down
37 changes: 21 additions & 16 deletions Classes/Domain/Repository/CategoryRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,30 +35,35 @@ class CategoryRepository
* Initialize Repository
*/
protected string $tableName = 'sys_category';
public function __construct(private \TYPO3\CMS\Core\Database\ConnectionPool $connectionPool)
{
}

/**
* @throws Exception
* @throws DBALException
*/
public function findByIdentifiers(array $identifiers): array|QueryResultInterface
{
$result = null;
if (!empty($identifiers)) {
$queryBuilder = $this->getQueryBuilder();
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder->select('*')
->from($this->tableName)
->where(
$queryBuilder->expr()->in('uid', $identifiers)
);
$result = $queryBuilder->execute()->fetchAllAssociative();
if (empty($identifiers)) {
return [];
}
return $result;

$queryBuilder = $this->getQueryBuilder();
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder->select('*')
->from($this->tableName)
->where(
$queryBuilder->expr()->in('uid', $identifiers)
);
$result = $queryBuilder->execute()->fetchAllAssociative();

return $result ?? [];
}

public function findFileCategories($uid): array
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_metadata');
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_file_metadata');
$queryBuilder->getRestrictions()->removeAll();
$results = [];
if ($uid){
Expand All @@ -72,9 +77,9 @@ public function findFileCategories($uid): array
$queryBuilder->expr()->eq('sys_category.uid', 'sys_category_record_mm.uid_local')
)
->where(
$queryBuilder->expr()->eq('sys_category_record_mm.uid_foreign', $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('sys_category_record_mm.tablenames', $queryBuilder->createNamedParameter('sys_file_metadata', \PDO::PARAM_STR)) ,
$queryBuilder->expr()->eq('sys_category_record_mm.fieldname', $queryBuilder->createNamedParameter('categories', \PDO::PARAM_STR))
$queryBuilder->expr()->eq('sys_category_record_mm.uid_foreign', $queryBuilder->createNamedParameter($uid, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)),
$queryBuilder->expr()->eq('sys_category_record_mm.tablenames', $queryBuilder->createNamedParameter('sys_file_metadata', \TYPO3\CMS\Core\Database\Connection::PARAM_STR)) ,
$queryBuilder->expr()->eq('sys_category_record_mm.fieldname', $queryBuilder->createNamedParameter('categories', \TYPO3\CMS\Core\Database\Connection::PARAM_STR))
);
$results = $query->execute()->fetchAllAssociative();

Expand All @@ -86,7 +91,7 @@ public function findFileCategories($uid): array
protected function getQueryBuilder(): QueryBuilder
{
/** @var ConnectionPool $connectionPool */
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
$connectionPool = $this->connectionPool;
return $connectionPool->getQueryBuilderForTable($this->tableName);
}
}
47 changes: 9 additions & 38 deletions Classes/Domain/Repository/ImageGalleryRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ class ImageGalleryRepository
protected string $tableName = 'sys_file';

protected array $settings;
public function __construct(private \TYPO3\CMS\Core\Database\ConnectionPool $connectionPool)
{
}

public function getDefaultData(string $field):string
{
Expand Down Expand Up @@ -102,60 +105,28 @@ public function findByDemand(array|Matcher $demand = [], array $orderings = [],
'sys_file',
'sys_file_metadata',
'sys_file_metadata',
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('sys_file.uid', 'sys_file_metadata.file'),
$queryBuilder->expr()->lte('sys_file_metadata.t3ver_state', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('sys_file_metadata.t3ver_wsid', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('sys_file_metadata.t3ver_oid', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('sys_file_metadata.t3ver_state', $queryBuilder->createNamedParameter(4, \PDO::PARAM_INT))
),
$queryBuilder->expr()->in('sys_file_metadata.sys_language_uid', [0, -1])
)
$queryBuilder->expr()->and($queryBuilder->expr()->eq('sys_file.uid', 'sys_file_metadata.file'), $queryBuilder->expr()->lte('sys_file_metadata.t3ver_state', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->eq('sys_file_metadata.t3ver_wsid', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->or($queryBuilder->expr()->eq('sys_file_metadata.t3ver_oid', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->eq('sys_file_metadata.t3ver_state', $queryBuilder->createNamedParameter(4, \TYPO3\CMS\Core\Database\Connection::PARAM_INT))), $queryBuilder->expr()->in('sys_file_metadata.sys_language_uid', [0, -1]))
)
->leftJoin(
'sys_file_metadata',
'sys_category_record_mm',
'sys_category_record_mm0',
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('sys_file_metadata.uid', 'sys_category_record_mm0.uid_foreign'),
$queryBuilder->expr()->eq('sys_category_record_mm0.tablenames', $queryBuilder->createNamedParameter('sys_file_metadata')),
$queryBuilder->expr()->eq('sys_category_record_mm0.fieldname', $queryBuilder->createNamedParameter('categories'))
)
$queryBuilder->expr()->and($queryBuilder->expr()->eq('sys_file_metadata.uid', 'sys_category_record_mm0.uid_foreign'), $queryBuilder->expr()->eq('sys_category_record_mm0.tablenames', $queryBuilder->createNamedParameter('sys_file_metadata')), $queryBuilder->expr()->eq('sys_category_record_mm0.fieldname', $queryBuilder->createNamedParameter('categories')))
)
->leftJoin(
'sys_category_record_mm0',
'sys_category',
'sys_category0',
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('sys_category_record_mm0.uid_local', 'sys_category0.uid'),
$queryBuilder->expr()->eq('sys_category0.deleted', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->lte('sys_category0.t3ver_state', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('sys_category0.t3ver_wsid', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('sys_category0.t3ver_oid', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('sys_category0.t3ver_state', $queryBuilder->createNamedParameter(4, \PDO::PARAM_INT))
),
$queryBuilder->expr()->eq('sys_category0.hidden', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->lte('sys_category0.starttime', $queryBuilder->createNamedParameter($timestamp, \PDO::PARAM_INT)),
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('sys_category0.endtime', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->gt('sys_category0.endtime', $queryBuilder->createNamedParameter($timestamp, \PDO::PARAM_INT))
),
$queryBuilder->expr()->in('sys_category0.sys_language_uid', [0, -1])
)
$queryBuilder->expr()->and($queryBuilder->expr()->eq('sys_category_record_mm0.uid_local', 'sys_category0.uid'), $queryBuilder->expr()->eq('sys_category0.deleted', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->lte('sys_category0.t3ver_state', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->eq('sys_category0.t3ver_wsid', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->or($queryBuilder->expr()->eq('sys_category0.t3ver_oid', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->eq('sys_category0.t3ver_state', $queryBuilder->createNamedParameter(4, \TYPO3\CMS\Core\Database\Connection::PARAM_INT))), $queryBuilder->expr()->eq('sys_category0.hidden', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->lte('sys_category0.starttime', $queryBuilder->createNamedParameter($timestamp, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->or($queryBuilder->expr()->eq('sys_category0.endtime', $queryBuilder->createNamedParameter(0, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->gt('sys_category0.endtime', $queryBuilder->createNamedParameter($timestamp, \TYPO3\CMS\Core\Database\Connection::PARAM_INT))), $queryBuilder->expr()->in('sys_category0.sys_language_uid', [0, -1]))
)
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('sys_file.type', $queryBuilder->createNamedParameter(2, \PDO::PARAM_INT)),
$queryBuilder->expr()->in('sys_file.uid', (array)$uids)
)
$queryBuilder->expr()->and($queryBuilder->expr()->eq('sys_file.type', $queryBuilder->createNamedParameter(2, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)), $queryBuilder->expr()->in('sys_file.uid', (array)$uids))
)

->orderBy('sys_file.name', 'ASC');
if ($categoryConditions) {
$queryBuilder->andWhere(
$queryBuilder->expr()->eq('sys_category0.uid', $queryBuilder->createNamedParameter((int)$categoryConditions, \PDO::PARAM_INT))
$queryBuilder->expr()->eq('sys_category0.uid', $queryBuilder->createNamedParameter((int)$categoryConditions, \TYPO3\CMS\Core\Database\Connection::PARAM_INT))
);
}

Expand Down Expand Up @@ -215,7 +186,7 @@ public function findByUids(array $uids): array
protected function getQueryBuilder(): QueryBuilder
{
/** @var ConnectionPool $connectionPool */
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
$connectionPool = $this->connectionPool;
return $connectionPool->getQueryBuilderForTable($this->tableName);
}

Expand Down
7 changes: 3 additions & 4 deletions Classes/Persistence/Matcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -265,13 +265,12 @@ public function getIn(): array
/**
* @param $fieldNameAndPath
* @param $operand
* @param bool $addWildCard
* @return $this
*/
public function like($fieldNameAndPath, $operand, bool $addWildCard = true): self
public function like($fieldNameAndPath, $operand): self
{
$wildCardSymbol = $addWildCard ? '%' : '';
$this->like[] = ['fieldNameAndPath' => $fieldNameAndPath, 'operand' => $wildCardSymbol . $operand . $wildCardSymbol];
// Add wildcards by default for LIKE queries
$this->like[] = ['fieldNameAndPath' => $fieldNameAndPath, 'operand' => '%' . $operand . '%'];
return $this;
}

Expand Down
78 changes: 75 additions & 3 deletions Classes/ViewHelpers/ImageStackViewHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
use TYPO3\CMS\Core\Resource\ProcessedFile;
use TYPO3\CMS\Core\Resource\ResourceFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Context\Context;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;

/**
Expand All @@ -28,6 +30,11 @@
class ImageStackViewHelper extends AbstractViewHelper
{

public function __construct(
private \TYPO3\CMS\Core\Context\Context $context,
private CategoryRepository $categoryRepository
) {
}
/**
* @return string
*/
Expand All @@ -49,8 +56,7 @@ public function render(): string
$enlargedFile = $this->createProcessedFile($file, 'enlargedImageMaximumWidth', 'enlargedImageMaximumHeight');
$categories = [];

$categoryRepository = GeneralUtility::makeInstance(CategoryRepository::class);
$metadataCategories = $categoryRepository->findFileCategories($file->getMetaData()['uid']);
$metadataCategories = $this->categoryRepository->findFileCategories($file->getMetaData()['uid']);
if ($metadataCategories && is_array($metadataCategories)) {
$categories = array_map(function ($cat) {
return [
Expand All @@ -60,7 +66,7 @@ public function render(): string
},$metadataCategories);
}

$baseUrl = GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
$baseUrl = $this->getSiteUrl();
$item = [
'thumbnail' => $baseUrl . $thumbnailFile->getPublicUrl(),
'enlarged' => $baseUrl . $enlargedFile->getPublicUrl(),
Expand Down Expand Up @@ -112,4 +118,70 @@ public function getSettings()
{
return $this->templateVariableContainer->get('settings');
}

/**
* Get the site URL
* @return string
*/
protected function getSiteUrl(): string
{
$siteFinder = GeneralUtility::makeInstance(SiteFinder::class);

// Try to get current page ID from different sources
$pageId = $this->getCurrentPageId();

try {
$site = $siteFinder->getSiteByPageId($pageId);
return (string)$site->getBase();
} catch (\Exception $e) {
// Fallback to default site or root page
try {
$sites = $siteFinder->getAllSites();
if (!empty($sites)) {
$defaultSite = reset($sites);
return (string)$defaultSite->getBase();
}
} catch (\Exception $e) {
// Ultimate fallback
return '/';
}
}

return '/';
}

/**
* Get current page ID from various sources
* @return int
*/
protected function getCurrentPageId(): int
{
// Try to get from context first
try {
if ($this->context->hasAspect('frontend.page')) {
return $this->context->getPropertyFromAspect('frontend.page', 'id', 1);
}
} catch (\Exception $e) {
// Context aspect not available, try other methods
}

// Try to get from TSFE (TypoScript Frontend Controller)
if (isset($GLOBALS['TSFE']) && $GLOBALS['TSFE'] instanceof \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController) {
return $GLOBALS['TSFE']->id;
}

// Try to get from request
if (isset($GLOBALS['TYPO3_REQUEST'])) {
$request = $GLOBALS['TYPO3_REQUEST'];
if ($request->getAttribute('routing')) {
$pageArguments = $request->getAttribute('routing');
if ($pageArguments instanceof \TYPO3\CMS\Core\Routing\PageArguments) {
return $pageArguments->getPageId();
}
}
}

// Fallback to root page
return 1;
}
}
Loading