Dynamische Databaserestrictions
Es existieren unzählige Möglichkeiten wie die Anforderungen des Kunden gelöst werden können. Die schnellste Variante besteht in der Verwendung einer eigenen Kategorie auf die bei der Ausgabe geprüft wird. Kategorien, die nur zu einer solchen Ausgabe-Steuerung angelegt werden, müssen an vielen anderen Stellen wie bei der Darstellung des Artikels in der Suche berücksichtigt werden, da diese Informationen nicht für den Endkunden relevant sind und nicht angezeigt werden dürfen.
RedakteurInnen können beim jeweiligen Artikel (basierend auf der Extension "news") definieren, ob der Artikel nur auf der Website, nur in der App oder auf beiden Kanälen ausgespielt werden soll.
Verwendung der Query Restrictions
Durch sogenannte Query-Restrictions können bei jeglichen Datenbankabfragen die mittels der API von TYPO3 abgesetzt werden zusätzliche Einschränkungen vorgenommen werden. Die bekannteste und meist verwendete Einschränkung ist die dass als gelöscht markierte Datensätze nicht angezeigt werden sollen.
Registrierung
Die zusätzliche Restriction muss in der ext_localconf.php registriert werden.
<?php
$GLOBALS['TYPO3_CONF_VARS']['DB']['additionalQueryRestrictions'][\StudioMitte\Theme\Database\Query\Restriction\NewsDisplayWebRestriction::class] = [];
Database Restriction
<?php
declare(strict_types=1);
namespace StudioMitte\Theme\Database\Query\Restriction;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression;
use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder;
use TYPO3\CMS\Core\Database\Query\Restriction\EnforceableQueryRestrictionInterface;
use TYPO3\CMS\Core\Database\Query\Restriction\QueryRestrictionInterface;
use TYPO3\CMS\Core\Site\Entity\SiteInterface;
class NewsDisplayWebRestriction implements QueryRestrictionInterface, EnforceableQueryRestrictionInterface
{
public const SHOW_BOTH = 0;
public const SHOW_WEB = 1;
public const SHOW_APP = 2;
public function isEnforced(): bool
{
return true;
}
public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder): CompositeExpression
{
$constraints = [];
foreach ($queriedTables as $tableAlias => $tableName) {
if ($tableName === 'tx_news_domain_model_news' && TYPO3_MODE === 'FE') {
$site = $this->getSite();
if ($site && $site->getIdentifier() === 'mobile') {
$constraints[] = $expressionBuilder->in(
$tableAlias . '.display_restriction',
[self::SHOW_BOTH, self::SHOW_APP]
);
} else {
$constraints[] = $expressionBuilder->in(
$tableAlias . '.display_restriction',
[self::SHOW_BOTH, self::SHOW_WEB]
);
}
}
}
return $expressionBuilder->andX(...$constraints);
}
protected function getSite(): ?SiteInterface
{
if ($GLOBALS['TYPO3_REQUEST'] instanceof ServerRequestInterface) {
return $GLOBALS['TYPO3_REQUEST']->getAttribute('site');
}
return null;
}
}
Wird das Interface EnforceableQueryRestrictionInterface implementiert und die Methode isEnforced() gibt true zurück, so wird die Database-Restriction auch dann aufgerufen, wenn $queryBuilder->getRestrictions()->removeAll(); verwendet wird. Erst bei einem expliziten $queryBuilder->getRestrictions()->removeByType(NewsDisplayWebRestriction::class) wird die Einschränkung nicht aktiv.
In der Methode buildExpressions muss nun lediglich auf die entsprechende Datenbanktabelle geprüft werden. Der Ausgabekanal als App ist über eine eigene Domain und Site implementiert. Daher wird auf den Identifier der Site geprüft und je nach Site wird die zusätzliche Restriction den bereits bestehenden Constraints hinzugefügt.