Compare commits

...

35 Commits

Author SHA1 Message Date
2b549c7b38 [TASK] Work on compatibility for TYPO3 11 2025-08-21 15:55:33 +02:00
5b0ef1ccdf [BUGFIX] Mark function getRandomString as static 2025-08-20 13:17:29 +02:00
wadichaabene
a329a52505 [BUGFIX] Fix Captcha Validator 2025-06-20 09:31:20 +01:00
f52f1c2c35 [BUGFIX] API Utility: Check if method is object before checking for class 2025-05-26 18:13:23 +02:00
a4faec9eb3 [MERGE] Branch 'master' of ssh://phabricator.glanzstueck.agency/source/typo3-template_aide 2025-05-20 16:23:10 +02:00
8958f95806 [FEAUTRE] TCA Utility: Add function listMoveFieldBeforeField 2025-05-20 16:22:25 +02:00
998ee898fd [BUGFIX] Api utility does not resolve LazyLoadingProxy 2025-03-31 18:25:34 +02:00
wadichaabene
22a5b811b6 [BUGFIX] Remove last commit about Backend Table Mask 2025-03-24 11:50:38 +01:00
wadichaabene
2d9bc26ce6 [BUGFIX] Mask: Fix Backend Table Mask FMC0-I17 2025-03-22 15:16:27 +01:00
wadichaabene
9acf239483 [BUGFIX] Fix Language in typo3 9.5 2025-03-10 22:32:37 +01:00
wadichaabene
cd116df569 [BUGFIX] Change protection page form 2025-01-31 21:52:58 +01:00
wadichaabene
dede4d0efa [BUGFIX] Adapt Argument php 8 2025-01-31 21:42:13 +01:00
nourmkaouar
c191e6e635 [BUGFIX] Adapt mail to the new format 2025-01-17 17:58:34 +01:00
nourmkaouar
74f9767cf4 [TASK] add captcha validator 2025-01-06 17:47:49 +01:00
nourmkaouar
6f1383ce50 [TASK] Add DataProtection link 2024-12-30 15:10:07 +01:00
8502ea3910 [BUGFIX] Restore compatibilty with TYPO3 9 2024-12-12 20:51:05 +01:00
1bc7ad1eb0 [TASK] Array utility: Add depth function 2024-12-12 15:23:01 +01:00
5c42fa2d1d [TASK] Work on compatibility for TYPO3 11 2024-12-09 14:33:03 +01:00
d66fdf29a1 [TASK] Work on compatibility for TYPO3 11 2024-12-02 18:44:51 +01:00
786c200609 [MERGE] Branch 'master' of ssh://phabricator.glanzstueck.agency/source/typo3-template_aide 2024-11-28 15:21:46 +01:00
7f3123b61a [TASK] Work on compatibility for TYPO3 11 2024-11-28 15:19:38 +01:00
wadichaabene
d9e0ae6c44 [BUGFIX] Upgrade extension registerPlugin 2024-11-21 17:46:57 +01:00
fb54d608a6 [TASK] Start compatibility for TYPO3 11 2024-08-29 18:16:52 +02:00
94296d4a4d [TASK] Add style options to html mail partial 2024-07-19 11:35:21 +02:00
1a3aab9f36 [REVERT][TASK] new changes Mail
This reverts commit 14b3a54a9960f485f28ab0c529d3a6d45d0536eb.
2024-07-19 11:30:27 +02:00
wadichaabene
14b3a54a99 [TASK] new changes Mail 2024-07-18 14:20:51 +01:00
0045f87815 [REVERT][TASK] new changes Mail
This reverts commit 9ba671cfd0ce4cd245933225b645f7761291cb8e.
2024-07-18 10:56:02 +02:00
wadichaabene
9ba671cfd0 [TASK] new changes Mail 2024-07-17 23:58:53 +01:00
0e15cad446 [TASK] Make api utility image processing more fault tolerant 2024-03-14 18:39:04 +01:00
fe7b034599 [MERGE] Branch 'master' of https://phabricator.glanzstueck.agency/source/typo3-template_aide 2024-02-09 11:04:10 +01:00
ddbb0c35b0 [FEATURE] Add backend for loading translations via ajax 2024-02-09 11:04:01 +01:00
2ee1d6b18e [MERGE] Branch 'master' of git.datentonne.net:typo3/template_aide 2023-12-08 11:46:45 +01:00
869b3df738 [FEATURE] Add contentBlockHtml and diver to mail utility 2023-12-08 11:41:35 +01:00
0f3e88ac96 [BUGFIX] Fix hr layout in outlook 2023-08-04 14:11:20 +02:00
329de2771e [TASK] Mail: Add hr, right aligned table, debugging output 2022-12-09 01:42:02 +01:00
35 changed files with 1058 additions and 277 deletions

View File

