[MERGE] Branch 'master' of ssh://phabricator.glanzstueck.agency/source/typo3-template_aide

This commit is contained in:
Philipp Dieter
2022-05-07 02:34:12 +02:00
15 changed files with 489 additions and 61 deletions

View File

@@ -45,7 +45,11 @@ class ArrayUtility
$value = self::removeEmptyStrings($value);
} else {
if (is_string($value) && !strlen($value)) {
unset($array[$key]);
if (is_array($array)) {
unset($array[$key]);
} else {
unset($array->$key);
}
}
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace Cjel\TemplatesAide\Utility;
/***
*
* 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) 2022 Philipp Dieter
*
***/
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper;
/**
* Holds functions to help with database interactions
*/
class DatabaseUtility
{
/**
* Mysql date format
*/
const MYSQL_DATE_FORMAT = 'Y-m-d H:i:s';
/**
* Returns table name by model
*
* @param $model object model
* @return string table name
*/
public static function getTableNameFromModelClass($class)
{
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$dataMapper = $objectManager->get(DataMapper::class);
return $dataMapper->getDataMap($class)->getTableName();
}
/**
* Creates a new query builder and returns it
*
* @param $tablename string table name
* @return object queryBuilder
*/
public static function getQueryBuilderFromTableName($tableName)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable($tableName)
->createQueryBuilder();
return $queryBuilder;
}
}

View File

