Skip to content

Commit

Permalink
Merge pull request #52 from TYPO3incubator/feature/copyright
Browse files Browse the repository at this point in the history
[TASK] Implement image copyright list
  • Loading branch information
schliesser authored Apr 23, 2024
2 parents dba2de6 + 6396fb8 commit 20d45de
Show file tree
Hide file tree
Showing 16 changed files with 339 additions and 37 deletions.
70 changes: 51 additions & 19 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

namespace Surfcamp\Copyright\Controller;

use Doctrine\DBAL\Exception;
use Psr\Http\Message\ResponseInterface;
use Surfcamp\Copyright\Domain\Repository\CopyrightRepository;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class CopyrightController extends ActionController
{
public function __construct(
protected readonly CopyrightRepository $copyrightRepository
)
{
}

/**
* @throws Exception
*/
public function imagesAction(): ResponseInterface
{
$this->view->assign('images', $this->copyrightRepository->findBySite($this->request->getAttribute('site')));
return $this->htmlResponse();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

declare(strict_types=1);

namespace Surfcamp\Copyright\Domain\Repository;

use Doctrine\DBAL\Exception;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\FrontendRestrictionContainer;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Resource\FileRepository;
use TYPO3\CMS\Core\Site\Entity\Site;
use TYPO3\CMS\Core\Utility\GeneralUtility;

readonly class CopyrightRepository
{
public function __construct(
protected PageRepository $pageRepository,
protected FileRepository $fileRepository,
protected ConnectionPool $connectionPool
)
{
}

/**
* @throws Exception
*/
public function findBySite(Site $site, $allowedMimeTypes = ['image/jpeg', 'image/png', 'image/svg+xml']): array
{
// first fetch all pages in a specific site
$pageIds = $this->pageRepository->getDescendantPageIdsRecursive($site->getRootPageId(), 4);
$pageIds[] = $site->getRootPageId();

$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_file_reference');
$queryBuilder->setRestrictions(GeneralUtility::makeInstance(FrontendRestrictionContainer::class));
$fileReferences = $queryBuilder
->select('r.*')
->from('sys_file_reference', 'r')
->leftJoin('r', 'sys_file', 'f', 'r.uid_local = f.uid')
->leftJoin('f', 'sys_file_metadata', 'm', 'f.uid = m.file')
->where(
$queryBuilder->expr()->in('r.pid', $queryBuilder->createNamedParameter($pageIds, Connection::PARAM_INT_ARRAY)),
$queryBuilder->expr()->in('f.mime_type', $queryBuilder->createNamedParameter($allowedMimeTypes, Connection::PARAM_STR_ARRAY)),
$queryBuilder->expr()->isNotNull('m.copyright')
)
->orderBy('m.title')
->executeQuery()
->fetchAllAssociative();

$result = [];
foreach ($fileReferences as $fileReference) {
$fileObject = $this->fileRepository->findByUid($fileReference['uid_local']);
if (array_key_exists($fileObject->getUid(), $result)) {
$result[$fileObject->getUid()]['pages'][$fileReference['pid']] = $fileReference['pid'];
} else {
$result[$fileObject->getUid()] = [
'file' => $fileObject,
'pages' => [$fileReference['pid'] => $fileReference['pid']],
];
}
}
return $result;
}
}
9 changes: 9 additions & 0 deletions local_packages/copyright/Configuration/Services.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
# general settings
_defaults:
autowire: true
autoconfigure: true
public: false

Surfcamp\Copyright\:
resource: '../Classes/*'
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

declare(strict_types=1);

defined('TYPO3') || die();

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Copyright',
'Images',
'LLL:EXT:copyright/Resources/Private/Language/locallang_db.xlf:element.label',
'content-listgroup',
'special',
'LLL:EXT:copyright/Resources/Private/Language/locallang_db.xlf:element.description',
);
11 changes: 11 additions & 0 deletions local_packages/copyright/Resources/Private/Language/locallang.xlf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" date="2011-10-17T20:22:32Z" product-name="copyright">
<header/>
<body>
<trans-unit id="usage" resname="usage">
<source>Usage:</source>
</trans-unit>
</body>
</file>
</xliff>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" date="2011-10-17T20:22:32Z" product-name="copyright">
<header/>
<body>
<trans-unit id="element.label" resname="element.label">
<source>Copyright for Images</source>
</trans-unit>

<trans-unit id="element.description" resname="element.description">
<source>List of all (visible) images used on a Site with a link to the actual page - used on the imprint page</source>
</trans-unit>
</body>
</file>
</xliff>
24 changes: 24 additions & 0 deletions local_packages/copyright/Resources/Private/Templates/Images.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<html
data-namespace-typo3-fluid="true"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
>
<f:if condition="{images}">
<ul>
<f:for as="image" each="{images}">
<f:if condition="{image.file.metaData.copyright} && {image.pages}">
<li>
<span>{f:if(condition: image.file.metaData.title, then: '{image.file.metaData.title} - ')}{image.file.metaData.copyright -> f:format.html(parseFuncTSPath: 'lib.parseFunc')}</span>
<span>{f:translate(key: 'usage')}</span>
<ul>
<f:for as="page" each="{image.pages}">
<li>
<f:link.typolink parameter="{page}"/>
</li>
</f:for>
</ul>
</li>
</f:if>
</f:for>
</ul>
</f:if>
</html>
17 changes: 17 additions & 0 deletions local_packages/copyright/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "surfcamp/copyright",
"type": "typo3-cms-extension",
"description": "List of images",
"license": "GPL-2.0-or-later",
"version": "1.0.0",
"autoload": {
"psr-4": {
"Surfcamp\\Copyright\\": "Classes/"
}
},
"extra": {
"typo3/cms": {
"extension-key": "copyright"
}
}
}
15 changes: 15 additions & 0 deletions local_packages/copyright/ext_localconf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

defined('TYPO3') || die();

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Copyright',
'Images',
[
\Surfcamp\Copyright\Controller\CopyrightController::class => 'images',
],
[],
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT
);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
tt_content.copyright_images.20.view.templateRootPaths.20 = EXT:success/Resources/Private/Templates/_LandingPage/Copyright
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
@import 'EXT:success/Configuration/Sets/_LandingPage/TypoScript/RecordLinks/contentInModal.typoscript'
@import 'EXT:success/Configuration/Sets/_LandingPage/TypoScript/Form/setup.typoscript'
@import 'EXT:success/Configuration/Sets/_LandingPage/TypoScript/config.typoscript'
@import 'EXT:success/Configuration/Sets/_LandingPage/TypoScript/copyright.typoscript'

page = PAGE
page {
Expand Down
Loading

0 comments on commit 20d45de

Please sign in to comment.