@ -17,11 +17,19 @@ use Cjel\TemplatesAide\Traits\ValidationTrait;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer;
use TYPO3\CMS\Core\Http\Response;
use TYPO3\CMS\Core\Http\ServerRequestFactory;
use TYPO3\CMS\Core\Localization\LanguageService;
use TYPO3\CMS\Core\Localization\LanguageServiceFactory;
use TYPO3\CMS\Core\Log\LogManager;
use TYPO3\CMS\Core\Routing\SiteMatcher;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\TypoScript\TemplateService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\RootlineUtility;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper;
@ -148,15 +156,26 @@ class AbstractEIDController
$this->importLogger = $this->logManager->getLogger(
'importLogger'
);
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class, GeneralUtility::makeInstance(
CacheManager::class
)
);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class
);
} else {
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class, GeneralUtility::makeInstance(
CacheManager::class
)
);
}
$classInfo = $this->reflectionService->getClassSchema(
get_class($this)
);
foreach ($classInfo->getInjectMethods() as $method => $className) {
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$className = $className
->getFirstParameter()
->getDependency();
}
$class = $this->objectManager->get(
$className
);
@ -169,47 +188,37 @@ class AbstractEIDController
*/
private function initFrontendController()
{
$currentDomain = strtok(GeneralUtility::getIndpEnv('HTTP_HOST'), ':');
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('sys_domain');
$queryBuilder->setRestrictions(
GeneralUtility::makeInstance(DefaultRestrictionContainer::class)
$request = ServerRequestFactory::fromGlobals();
$context = GeneralUtility::makeInstance(Context::class);
$siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
$siteMatcher = GeneralUtility::makeInstance(SiteMatcher::class);
$site = $siteMatcher->matchRequest($request);
$pageId = $site->getSite()->getRootPageId();
$template = GeneralUtility::makeInstance(TemplateService::class);
$template->tt_track = false;
$rootline = GeneralUtility::makeInstance(
RootlineUtility::class, $pageId
)->get();
$template->runThroughTemplates($rootline, 0);
$template->generateConfig();
$setup = $template->setup;
$setup = GeneralUtility::removeDotsFromTS($setup);
$extKey = 'tx_' . $this->getExtensionKey();
if (array_key_exists('plugin', $setup)
&& array_key_exists($extKey, $setup['plugin'])
&& array_key_exists('persistence', $setup['plugin'][$extKey])
&& array_key_exists('storagePid', $setup['plugin'][$extKey]['persistence'])
) {
$storagePids = $setup['plugin'][$extKey]['persistence']['storagePid'];
$this->storagePids = GeneralUtility::trimExplode(
',',
$storagePids
);
}
$languageServiceFactory = GeneralUtility::makeInstance(
LanguageServiceFactory::class
);
$result = $queryBuilder
->select('uid', 'pid', 'domainName')
->from('sys_domain')
->where(
$queryBuilder->expr()->eq(
'domainName',
$queryBuilder->createNamedParameter(
$currentDomain,
\PDO::PARAM_STR
)
)
)
->orderBy('sorting', 'ASC')
->execute()
->fetchAll();
//if (count($result) < 1) {
// throw new \Exception('Domain not configured');
//}
$frontendController = GeneralUtility::makeInstance(
\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController::class,
$GLOBALS['TYPO3_CONF_VARS'],
null,
0,
true
);
$GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class);
$GLOBALS['LANG']->init('default');
$GLOBALS['TSFE'] = $frontendController;
$frontendController->connectToDB();
$frontendController->fe_user = EidUtility::initFeUser();
$frontendController->id = $result[0]['pid'];
$frontendController->determineId();
$frontendController->initTemplate();
$frontendController->getConfigArray();
EidUtility::initTCA();
$GLOBALS['LANG'] = $languageServiceFactory->create('default');
}
/**
@ -271,6 +280,7 @@ class AbstractEIDController
. 'Request';
}
}
$response = new Response();
if (method_exists($this, $requestMethod)) {
$responseData = $this->$requestMethod($request, $response);
$response = $response->withHeader(

View File

@ -27,6 +27,8 @@ use TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationBuilder;
use TYPO3\CMS\Extbase\Service\EnvironmentService;
use TYPO3\CMS\Extbase\Service\ExtensionService;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
use Blueways\BwCaptcha\Validation\Validator\CaptchaValidator;
use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication;
class ActionController extends BaseController
{
@ -141,6 +143,11 @@ class ActionController extends BaseController
*/
protected $propertyMapperConfigurationBuilder;
/**
* translation extensions
*/
protected $translations = [];
/**
* @param \TYPO3\CMS\Extbase\Service\ExtensionService $extensionService
*/
@ -165,22 +172,6 @@ class ActionController extends BaseController
$this->environmentService = $environmentService;
}
/**
* propertyMapper
*
* @var PropertyMapper
*/
protected $propertyMapper;
/**
* @param
*/
public function injectPropertyMapper(
PropertyMapper $propertyMapper
) {
$this->propertyMapper = $propertyMapper;
}
/**
* propertyMappingConfigurationBuilder
*
@ -595,7 +586,7 @@ class ActionController extends BaseController
if (in_array($argument->getName(), ['step', 'submit', $object])) {
continue;
}
if (method_exists($argument->getValue(), 'getUid')) {
if (is_string($argument->getValue()) && method_exists($argument->getValue(), 'getUid')) {
$pluginArguments[$argument->getName()]
= $argument->getValue()->getUid();
} else {
@ -616,10 +607,26 @@ class ActionController extends BaseController
$this->request->getControllerActionName(),
$pluginArguments
);
$uriTranslation = $this->getControllerContext()
->getUriBuilder()
->reset()
->setCreateAbsoluteUri(true)
->setAddQueryString(true)
->setTargetPageType(6001)
->uriFor(
'translations',
[
'extensions' => $this->translations,
],
'Translation',
'TemplatesAide',
'Translationplugin'
);
$this->ajaxEnv = [
'uri' => $uri,
'object' => $object,
'namespace' => $this->getPluginNamespace(),
'uri' => $uri,
'uriTranslation' => $uriTranslation,
'object' => $object,
'namespace' => $this->getPluginNamespace(),
];
}
@ -755,11 +762,36 @@ class ActionController extends BaseController
}
if ($this->pageType) {
if (is_array($this->responseStatus)) {
$this->response->setStatus(
array_key_first($this->responseStatus)
);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$response = $this
->responseFactory
->createResponse()
->withHeader(
'Content-Type',
'application/json; charset=utf-8'
)
->withStatus(
array_key_first($this->responseStatus),
''
);
} else {
$this->response->setStatus(
array_key_first($this->responseStatus)
);
}
} else {
$this->response->setStatus($this->responseStatus);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$response = $this
->responseFactory
->createResponse()
->withHeader(
'Content-Type',
'application/json; charset=utf-8'
)
->withStatus($this->responseStatus, '');
} else {
$this->response->setStatus($this->responseStatus);
}
}
if ($this->pageType == $this->ajaxPageType) {
if ($this->environmentService->isEnvironmentInBackendMode()) {
@ -775,7 +807,12 @@ class ActionController extends BaseController
if ($this->reload) {
$result['reload'] = true;
}
return json_encode($result);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$response->getBody()->write(json_encode($result));
return $response;
} else {
return json_encode($result);
}
}
$result = array_merge(
$result,
@ -790,5 +827,53 @@ class ActionController extends BaseController
);
}
$this->view->assignMultiple($result);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
return $this
->responseFactory
->createResponse()
->withHeader('Content-Type', 'text/html; charset=utf-8')
->withBody($this->streamFactory->createStream(
(string)($html ?? $this->view->render()))
);
}
}
/** **/
protected function valideCaptcha($captchaId, $value
) {
$captchaPhrases = $this->getFeUser()->getKey('ses', 'captchaPhrases');
if (!$captchaPhrases || !is_array($captchaPhrases) || !is_string($value)) {
$this->addValidationError(
'captcha',
'validator.notvalid'
);
}
// get captcha secret from cache and compare
$time = time();
$captchaPhrases = array_filter(
$captchaPhrases,
function ($captchaLifetime) use ($time) {
return $captchaLifetime > $time;
},
ARRAY_FILTER_USE_KEY
);
foreach ($captchaPhrases as $lifetime => $captchaPhrase) {
$isValid = !empty($captchaPhrase) && $captchaPhrase === $value;
if ($isValid) {
// remove solved captcha
unset($captchaPhrases[$lifetime]);
$this->getFeUser()->setKey('ses', 'captchaPhrases', $captchaPhrases);
$this->getFeUser()->storeSessionData();
return true;
}
}
$this->addValidationError(
'captcha',
'validator.notvalid'
);
}
protected function getFeUser(): FrontendUserAuthentication
{
return $GLOBALS['TSFE']->fe_user;
}
}

View File