@@ -59,6 +59,18 @@ class MailUtility
$type = 'list';
$textPart = substr($textPart, 2);
}
if (substr($textPart, 0, 3) === '+< ') {
$type = 'buttonleft';
$textPart = substr($textPart, 3);
}
if (substr($textPart, 0, 3) === '+| ') {
$type = 'buttoncenter';
$textPart = substr($textPart, 3);
}
if (substr($textPart, 0, 3) === '+> ') {
$type = 'buttonright';
$textPart = substr($textPart, 3);
}
if (substr($textPart, 0, 2) === '| ') {
$type = 'table';
$textPart = substr($textPart, 2);
@@ -116,6 +128,28 @@ class MailUtility
return $result;
}
/**
* Gets row from content by given type
*
* @param array $content the mail content
* @param string $type the type to search
*/
public static function extractByType($content, $type)
{
$elementPosition = array_search(
$type,
array_column($content, 'type')
);
if (!$elementPosition === false) {
return;
}
if (!array_key_exists('data', $content[$elementPosition])) {
return;
}
return $content[$elementPosition]['data'];
}
/**
* tages maildata, builds html and text mails an decides where to send them
* allows to intercept sender for testing
@@ -195,6 +229,10 @@ class MailUtility
case 'headline':
case 'headline2':
case 'headline3':
case 'button':
case 'buttonleft':
case 'buttoncenter':
case 'buttonright':
$row['data'] = str_replace(
"\\\n",
'',
@@ -203,16 +241,33 @@ class MailUtility
$htmlRow = $row;
$htmlRow['data'] = preg_replace_callback(
'/\[.*\]/mU',
function($matches) {
function($matches) use ($row) {
foreach ($matches as $match) {
return preg_replace_callback(
'/\[(\S*)\s(.*)\]/mU',
function($matchesInner) {
return '<a href="'
. $matchesInner[1]
. '">'
. $matchesInner[2]
. '</a>';
function($matchesInner) use ($row) {
switch($row['type']) {
case 'button':
case 'buttonleft':
case 'buttoncenter':
case 'buttonright':
return '<a style="display: inline-block;" href="'
. $matchesInner[1]
. '">'
. '<span style="display: inline-block; padding: 10px 15px; border-radius: 3px; background-color: red;">'
. 'Button!!!! '
. $matchesInner[2]
. '</span>'
. '</a>';
break;
default:
return '<a href="'
. $matchesInner[1]
. '">'
. $matchesInner[2]
. '</a>';
break;
}
},
$match
);
@@ -257,51 +312,77 @@ class MailUtility
$bodydataText[] = $textRow;
$bodydataHtml[] = $htmlRow;
break;
case 'button':
case 'buttons':
$htmlRow = $row;
//$htmlRow['targets'] = preg_replace_callback(
// '/\[.*\]/mU',
// function($matches) {
// foreach ($matches as $match) {
// return preg_replace_callback(
// '/\[(\S*)\s(.*)\]/mU',
// function($matchesInner) {
// return $matchesInner;
// //return '<a href="'
// // . $matchesInner[1]
// // . '">'
// // . $matchesInner[2]
// // . '</a>';
// },
// $match
// );
// }
// },
// $htmlRow['targets']
//);
$textRow = $row;
//$textRow['targets'] = preg_replace_callback(
// '/\[.*\]/mU',
// function($matches) {
// foreach ($matches as $match) {
// return preg_replace_callback(
// '/\[(\S*)\s(.*)\]/mU',
// function($matchesInner) {
// return $matchesInner;
// //return $matchesInner[2]
// // . ': '
// // . $matchesInner[1];
// },
// $match
// );
// }
// },
// $textRow['targets']
//);
$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 'attachment':
$mail->attach(new \Swift_Attachment(
$row['data'][0],
@@ -325,6 +406,9 @@ class MailUtility
}
$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;

View File

@@ -15,6 +15,7 @@ namespace Cjel\TemplatesAide\Utility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser;
/**
* Utility to work with site config
@@ -35,20 +36,33 @@ class SiteConfigUtility
$objectManager = GeneralUtility::makeInstance(
ObjectManager::class
);
$typoScriptParser = GeneralUtility::makeInstance(
TypoScriptParser::class
);
$configurationManager = $objectManager->get(
ConfigurationManagerInterface::class
);
$typoscript = $configurationManager->getConfiguration(
ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT
);
$typoscript = GeneralUtility::removeDotsFromTS($typoscript);
$siteConfig = $typoscript;
if ($limitToSiteConfig) {
$siteConfig = $typoscript['config']['site'];
$siteConfig = $typoscript['config.']['site.'];
}
$current = &$siteConfig;
foreach ($pathParts as $key) {
if ($current[$key . '.']) {
$key .= '.';
}
$current = &$current[$key];
if (isset($current[0]) && $current[0] === '<') {
$searchkey = trim(substr($current, 1));
list($name, $conf) = $typoScriptParser->getVal(
$searchkey,
$typoscript
);
$current = $conf;
}
}
if (is_array($current)
&& array_key_exists('value', $current)

View File

@@ -0,0 +1,64 @@
<?php
namespace Cjel\TemplatesAide\ViewHelpers;
/***
*
* 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) 2022 Philipp Dieter <philipp.dieter@attic-media.net>
*
***/
use Cjel\TemplatesAide\Utility\SiteConfigUtility;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
class SiteConfigViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
/**
* Initialize arguements
*
* @return void
*/
public function initializeArguments()
{
$this->registerArgument(
'key',
'string',
'The config key to get',
true
);
$this->registerArgument(
'siteConfig',
'bool',
'Limit the typoscript to the config.site part',
false,
true
);
}
/**
* Render tranlation
*
* @param $arguments array arguments
* @param $renderChildrenClosure Closure
* @param $renderingContext $renderChildrenClosure
* @return string
*/
public static function renderStatic(
array $arguments,
\Closure $renderChildrenClosure,
RenderingContextInterface $renderingContext
) {
return SiteConfigUtility::getByPath(
$arguments['key'],
$arguments['siteConfig']
);
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace Cjel\TemplatesAide\ViewHelpers;
/***
*
* 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) 2022 Philipp Dieter <philipp.dieter@attic-media.net>
*
***/
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
class TranslationViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
/**
* Initialize arguements
*
* @return void
*/
public function initializeArguments()
{
$this->registerArgument(
'key',
'string',
'The translation key to render',
true
);
}
/**
* Render tranlation
*
* @param $arguments array arguments
* @param $renderChildrenClosure Closure
* @param $renderingContext $renderChildrenClosure
* @return string
*/
public static function renderStatic(
array $arguments,
\Closure $renderChildrenClosure,
RenderingContextInterface $renderingContext
) {
return 'this.extension.translation';
}
}