Skip to content
Open
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
45 changes: 23 additions & 22 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,41 @@ 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);
// Assign template variables
$this->view->assign('settings', $this->settings);
$this->view->assign('data', $this->configurationManager->getcontentObject()->data);
$this->view->assign('images', $images);
$this->view->assign('categories', $categories);
$categories = $this->categoryRepository->findByIdentifiers($identifiers);
$this->view->assignMultiple([
'settings' => $this->settings,
'data' => $this->request->getAttribute('currentContentObject')->data,
'images' => $images,
'categories' => $categories,
]);


return $this->htmlResponse();
}

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

}

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

protected function getDemand(): array
{
Expand All @@ -95,6 +98,4 @@ protected function getDemand(): array
'identifiers' => GeneralUtility::trimExplode(',', $this->settings['categories'], TRUE)
];
}


}
52 changes: 29 additions & 23 deletions Classes/Domain/Repository/CategoryRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,47 +36,54 @@ class CategoryRepository
*/
protected string $tableName = 'sys_category';

protected ConnectionPool $connectionPool;

public function __construct(ConnectionPool $connectionPool)
{
$this->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->select('*')
->from($this->tableName)
->where(
$queryBuilder->expr()->in('uid', $identifiers)
);
$result = $queryBuilder->executeQuery()->fetchAllAssociative();

return $result ?? [];
}

public function findFileCategories($uid): array
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_metadata');
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_category');
$results = [];
if ($uid){
$query = $queryBuilder
->select('sys_category.uid', 'sys_category.title')
->from('sys_category')
->leftJoin(
->join(
'sys_category',
'sys_category_record_mm',
'sys_category_record_mm',
$queryBuilder->expr()->eq('sys_category.uid', 'sys_category_record_mm.uid_local')
'mm',
'sys_category.uid = 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('mm.uid_foreign', $queryBuilder->createNamedParameter($uid, \TYPO3\CMS\Core\Database\Connection::PARAM_INT)),
$queryBuilder->expr()->eq('mm.tablenames', $queryBuilder->createNamedParameter('sys_file_metadata')),
$queryBuilder->expr()->eq('mm.fieldname', $queryBuilder->createNamedParameter('categories'))
);
$results = $query->execute()->fetchAllAssociative();
$results = $query->executeQuery()->fetchAllAssociative();

}

Expand All @@ -85,8 +92,7 @@ public function findFileCategories($uid): array

protected function getQueryBuilder(): QueryBuilder
{
/** @var ConnectionPool $connectionPool */
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
return $connectionPool->getQueryBuilderForTable($this->tableName);

return $this->connectionPool->getQueryBuilderForTable($this->tableName);
}
}
109 changes: 48 additions & 61 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 All @@ -30,12 +33,10 @@ public function findByUid(int $uid): array
->select('*')
->from($this->tableName)
->where(
$this->getQueryBuilder()
->expr()
->eq('uid', $this->getQueryBuilder()->expr()->literal($uid)),
$query->expr()->eq('uid', $uid)
);

$messages = $query->execute()->fetchOne();
$messages = $query->executeQuery()->fetchOne();

return is_array($messages) ? $messages : [];
}
Expand All @@ -50,30 +51,30 @@ public function findByCategories(array $categories): array
$queryBuilder = $this->getQueryBuilder();
$queryBuilder->select('*')
->from($this->tableName)
->innerJoin(
->join(
'sys_file',
'sys_file_metadata',
'sys_file_metadata',
'sys_file.uid = sys_file_metadata.file'
'metadata',
'sys_file.uid = metadata.file'
)
->innerJoin(
'sys_file_metadata',
'sys_category_record_mm',
->join(
'metadata',
'sys_category_record_mm',
'sys_category_record_mm.uid_foreign = sys_file_metadata.uid AND tablenames = "sys_file_metadata" AND fieldname = "categories"'
'mm',
'mm.uid_foreign = metadata.uid AND mm.tablenames = "sys_file_metadata" AND mm.fieldname = "categories"'
);

if (!empty($categories)) {
$queryBuilder->where(
$queryBuilder->expr()->in('sys_category_record_mm.uid_local', $categories)
$queryBuilder->expr()->in('mm.uid_local', $categories)
);
}

$queryBuilder->addOrderBy('sys_file_metadata.year', 'DESC')
->addOrderBy('sys_file_metadata.title', 'ASC');
$queryBuilder->addOrderBy('metadata.year', 'DESC')
->addOrderBy('metadata.title', 'ASC');

return $queryBuilder
->execute()
->executeQuery()
->fetchAllAssociative();

}
Expand All @@ -93,69 +94,55 @@ public function findByDemand(array|Matcher $demand = [], array $orderings = [],
$uids = array_map('intval', $inConditions[0]['operand']);
}
}

$timestamp = time();
$queryBuilder = $this->getQueryBuilder();

$queryBuilder
->select('sys_file.*')
->from('sys_file')
->leftJoin(
'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])
)
'metadata',
'sys_file.uid = metadata.file'
)
->leftJoin(
'sys_file_metadata',
'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'))
)
'mm',
'metadata.uid = mm.uid_foreign AND mm.tablenames = "sys_file_metadata" AND mm.fieldname = "categories"'
)
->leftJoin(
'sys_category_record_mm0',
'mm',
'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])
)
'category',
'mm.uid_local = category.uid'
)
->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()->eq('sys_file.type', 2),
$queryBuilder->expr()->in('sys_file.uid', (array)$uids),
// Metadata conditions
$queryBuilder->expr()->lte('metadata.t3ver_state', 0),
$queryBuilder->expr()->eq('metadata.t3ver_wsid', 0),
$queryBuilder->expr()->in('metadata.sys_language_uid', [0, -1]),
// Category conditions
$queryBuilder->expr()->eq('category.deleted', 0),
$queryBuilder->expr()->lte('category.t3ver_state', 0),
$queryBuilder->expr()->eq('category.t3ver_wsid', 0),
$queryBuilder->expr()->eq('category.hidden', 0),
$queryBuilder->expr()->lte('category.starttime', $timestamp),
$queryBuilder->expr()->or(
$queryBuilder->expr()->eq('category.endtime', 0),
$queryBuilder->expr()->gt('category.endtime', $timestamp)
),
$queryBuilder->expr()->in('category.sys_language_uid', [0, -1])
)

->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('category.uid', (int)$categoryConditions)
);
}

Expand Down Expand Up @@ -207,15 +194,15 @@ public function findByUids(array $uids): array
$query
->select('*')
->from($this->tableName)
->where($this->getQueryBuilder()->expr()->in('uid', $uids));
->where($query->expr()->in('uid', $uids));

return $query->execute()->fetchAllAssociative();
return $query->executeQuery()->fetchAllAssociative();
}

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
Loading