@ -0,0 +1,66 @@
<?php
namespace Cjel\TemplatesAide\Controller;
/***
*
* This file is part of the "Templates Aide" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* (c) 2024 Philipp Dieter <philippdieter@attic-media.net>
*
***/
use TYPO3\CMS\Core\Localization\LocalizationFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* TranslationController
*/
class TranslationController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
protected static $locallangPath = 'Resources/Private/Language/';
/**
* action translations
*
* @param array $extensions
* @return void
*/
public function translationsAction($extensions = [])
{
$result = [];
foreach ($extensions as $extension) {
$langfilePath = 'EXT:'
. GeneralUtility::camelCaseToLowerCaseUnderscored($extension)
. '/'
. self::$locallangPath
. 'locallang.xlf';
$languageFactory = GeneralUtility::makeInstance(
LocalizationFactory::class
);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$language = $this->request->getAttribute('language');
} else {
$language = $GLOBALS['TYPO3_REQUEST']->getAttribute('language');
}
$locale = $language->getLocale();
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
// $locale, '$locale', 3, true, false
//);
$langfileContent = $languageFactory->getParsedData(
$langfilePath,
$locale
);
$langfileResult = [];
foreach (reset($langfileContent) as $key => $row) {
$langfileResult[$key] = reset($row)['target'];
}
$result[$extension] = $langfileResult;
}
$GLOBALS['TSFE']->setContentType('application/json');
return json_encode($result);
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace Cjel\TemplatesAide\Domain\Model;
/***
*
* This file is part of the "Templates Aide" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* (c) 2024 Philipp Dieter <philippdieter@attic-media.net>
*
***/
/**
* Translation
*/
class Translation extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
}

View File

@ -102,11 +102,17 @@ trait DependencyInjectionTrait
$frameworkConfiguration['persistence']['storagePid']
)
);
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class, GeneralUtility::makeInstance(
CacheManager::class
)
);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class
);
} else {
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class, GeneralUtility::makeInstance(
CacheManager::class
)
);
}
$classInfo = $this->reflectionService->getClassSchema(
get_class($this)
);

View File

@ -12,10 +12,12 @@ namespace Cjel\TemplatesAide\Utility;
*
***/
use TYPO3\CMS\Core\Resource\Exception\FolderDoesNotExistException;
use TYPO3\CMS\Core\Resource\FileReference as CoreFileReference;
use TYPO3\CMS\Extbase\Domain\Model\FileReference as ExtbaseFileReference;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Domain\Model\FileReference as ExtbaseFileReference;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
use TYPO3\CMS\Extbase\Persistence\Generic\LazyObjectStorage;
use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
use TYPO3\CMS\Extbase\Service\ImageService;
@ -75,6 +77,11 @@ class ApiUtility
if (substr($method, 0, 3) === 'get') {
$methodResult = call_user_func([$row, $method]);
$attributeName = lcfirst(substr($method, 3));
if (is_object($methodResult)
&& get_class($methodResult) == LazyLoadingProxy::class
) {
$methodResult = $methodResult->_loadRealInstance();
}
$propertieResults[$attributeName] = $methodResult;
}
}
@ -229,11 +236,15 @@ class ApiUtility
$absoluteUrl = $requestHost
. '/'
. $publicUrl;
$imagePreview = $this->imageService->getImage(
$publicUrl,
null,
0
);
try {
$imagePreview = $this->imageService->getImage(
$publicUrl,
null,
0
);
} catch (FolderDoesNotExistException $e) {
return [];
}
$processingInstructionsPreview = array(
//'width' => '1024c',
//'height' => '768c',

View File

@ -67,4 +67,20 @@ class ArrayUtility
return array_keys($arr) !== range(0, count($arr) - 1);
}
/**
* Returns the depth of an array
*/
function depth(array $array) {
$depthMax = 1;
foreach ($array as $value) {
if (is_array($value)) {
$depth = self::depth($value) + 1;
if ($depth > $depthMax) {
$depthMax = $depth;
}
}
}
return $depthMax;
}
}

View File

@ -20,7 +20,8 @@ use TYPO3\CMS\Extbase\Service\ImageService;
use TYPO3\CMS\Fluid\View\StandaloneView;
use TYPO3\CMS\Fluid\View\TemplatePaths;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use Symfony\Component\Mime\Address;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
*
*/
@ -79,6 +80,10 @@ class MailUtility
$type = 'tableLayout';
$textPart = substr($textPart, 3);
}
if (substr($textPart, 0, 3) === '---') {
$type = 'divider';
$textPart = substr($textPart, 3);
}
if (substr($textPart, 0, 9) === '%subject ') {
$type = 'subject';
$textPart = substr($textPart, 9);
@ -215,14 +220,20 @@ class MailUtility
}
$textView->setTemplate($templateNameText);
$mail = GeneralUtility::makeInstance(MailMessage::class);
$mail->setFrom($sender);
$mail->setSubject($subject);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$mail->from(new Address(key($sender),$sender[key($sender)]));
$mail->subject($subject);
} else {
$mail->setFrom($sender);
$mail->setSubject($subject);
}
$bodydataText = [];
$bodydataHtml = [];
foreach ($data as $row) {
switch($row['type']) {
case 'text':
case 'table':
case 'tablelr':
case 'tableLayout':
case 'list':
case 'textbold':
@ -233,6 +244,8 @@ class MailUtility
case 'buttonleft':
case 'buttoncenter':
case 'buttonright':
case 'divider':
case 'hr':
$row['data'] = str_replace(
"\\\n",
'',
@ -308,83 +321,24 @@ class MailUtility
$bodydataText[] = $textRow;
$bodydataHtml[] = $htmlRow;
break;
//case 'button':
// $row['data'] = str_replace(
// "\\\n",
// '',
// $row['data']
// );
// $htmlRow = $row;
// $htmlRow['data'] = preg_replace_callback(
// '/\[.*\]/mU',
// function($matches) {
// foreach ($matches as $match) {
// $test = preg_replace_callback(
// '/\[(\S*)\s(.*)\]/mU',
// function($matchesInner) {
//
// return '<a href="'
// . $matchesInner[1]
// . '">'
// . $matchesInner[2]
// . '</a>';
// },
// $match
// );
// \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
// $test, null, 3, true, false
// );
// return $test;
// }
// },
// $htmlRow['data']
// );
// \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
// $htmlRow['data'], null, 3, true, false
// );
// $htmlRow['data'] = preg_replace_callback(
// '/\*.*\*/mU',
// function($matches) {
// foreach ($matches as $match) {
// return '<b>'
// . substr($match, 1, -1)
// . '</b>';
// }
// },
// $htmlRow['data']
// );
// $textRow = $row;
// $textRow['data'] = preg_replace_callback(
// '/\[.*\]/mU',
// function($matches) {
// foreach ($matches as $match) {
// return preg_replace_callback(
// '/\[(\S*)\s(.*)\]/mU',
// function($matchesInner) {
// if (
// $matchesInner[2] == $matchesInner[1]
// ) {
// return $matchesInner[1];
// }
// return $matchesInner[2]
// . ': '
// . $matchesInner[1];
// },
// $match
// );
// }
// },
// $textRow['data']
// );
// $bodydataText[] = $textRow;
// $bodydataHtml[] = $htmlRow;
// break;
case 'contentBlockHtml':
$htmlRow = $row;
$bodydataHtml[] = $htmlRow;
break;
case 'attachment':
$mail->attach(new \Swift_Attachment(
$row['data'][0],
$row['data'][1],
$row['data'][2]
));
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$mail->attach(
$row['data'][0],
$row['data'][1],
$row['data'][2]
);
} else {
$mail->attach(new \Swift_Attachment(
$row['data'][0],
$row['data'][1],
$row['data'][2]
));
}
break;
case 'attachmentBase64':
$attachmentdata = explode(',', $row['data']);
@ -392,24 +346,39 @@ class MailUtility
$mimetype = $matches[1];
preg_match('/\w*\/(.*);\w*/', $attachmentdata[0], $matches);
$fileextension = $matches[1];
$mail->attach(new \Swift_Attachment(
base64_decode($attachmentdata[1]),
'attachment.' . $fileextension,
$mimetype
));
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$mail->attach(
base64_decode($attachmentdata[1]),
'attachment.' . $fileextension,
$mimetype
);
} else {
$mail->attach(new \Swift_Attachment(
base64_decode($attachmentdata[1]),
'attachment.' . $fileextension,
$mimetype
));
}
break;
}
}
$textView->assign('content', $bodydataText);
$htmlView->assign('content', $bodydataHtml);
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
// $bodydataHtml, null, 8, true, false
//);
$domain = $settings['mailDomain'];
if ($assetDomain) {
$domain = $assetDomain;
}
$dataProtectionPid = $settings['dataProtectionPid'];
$uriBuilder = $objectManager->get(
UriBuilder::class
);
if ($dataProtectionPid) {
$pageRepository = GeneralUtility::makeInstance(PageRepository::class);
$urlPage = $pageRepository->getPage($settings['dataProtectionPid']);
$dataProtectionPid = $domain.$urlPage['slug'];
}
$htmlView->assign('domain', $domain);
$htmlView->assign('linkDataprotection', $dataProtectionPid);
$textBody = $textView->render();
$htmlBody = $htmlView->render();
if ($domain) {
@ -443,18 +412,48 @@ class MailUtility
);
foreach ($recipientsIntercecpted as $recipientIntercepted) {
foreach ($recipients as $recipient) {
$mail->setSubject(
$subjectOrig . ' [ORIG-TO: ' . trim($recipient) . ']'
);
$mail->setTo(trim($recipientIntercepted));
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$mail->subject(
$subjectOrig . ' [ORIG-TO: ' . trim($recipient) . ']'
);
$mail->to(new Address(trim($recipientIntercepted)));
} else {
$mail->setSubject(
$subjectOrig . ' [ORIG-TO: ' . trim($recipient) . ']'
);
$mail->setTo(trim($recipientIntercepted));
}
$mail->send();
}
}
} else {
foreach ($recipients as $recipient) {
$mail->setTo(trim($recipient));
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$mail->to(new Address(trim($recipient)));
} else {
$mail->setTo(trim($recipient));
}
$mail->send();
}
}
}
/**
* Debug print
*/
public static function printMaildata($maildata)
{
foreach ($maildata as $row) {
if (!is_array($row['data'])) {
print($row['data']);
} else {
print($row['data'][0]);
print(PHP_EOL);
print($row['data'][1]);
}
print(PHP_EOL);
}
print(PHP_EOL);
}
}

View File

@ -45,7 +45,7 @@ class StringUtility
return $string;
}
function getRandomString(
public static function getRandomString(
int $length = 64,
string $keyspace = null
): string {

View File

@ -142,6 +142,26 @@ class TcaUtility
return implode(', ', $fieldlist);
}
/**
* @return string
*/
public static function listMoveFieldBeforeField(
$fieldlist, $field, $fieldBefore
) {
$fieldlist = GeneralUtility::trimExplode(
',',
$fieldlist
);
unset($fieldlist[(array_search($field, $fieldlist))]);
array_splice(
$fieldlist,
array_search($fieldBefore, $fieldlist),
0,
$field
);
return implode(', ', $fieldlist);
}
/**
* remove element from fieldlist
*

View File

@ -66,7 +66,7 @@ class TranslationViewHelper extends AbstractViewHelper
$translation = LocalizationUtility::translate(
$arguments['key'],
$arguments['extensionKey'],
$arguments['arguments']
(array) $arguments['arguments']
);
if ($translation) {
return $translation;

View File

@ -0,0 +1,28 @@
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Function</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<switchableControllerActions>
<TCEforms>
<label>Select function</label>
<config>
<type>select</type>
<items>
<numIndex index="0">
<numIndex index="0">Translation</numIndex>
<numIndex index="1">Translation-&gt;translations</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</switchableControllerActions>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>

View File

@ -0,0 +1,14 @@
<?php
defined('TYPO3_MODE') || die();
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'TemplatesAide',
'Dummy',
'dummy'
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'TemplatesAide',
'Translationplugin',
'translation'
);

View File

@ -23,24 +23,14 @@ return [
'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, ',
],
'types' => [
'1' => ['showitem' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, , --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime'],
'1' => ['showitem' => ', --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, sys_language_uid, l10n_parent, l10n_diffsource, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime'],
],
'columns' => [
'sys_language_uid' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'special' => 'languages',
'items' => [
[
'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages',
-1,
'flags-multiple'
]
],
'default' => 0,
'type' => 'language',
],
],
'l10n_parent' => [

View File

@ -0,0 +1,110 @@
<?php
return [
'ctrl' => [
'title' => 'LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templatesaide_domain_model_translation',
'label' => 'uid',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'cruser_id' => 'cruser_id',
'versioningWS' => true,
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l10n_parent',
'transOrigDiffSourceField' => 'l10n_diffsource',
'delete' => 'deleted',
'enablecolumns' => [
'disabled' => 'hidden',
'starttime' => 'starttime',
'endtime' => 'endtime',
],
'searchFields' => '',
'iconfile' => 'EXT:templates_aide/Resources/Public/Icons/tx_templatesaide_domain_model_translation.gif'
],
'interface' => [
'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, ',
],
'types' => [
'1' => ['showitem' => ', --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, sys_language_uid, l10n_parent, l10n_diffsource, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime'],
],
'columns' => [
'sys_language_uid' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => [
'type' => 'language',
],
],
'l10n_parent' => [
'displayCond' => 'FIELD:sys_language_uid:>:0',
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'default' => 0,
'items' => [
['', 0],
],
'foreign_table' => 'tx_templatesaide_domain_model_translation',
'foreign_table_where' => 'AND {#tx_templatesaide_domain_model_translation}.{#pid}=###CURRENT_PID### AND {#tx_templatesaide_domain_model_translation}.{#sys_language_uid} IN (-1,0)',
],
],
'l10n_diffsource' => [
'config' => [
'type' => 'passthrough',
],
],
't3ver_label' => [
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.versionLabel',
'config' => [
'type' => 'input',
'size' => 30,
'max' => 255,
],
],
'hidden' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.visible',
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
'items' => [
[
0 => '',
1 => '',
'invertStateDisplay' => true
]
],
],
],
'starttime' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
'config' => [
'type' => 'input',
'renderType' => 'inputDateTime',
'eval' => 'datetime,int',
'default' => 0,
'behaviour' => [
'allowLanguageSynchronization' => true
]
],
],
'endtime' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
'config' => [
'type' => 'input',
'renderType' => 'inputDateTime',
'eval' => 'datetime,int',
'default' => 0,
'range' => [
'upper' => mktime(0, 0, 0, 1, 1, 2038)
],
'behaviour' => [
'allowLanguageSynchronization' => true
]
],
],
],
];

View File

@ -14,6 +14,21 @@ plugin.tx_templatesaide_dummy {
}
}
plugin.tx_templatesaide_translationplugin {
view {
# cat=plugin.tx_templatesaide_translationplugin/file; type=string; label=Path to template root (FE)
templateRootPath = EXT:templates_aide/Resources/Private/Templates/
# cat=plugin.tx_templatesaide_translationplugin/file; type=string; label=Path to template partials (FE)
partialRootPath = EXT:templates_aide/Resources/Private/Partials/
# cat=plugin.tx_templatesaide_translationplugin/file; type=string; label=Path to template layouts (FE)
layoutRootPath = EXT:templates_aide/Resources/Private/Layouts/
}
persistence {
# cat=plugin.tx_templatesaide_translationplugin//a; type=string; label=Default storage PID
storagePid =
}
}
## EXTENSION BUILDER DEFAULTS END TOKEN - Everything BEFORE this line is overwritten with the defaults of the extension builder
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:templates_aide/Resources/Private/TypoScript/constants.ts">

View File

@ -1,11 +1,11 @@
plugin.tx_templatesaide_dummy {
view {
templateRootPaths.0 = EXT:{extension.shortExtensionKey}/Resources/Private/Templates/
templateRootPaths.0 = EXT:templates_aide/Resources/Private/Templates/
templateRootPaths.1 = {$plugin.tx_templatesaide_dummy.view.templateRootPath}
partialRootPaths.0 = EXT:templates_aide/Resources/Private/Partials/
partialRootPaths.1 = {$plugin.tx_templatesaide_dummy.view.partialRootPath}
layoutRootPaths.0 = EXT:tx_templatesaide/Resources/Private/Layouts/
layoutRootPaths.0 = EXT:templates_aide/Resources/Private/Layouts/
layoutRootPaths.1 = {$plugin.tx_templatesaide_dummy.view.layoutRootPath}
}
persistence {
@ -24,6 +24,31 @@ plugin.tx_templatesaide_dummy {
}
}
plugin.tx_templatesaide_translationplugin {
view {
templateRootPaths.0 = EXT:templates_aide/Resources/Private/Templates/
templateRootPaths.1 = {$plugin.tx_templatesaide_translationplugin.view.templateRootPath}
partialRootPaths.0 = EXT:templates_aide/Resources/Private/Partials/
partialRootPaths.1 = {$plugin.tx_templatesaide_translationplugin.view.partialRootPath}
layoutRootPaths.0 = EXT:templates_aide/Resources/Private/Layouts/
layoutRootPaths.1 = {$plugin.tx_templatesaide_translationplugin.view.layoutRootPath}
}
persistence {
storagePid = {$plugin.tx_templatesaide_translationplugin.persistence.storagePid}
#recursive = 1
}
features {
#skipDefaultArguments = 1
# if set to 1, the enable fields are ignored in BE context
ignoreAllEnableFieldsInBe = 0
# Should be on by default, but can be disabled if all action in the plugin are uncached
requireCHashArgumentForActionArguments = 1
}
mvc {
#callDefaultActionIfActionCantBeResolved = 1
}
}
# these classes are only used in auto-generated templates
plugin.tx_templatesaide._CSS_DEFAULT_STYLE (
textarea.f3-form-error {

View File

@ -1,5 +1,4 @@
.. include:: ../Includes.txt
.. include:: ../Includes.txt
.. _configuration:
@ -7,20 +6,17 @@
Configuration
=============
Target group: **Developers, Integrators**
How is the extension configured? Aim to provide simple instructions detailing
how the extension is configured. Always assume that the user has no prior experience
of using your extension.
Try and provide a typical use case for your extension and detail each of the
steps required to get the extension running.
How is the extension configured?
Aim to provide simple instructions detailing how the extension is configured.
Always assume that the user has no prior experience of using the extension.
Try and provide a typical use case for your extension
and detail each of the steps required to get the extension running.
Typical Example
===============
- Do we need to include a static template?
- Does the integrator need to include a static template?
- For example add a code snippet with comments
Minimal example of TypoScript:
@ -43,12 +39,12 @@ Minimal example of TypoScript:
TypoScript Reference
====================
When detailing data types or standard TypoScript
features, don't hesitate to cross-link to the TypoScript
Reference.
Possible subsections: Reference of TypoScript options.
The construct below show the recommended structure for TypoScript properties listing and description.
Information about how to use cross-references:
https://docs.typo3.org/typo3cms/HowToDocument/WritingReST/Hyperlinks.html
When detailing data types or standard TypoScript features,
don't hesitate to cross-link to the TypoScript Reference as shown below.
See :ref:`h2document:how-to-document-hyperlinks` for information about how to use cross-references.
See the :file:`Settings.cfg` file for the declaration of cross-linking keys.
You can add more keys besides tsref.

View File

@ -38,6 +38,47 @@
"relations": []
}
}
},
{
"config": {
"position": [
398,
234
]
},
"name": "New Model Object",
"value": {
"actionGroup": {
"_default0_list": false,
"_default1_show": false,
"_default2_new_create": false,
"_default3_edit_update": false,
"_default4_delete": false,
"customActions": [
"translations"
]
},
"name": "Translation",
"objectsettings": {
"addDeletedField": true,
"addHiddenField": true,
"addStarttimeEndtimeFields": true,
"aggregateRoot": false,
"categorizable": false,
"description": "",
"mapToTable": "",
"parentClass": "",
"sorting": false,
"type": "Entity",
"uid": "291507465262"
},
"propertyGroup": {
"properties": []
},
"relationGroup": {
"relations": []
}
}
}
],
"properties": {
@ -77,14 +118,25 @@
"description": "",
"key": "dummy",
"name": "dummy"
},
{
"actions": {
"controllerActionCombinations": "Translation => translations",
"noncacheableActions": "",
"switchableActions": ""
},
"description": "",
"key": "translationplugin",
"name": "translation"
}
],
"vendorName": "Cjel"
},
"wires": [],
"storagePath": "\/var\/www\/html\/webroot\/typo3conf\/ext\/",
"log": {
"last_modified": "2020-04-26 10:03",
"extension_builder_version": "9.10.2",
"be_user": " (1)"
"last_modified": "2024-02-07 06:12",
"extension_builder_version": "9.10.6",
"be_user": " (68)"
}
}

View File

@ -1,24 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2022-04-28T10:23:09Z">
<header>
<generator>LFEditor</generator>
</header>
<file source-language="en" datatype="plaintext" original="EXT:templates_aide/Resources/Private/Language/locallang" date="2024-02-07T18:12:19Z" product-name="templates_aide">
<header/>
<body>
<trans-unit id="default">
<source><![CDATA[Default]]></source>
<trans-unit id="tx_templatesaide_domain_model_dummy" resname="tx_templatesaide_domain_model_dummy">
<source>Dummy</source>
</trans-unit>
<trans-unit id="disableDragModal">
<source><![CDATA[Disable drag and drop confirmation in page tree]]></source>
<trans-unit id="tx_templatesaide_domain_model_translation" resname="tx_templatesaide_domain_model_translation">
<source>Translation</source>
</trans-unit>
<trans-unit id="homepage">
<source><![CDATA[Homepage]]></source>
<trans-unit id="default" resname="default">
<source>Default</source>
</trans-unit>
<trans-unit id="subpage">
<source><![CDATA[Subpage]]></source>
<trans-unit id="disableDragModal" resname="disableDragModal">
<source>Disable drag and drop confirmation in page tree</source>
</trans-unit>
<trans-unit id="tx_templatesaide_domain_model_dummy">
<source><![CDATA[Dummy]]></source>
<trans-unit id="homepage" resname="homepage">
<source>Homepage</source>
</trans-unit>
<trans-unit id="subpage" resname="subpage">
<source>Subpage</source>
</trans-unit>
</body>
</file>

View File

@ -1,15 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2020-04-26T22:03:44Z" product-name="templates_aide">
<file source-language="en" datatype="plaintext" original="EXT:templates_aide/Resources/Private/Language/locallang_db" date="2024-02-07T18:12:19Z" product-name="templates_aide">
<header/>
<body>
<trans-unit id="tx_templatesaide_domain_model_dummy">
<trans-unit id="tx_templatesaide_domain_model_dummy" resname="tx_templatesaide_domain_model_dummy">
<source>Dummy</source>
</trans-unit>
<trans-unit id="tx_templates_aide_dummy.name">
<trans-unit id="tx_templatesaide_domain_model_translation" resname="tx_templatesaide_domain_model_translation">
<source>Translation</source>
</trans-unit>
<trans-unit id="tx_templates_aide_dummy.name" resname="tx_templates_aide_dummy.name">
<source>dummy</source>
</trans-unit>
<trans-unit id="tx_templates_aide_dummy.description">
<trans-unit id="tx_templates_aide_dummy.description" resname="tx_templates_aide_dummy.description">
<source></source>
</trans-unit>
<trans-unit id="tx_templates_aide_translationplugin.name" resname="tx_templates_aide_translationplugin.name">
<source>translation</source>
</trans-unit>
<trans-unit id="tx_templates_aide_translationplugin.description" resname="tx_templates_aide_translationplugin.description">
<source></source>
</trans-unit>
<trans-unit id="tx_templates_aide_translation.name" resname="tx_templates_aide_translation.name">
<source>translation</source>
</trans-unit>
<trans-unit id="tx_templates_aide_translation.description" resname="tx_templates_aide_translation.description">
<source></source>
</trans-unit>
</body>

View File

@ -18,18 +18,33 @@
<f:variable name="buttonBackgroundcolor" value="#8ABF6F" />
</f:else>
</f:if>
<f:if condition="{styleH1}">
<f:else>
<f:variable name="styleH1" value="" />
</f:else>
</f:if>
<f:if condition="{styleButton}">
<f:else>
<f:variable name="styleButton" value="padding: 10px 15px; border-radius: 3px;" />
</f:else>
</f:if>
<f:variable name="widthPadded" value="{width - padding - padding}" />
<f:variable name="widthTableColumn" value="{widthPadded / 2}" />
<f:for each="{content}" as="row" key="rowKey" iteration="rowI" >
<v:condition.type.isArray value="{row.data}">
<f:else>
<f:if condition="{row.type} == 'contentBlockHtml'">
{row.data -> f:format.raw()}
</f:if>
<f:if condition="{v:condition.string.contains(haystack: '{row.type}', needle: 'headline', then: '1')}
|| {row.type} == 'text'
|| {row.type} == 'button'
|| {row.type} == 'buttonleft'
|| {row.type} == 'buttoncenter'
|| {row.type} == 'buttonright'
|| {row.type} == 'divider'
|| {row.type} == 'hr'
">
<!--[if mso | IE]>
<table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:{width}px;" width="{width}" >
@ -50,6 +65,14 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tbody>
<tr>
<f:switch expression="{row.type}">
<f:case value="divider">
<f:variable name='paddingTd' value='20px 0' />
</f:case>
<f:defaultCase>
<f:variable name='paddingTd' value='0' />
</f:defaultCase>
</f:switch>
<td style="vertical-align:top;padding:0;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style width="100%">
<tr>
@ -64,11 +87,11 @@
<f:variable name='align' value='left' />
</f:defaultCase>
</f:switch>
<td align="{align}" style="font-size:0px;padding:0;word-break:break-word;">
<td align="{align}" style="font-size:0px;padding:{paddingTd};word-break:break-word;">
<div style="font-family:Arial, sans-serif;font-size:16px;line-height:1.4;text-align:{align};color:#000000;">
<f:switch expression="{row.type}">
<f:case value="headline">
<h1>{row.data -> f:format.nl2br() -> f:format.raw()}</h1>
<h1 style="{styleH1}">{row.data -> f:format.nl2br() -> f:format.raw()}</h1>
</f:case>
<f:case value="headline2">
<h2>{row.data -> f:format.nl2br() -> f:format.raw()}</h2>
@ -90,7 +113,7 @@
<span style="display: inline-block;" class="buttonwrapper">
<f:variable name="rowData">{row.data -> v:format.json.decode()}</f:variable>
<a style="display: inline-block; color: {buttonColor}" target="_blank" href="{rowData.0}">
<span style="display: inline-block; padding: 10px 15px; border-radius: 3px; background-color: {buttonBackgroundcolor};">
<span style="display: inline-block; background-color: {buttonBackgroundcolor}; {styleButton}">
{rowData.1}
</span>
</a>
@ -101,6 +124,38 @@
{row.data -> f:format.nl2br() -> f:format.raw()}
</span>
</f:case>
<f:case value="hr">
<p style="border-top:solid 1px #bababa;font-size:1px;margin:13px auto;width:100%;">
</p>
<!--[if mso | IE]>
&nbsp;
<table
align="center"
border="0"
cellpadding="0"
cellspacing="0"
style="border-top:solid 1px #bababa;font-size:1px;margin:13px auto;width:100%;"
role="presentation"
width="550px"
>
<tr>
<td style="height:0;line-height:0;">
&nbsp;
</td>
</tr>
</table>
&nbsp;
<![endif]-->
</f:case>
<f:case value="divider">
<p style="border-top:solid 2px #025093;font-size:1px;margin:0px auto;width:100%;">
</p>
<!--[if mso | IE]>
<table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:solid 2px #025093;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" >
<tr><td style="height:0;line-height:0;"> &nbsp; </td></tr>
</table>
<![endif]-->
</f:case>
<f:defaultCase>
<p>{row.data -> f:format.nl2br() -> f:format.raw()}</p>
</f:defaultCase>
@ -137,6 +192,9 @@
<f:case value="table">
<f:variable name="type" value="table" />
</f:case>
<f:case value="tablelr">
<f:variable name="type" value="table" />
</f:case>
<f:case value="tableLayout">
<f:variable name="type" value="table" />
</f:case>
@ -178,11 +236,19 @@
</td>
<td class="" style="vertical-align:top;width:{widthTableColumn}px;">
<![endif]-->
<div class="mj-column-per-50 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<f:switch expression="{row.type}">
<f:case value="tablelr">
<f:variable name="align" value="right" />
</f:case>
<f:defaultCase>
<f:variable name="align" value="left" />
</f:defaultCase>
</f:switch>
<div class="mj-column-per-50 outlook-group-fix" style="font-size:13px;text-align:{align};direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="left" style="font-size:0px;padding:0px 4px;word-break:break-word;">
<div style="font-family:Arial, sans-serif;font-size:16px;line-height:1.4;text-align:left;color:#000000;">
<td align="{align}" style="font-size:0px;padding:0px 4px;word-break:break-word;">
<div style="font-family:Arial, sans-serif;font-size:16px;line-height:1.4;text-align:{align};color:#000000;">
<div>{row.data.1 -> f:format.nl2br() -> f:format.raw()}</div>
</div>
</td>

View File

@ -55,3 +55,19 @@ pageContentelement {
no_cache = 1
}
}
pageTranslation = PAGE
pageTranslation {
typeNum = 6001
10 = USER_INT
10 {
userFunc = Cjel\TemplatesAide\UserFunc\Translation->render
}
config {
disableAllHeaderCode = 1
xhtml_cleaning = 0
admPanel = 0
debug = 0
no_cache = 1
}
}

View File

@ -1,6 +1,3 @@
#options.pageTree.showPageIdWithTitle = 1
options.pageTree.showNavTitle = 1
options {
folderTree {
uploadFieldsInLinkBrowser = 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

View File

@ -1 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#666" d="M12.053 11.026c-.238.07-.427.095-.674.095-2.033 0-5.017-7.1-5.017-9.462 0-.87.207-1.16.497-1.41C4.373.54 1.39 1.452.435 2.613c-.207.29-.332.746-.332 1.326C.103 7.628 4.04 16 6.82 16c1.283 0 3.45-2.114 5.233-4.974M10.756 0c2.57 0 5.14.415 5.14 1.865 0 2.943-1.865 6.508-2.818 6.508-1.7 0-3.814-4.725-3.814-7.088C9.264.207 9.68 0 10.756 0"/></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill="#666" d="M12.053 11.026c-.238.07-.427.095-.674.095-2.033 0-5.017-7.1-5.017-9.462 0-.87.207-1.16.497-1.41C4.373.54 1.39 1.452.435 2.613c-.207.29-.332.746-.332 1.326C.103 7.628 4.04 16 6.82 16c1.283 0 3.45-2.114 5.233-4.974M10.756 0c2.57 0 5.14.415 5.14 1.865 0 2.943-1.865 6.508-2.818 6.508-1.7 0-3.814-4.725-3.814-7.088C9.264.207 9.68 0 10.756 0"></path>
</svg>

Before

Width:  |  Height:  |  Size: 426 B

After

Width:  |  Height:  |  Size: 476 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill="#666" d="M12.053 11.026c-.238.07-.427.095-.674.095-2.033 0-5.017-7.1-5.017-9.462 0-.87.207-1.16.497-1.41C4.373.54 1.39 1.452.435 2.613c-.207.29-.332.746-.332 1.326C.103 7.628 4.04 16 6.82 16c1.283 0 3.45-2.114 5.233-4.974M10.756 0c2.57 0 5.14.415 5.14 1.865 0 2.943-1.865 6.508-2.818 6.508-1.7 0-3.814-4.725-3.814-7.088C9.264.207 9.68 0 10.756 0"></path>
</svg>

After

Width:  |  Height:  |  Size: 476 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill="#666" d="M12.053 11.026c-.238.07-.427.095-.674.095-2.033 0-5.017-7.1-5.017-9.462 0-.87.207-1.16.497-1.41C4.373.54 1.39 1.452.435 2.613c-.207.29-.332.746-.332 1.326C.103 7.628 4.04 16 6.82 16c1.283 0 3.45-2.114 5.233-4.974M10.756 0c2.57 0 5.14.415 5.14 1.865 0 2.943-1.865 6.508-2.818 6.508-1.7 0-3.814-4.725-3.814-7.088C9.264.207 9.68 0 10.756 0"></path>
</svg>

After

Width:  |  Height:  |  Size: 476 B

View File

@ -0,0 +1,30 @@
<?php
namespace Cjel\TemplatesAide\Tests\Unit\Controller;
/**
* Test case.
*
* @author Philipp Dieter <philippdieter@attic-media.net>
*/
class TranslationControllerTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
{
/**
* @var \Cjel\TemplatesAide\Controller\TranslationController
*/
protected $subject = null;
protected function setUp()
{
parent::setUp();
$this->subject = $this->getMockBuilder(\Cjel\TemplatesAide\Controller\TranslationController::class)
->setMethods(['redirect', 'forward', 'addFlashMessage'])
->disableOriginalConstructor()
->getMock();
}
protected function tearDown()
{
parent::tearDown();
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace Cjel\TemplatesAide\Tests\Unit\Domain\Model;
/**
* Test case.
*
* @author Philipp Dieter <philippdieter@attic-media.net>
*/
class TranslationTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
{
/**
* @var \Cjel\TemplatesAide\Domain\Model\Translation
*/
protected $subject = null;
protected function setUp()
{
parent::setUp();
$this->subject = new \Cjel\TemplatesAide\Domain\Model\Translation();
}
protected function tearDown()
{
parent::tearDown();
}
/**
* @test
*/
public function dummyTestToNotLeaveThisFileEmpty()
{
self::markTestIncomplete();
}
}

View File

@ -9,7 +9,7 @@
}
],
"require": {
"typo3/cms-core": "8.7.0 - 10.99.99",
"typo3/cms-core": "8.7.0 - 11.99.99",
"sarhan/php-flatten": "^4.0"
},
"autoload": {

View File

@ -23,7 +23,6 @@ $EM_CONF[$_EXTKEY] = [
'version' => '0.0.1',
'constraints' => [
'depends' => [
'typo3' => '8.7.0-10.99.99',
],
'conflicts' => [],
'suggests' => [],

View File

@ -1,41 +1,88 @@
<?php
defined('TYPO3_MODE') || die('Access denied.');
(static function() {
})();
call_user_func(
function()
{
if (version_compare(TYPO3_branch, '10.0', '>=')) {
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Cjel.TemplatesAide',
'Dummy',
[
'Dummy' => 'list'
],
// non-cacheable actions
[
'Dummy' => ''
]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'TemplatesAide',
'Translationplugin',
[
\Cjel\TemplatesAide\Controller\TranslationController::class => 'translations'
],
// non-cacheable actions
[
\Cjel\TemplatesAide\Controller\TranslationController::class => ''
]
);
// wizards
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig(
'mod {
wizards.newContentElement.wizardItems.plugins {
elements {
dummy {
iconIdentifier = templates_aide-plugin-dummy
title = LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templates_aide_dummy.name
description = LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templates_aide_dummy.description
tt_content_defValues {
CType = list
list_type = templatesaide_dummy
} else {
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Cjel.TemplatesAide',
'Dummy',
[
'Dummy' => 'list',
'Translation' => 'translations'
],
// non-cacheable actions
[
'Dummy' => '',
'Translation' => ''
]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Cjel.TemplatesAide',
'Translationplugin',
[
'Translation' => 'translations'
],
// non-cacheable actions
[
'Dummy' => '',
'Translation' => ''
]
);
}
// wizards
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig(
'mod {
wizards.newContentElement.wizardItems.plugins {
elements {
dummy {
iconIdentifier = templates_aide-plugin-dummy
title = LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templates_aide_dummy.name
description = LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templates_aide_dummy.description
tt_content_defValues {
CType = list
list_type = templatesaide_dummy
}
}
translationplugin {
iconIdentifier = templates_aide-plugin-translationplugin
title = LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templates_aide_translationplugin.name
description = LLL:EXT:templates_aide/Resources/Private/Language/locallang_db.xlf:tx_templates_aide_translationplugin.description
tt_content_defValues {
CType = list
list_type = templatesaide_translationplugin
}
}
}
show = *
}
show = *
}
}'
);
}'
);
$iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class);
$iconRegistry->registerIcon(
@ -44,6 +91,12 @@ call_user_func(
['source' => 'EXT:templates_aide/Resources/Public/Icons/user_plugin_dummy.svg']
);
$iconRegistry->registerIcon(
'templates_aide-plugin-translationplugin',
\TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class,
['source' => 'EXT:templates_aide/Resources/Public/Icons/user_plugin_translationplugin.svg']
);
}
);
## EXTENSION BUILDER DEFAULTS END TOKEN - Everything BEFORE this line is overwritten with the defaults of the extension builder

View File

@ -11,11 +11,20 @@ call_user_func(
'dummy'
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Cjel.TemplatesAide',
'Translationplugin',
'translation'
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile('templates_aide', 'Configuration/TypoScript', 'Templates Aide');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_templatesaide_domain_model_dummy', 'EXT:templates_aide/Resources/Private/Language/locallang_csh_tx_templatesaide_domain_model_dummy.xlf');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_templatesaide_domain_model_dummy');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_templatesaide_domain_model_translation', 'EXT:templates_aide/Resources/Private/Language/locallang_csh_tx_templatesaide_domain_model_translation.xlf');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_templatesaide_domain_model_translation');
}
);
## EXTENSION BUILDER DEFAULTS END TOKEN - Everything BEFORE this line is overwritten with the defaults of the extension builder
@ -30,14 +39,25 @@ call_user_func(
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms']['db_new_content_el']['wizardItemsHook'][] =
\Cjel\TemplatesAide\Hooks\WizardItems::class;
if(\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->isDevelopment()) {
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['dev'] =
'EXT:templates_aide/Resources/Public/Css/backend/dev';
}
if(\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->__toString() === 'Production/Stage') {
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['dev'] =
'EXT:templates_aide/Resources/Public/Css/backend/production-stage';
if (version_compare(TYPO3_branch, '10.0', '>=')) {
if (\TYPO3\CMS\Core\Core\Environment::getContext()->isDevelopment()) {
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['dev'] =
'EXT:templates_aide/Resources/Public/Css/backend/dev';
}
if(\TYPO3\CMS\Core\Core\Environment::getContext()->__toString() === 'Production/Stage') {
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['dev'] =
'EXT:templates_aide/Resources/Public/Css/backend/production-stage';
}
} else {
if (\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->isDevelopment()) {
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['dev'] =
'EXT:templates_aide/Resources/Public/Css/backend/dev';
}
if(\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->__toString() === 'Production/Stage') {
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['dev'] =
'EXT:templates_aide/Resources/Public/Css/backend/production-stage';
}
}
$GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['templates_aide_default'] =
@ -75,4 +95,3 @@ $GLOBALS['TYPO3_USER_SETTINGS']['showitem'] = str_replace(
'recursiveDelete,disableDragModal',
$GLOBALS['TYPO3_USER_SETTINGS']['showitem'],
);

View File

@ -0,0 +1,77 @@
#
# Table structure for table 'tx_templatesaide_domain_model_dummy'
#
CREATE TABLE tx_templatesaide_domain_model_dummy (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) unsigned DEFAULT '0' NOT NULL,
crdate int(11) unsigned DEFAULT '0' NOT NULL,
cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
deleted smallint(5) unsigned DEFAULT '0' NOT NULL,
hidden smallint(5) unsigned DEFAULT '0' NOT NULL,
starttime int(11) unsigned DEFAULT '0' NOT NULL,
endtime int(11) unsigned DEFAULT '0' NOT NULL,
t3ver_oid int(11) DEFAULT '0' NOT NULL,
t3ver_id int(11) DEFAULT '0' NOT NULL,
t3ver_wsid int(11) DEFAULT '0' NOT NULL,
t3ver_label varchar(255) DEFAULT '' NOT NULL,
t3ver_state smallint(6) DEFAULT '0' NOT NULL,
t3ver_stage int(11) DEFAULT '0' NOT NULL,
t3ver_count int(11) DEFAULT '0' NOT NULL,
t3ver_tstamp int(11) DEFAULT '0' NOT NULL,
t3ver_move_id int(11) DEFAULT '0' NOT NULL,
sys_language_uid int(11) DEFAULT '0' NOT NULL,
l10n_parent int(11) DEFAULT '0' NOT NULL,
l10n_diffsource mediumblob,
l10n_state text,
PRIMARY KEY (uid),
KEY parent (pid),
KEY t3ver_oid (t3ver_oid,t3ver_wsid),
KEY language (l10n_parent,sys_language_uid)
);
#
# Table structure for table 'tx_templatesaide_domain_model_translation'
#
CREATE TABLE tx_templatesaide_domain_model_translation (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) unsigned DEFAULT '0' NOT NULL,
crdate int(11) unsigned DEFAULT '0' NOT NULL,
cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
deleted smallint(5) unsigned DEFAULT '0' NOT NULL,
hidden smallint(5) unsigned DEFAULT '0' NOT NULL,
starttime int(11) unsigned DEFAULT '0' NOT NULL,
endtime int(11) unsigned DEFAULT '0' NOT NULL,
t3ver_oid int(11) DEFAULT '0' NOT NULL,
t3ver_id int(11) DEFAULT '0' NOT NULL,
t3ver_wsid int(11) DEFAULT '0' NOT NULL,
t3ver_label varchar(255) DEFAULT '' NOT NULL,
t3ver_state smallint(6) DEFAULT '0' NOT NULL,
t3ver_stage int(11) DEFAULT '0' NOT NULL,
t3ver_count int(11) DEFAULT '0' NOT NULL,
t3ver_tstamp int(11) DEFAULT '0' NOT NULL,
t3ver_move_id int(11) DEFAULT '0' NOT NULL,
sys_language_uid int(11) DEFAULT '0' NOT NULL,
l10n_parent int(11) DEFAULT '0' NOT NULL,
l10n_diffsource mediumblob,
l10n_state text,
PRIMARY KEY (uid),
KEY parent (pid),
KEY t3ver_oid (t3ver_oid,t3ver_wsid),
KEY language (l10n_parent,sys_language_uid)
);
## EXTENSION BUILDER DEFAULTS END TOKEN - Everything BEFORE this line is overwritten with the defaults of the extension builder