Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
T
t3olayout
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
31
Issues
31
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
7
Merge Requests
7
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Package Registry
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
services
T
t3o sites
common
t3olayout
Commits
bec1b064
Commit
bec1b064
authored
Apr 16, 2020
by
Thomas Löffler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Small cleanup
* Remove unused class * Remove obsolete class * Remove .gitkeep files
parent
49681637
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1 addition
and
510 deletions
+1
-510
Classes/DataProcessing/.gitkeep
Classes/DataProcessing/.gitkeep
+0
-1
Classes/DataProcessing/MenuProcessor.php
Classes/DataProcessing/MenuProcessor.php
+0
-489
Classes/Domain/.gitkeep
Classes/Domain/.gitkeep
+0
-1
Classes/Domain/Model/.gitkeep
Classes/Domain/Model/.gitkeep
+0
-1
Classes/Domain/Repository/.gitkeep
Classes/Domain/Repository/.gitkeep
+0
-1
Classes/ViewHelpers/.gitkeep
Classes/ViewHelpers/.gitkeep
+0
-1
ext_localconf.php
ext_localconf.php
+1
-16
No files found.
Classes/DataProcessing/.gitkeep
deleted
100755 → 0
View file @
49681637
Classes/DataProcessing/MenuProcessor.php
deleted
100644 → 0
View file @
49681637
<?php
namespace
T3o\T3olayout\DataProcessing
;
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
use
TYPO3\CMS\Core\Utility\GeneralUtility
;
use
TYPO3\CMS\Frontend\ContentObject\ContentDataProcessor
;
use
TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
;
use
TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface
;
/**
* This menu processor utilizes HMENU to generate a json encoded menu
* string that will be decoded again and assigned to FLUIDTEMPLATE as
* variable. Additional DataProcessing is supported and will be applied
* to each record.
*
* Options:
* as - The variable to be used within the result
* levels - Number of levels of the menu
* expandAll = If false, submenus will only render if the parent page is active
* includeSpacer = If true, pagetype spacer will be included in the menu
* titleField = Field that should be used for the title
*
* See HMENU docs for more options.
* https://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/Hmenu/Index.html
*
*
* Example TypoScript configuration:
*
* 10 = t3o\t3olayout\DataProcessing\MenuProcessor
* 10 {
* special = list
* special.value.field = pages
* levels = 7
* as = menu
* expandAll = 1
* includeSpacer = 1
* titleField = nav_title // title
* dataProcessing {
* 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
* 10 {
* references.fieldName = media
* }
* }
* }
*/
class
MenuProcessor
implements
DataProcessorInterface
{
const
LINK_PLACEHOLDER
=
'###LINKPLACEHOLDER###'
;
const
TARGET_PLACEHOLDER
=
'###TARGETPLACEHOLDER###'
;
/**
* The content object renderer
*
* @var ContentObjectRenderer
*/
public
$cObj
;
/**
* The processor configuration
*
* @var array
*/
protected
$processorConfiguration
;
/**
* Allowed configuration keys for menu generation, other keys
* will throw an exception to prevent configuration errors.
*
* @var array
*/
public
$allowedConfigurationKeys
=
[
'cache_period'
,
'entryLevel'
,
'entryLevel.'
,
'special'
,
'special.'
,
'minItems'
,
'minItems.'
,
'maxItems'
,
'maxItems.'
,
'begin'
,
'begin.'
,
'excludeUidList'
,
'excludeUidList.'
,
'excludeDoktypes'
,
'includeNotInMenu'
,
'alwaysActivePIDlist'
,
'alwaysActivePIDlist.'
,
'protectLvar'
,
'addQueryString'
,
'if'
,
'if.'
,
'levels'
,
'expandAll'
,
'includeSpacer'
,
'as'
,
'titleField'
,
'dataProcessing'
,
'dataProcessing.'
];
/**
* Remove keys from configuration that should not be passed
* to HMENU to prevent configuration errors
*
* @var array
*/
public
$removeConfigurationKeysForHmenu
=
[
'levels'
,
'expandAll'
,
'includeSpacer'
,
'as'
,
'titleField'
,
'dataProcessing'
,
'dataProcessing.'
];
/**
* @var array
*/
protected
$menuConfig
=
[
'wrap'
=>
'[|]'
];
/**
* @var array
*/
protected
$menuLevelConfig
=
[
'doNotLinkIt'
=>
'1'
,
'wrapItemAndSub'
=>
'{|}, |*| {|}, |*| {|}'
,
'stdWrap.'
=>
[
'cObject'
=>
'COA'
,
'cObject.'
=>
[
'10'
=>
'USER'
,
'10.'
=>
[
'userFunc'
=>
't3o\t3olayout\DataProcessing\MenuProcessor->getDataAsJson'
,
'stdWrap.'
=>
[
'wrap'
=>
'"data":|'
]
],
'20'
=>
'TEXT'
,
'20.'
=>
[
'field'
=>
'nav_title // title'
,
'trim'
=>
'1'
,
'wrap'
=>
',"title":|'
,
'preUserFunc'
=>
't3o\t3olayout\DataProcessing\MenuProcessor->jsonEncodeUserFunc'
],
'21'
=>
'TEXT'
,
'21.'
=>
[
'value'
=>
self
::
LINK_PLACEHOLDER
,
'wrap'
=>
',"link":|'
,
],
'22'
=>
'TEXT'
,
'22.'
=>
[
'value'
=>
self
::
TARGET_PLACEHOLDER
,
'wrap'
=>
',"target":|'
,
],
'30'
=>
'TEXT'
,
'30.'
=>
[
'value'
=>
'0'
,
'wrap'
=>
',"active":|'
],
'40'
=>
'TEXT'
,
'40.'
=>
[
'value'
=>
'0'
,
'wrap'
=>
',"current":|'
],
'50'
=>
'TEXT'
,
'50.'
=>
[
'value'
=>
'0'
,
'wrap'
=>
',"spacer":|'
]
]
]
];
/**
* @var array
*/
public
$menuDefaults
=
[
'levels'
=>
1
,
'expandAll'
=>
1
,
'includeSpacer'
=>
0
,
'as'
=>
'menu'
,
'titleField'
=>
'nav_title // title'
];
/**
* @var int
*/
protected
$menuLevels
;
/**
* @var int
*/
protected
$menuExpandAll
;
/**
* @var int
*/
protected
$menuIncludeSpacer
;
/**
* @var string
*/
protected
$menuTitleField
;
/**
* @var string
*/
protected
$menuTargetVariableName
;
/**
* @var ContentDataProcessor
*/
protected
$contentDataProcessor
;
/**
* Constructor
*/
public
function
__construct
()
{
$this
->
contentDataProcessor
=
GeneralUtility
::
makeInstance
(
ContentDataProcessor
::
class
);
}
/**
* Get configuration value from processorConfiguration
*
* @param string $key
* @return string
*/
protected
function
getConfigurationValue
(
$key
)
{
return
$this
->
cObj
->
stdWrapValue
(
$key
,
$this
->
processorConfiguration
,
$this
->
menuDefaults
[
$key
]);
}
/**
* Validate configuration
*
* @throws \InvalidArgumentException
*/
public
function
validateConfiguration
()
{
$invalidArguments
=
[];
foreach
(
$this
->
processorConfiguration
as
$key
=>
$value
)
{
if
(
!
in_array
(
$key
,
$this
->
allowedConfigurationKeys
))
{
$invalidArguments
[
str_replace
(
'.'
,
''
,
$key
)]
=
$key
;
}
}
if
(
!
empty
(
$invalidArguments
))
{
throw
new
\
InvalidArgumentException
(
'MenuProcessor Configuration contains invalid Arguments: '
.
implode
(
', '
,
$invalidArguments
),
1478806566
);
}
}
/**
* Prepare Configuration
*/
public
function
prepareConfiguration
()
{
$this
->
menuConfig
+=
$this
->
processorConfiguration
;
// Filter configuration
foreach
(
$this
->
menuConfig
as
$key
=>
$value
)
{
if
(
in_array
(
$key
,
$this
->
removeConfigurationKeysForHmenu
))
{
unset
(
$this
->
menuConfig
[
$key
]);
}
}
// Process special value
if
(
isset
(
$this
->
menuConfig
[
'special.'
][
'value.'
]))
{
$this
->
menuConfig
[
'special.'
][
'value'
]
=
$this
->
cObj
->
stdWrap
(
$this
->
menuConfig
[
'special.'
][
'value'
],
$this
->
menuConfig
[
'special.'
][
'value.'
]);
unset
(
$this
->
menuConfig
[
'special.'
][
'value.'
]);
}
}
/**
*/
public
function
prepareLevelConfiguration
()
{
$this
->
menuLevelConfig
[
'stdWrap.'
][
'cObject.'
]
=
array_replace_recursive
(
$this
->
menuLevelConfig
[
'stdWrap.'
][
'cObject.'
],
[
'20.'
=>
[
'field'
=>
$this
->
menuTitleField
,
]
]
);
}
/**
*/
public
function
prepareLevelLanguageConfiguration
()
{
if
(
$this
->
menuConfig
[
'special'
]
===
'language'
)
{
$this
->
menuLevelConfig
[
'stdWrap.'
][
'cObject.'
]
=
array_replace_recursive
(
$this
->
menuLevelConfig
[
'stdWrap.'
][
'cObject.'
],
[
'60'
=>
'TEXT'
,
'60.'
=>
[
'value'
=>
'1'
,
'wrap'
=>
',"available":|'
],
'70'
=>
'TEXT'
,
'70.'
=>
[
'value'
=>
$this
->
menuConfig
[
'special.'
][
'value'
],
'listNum.'
=>
[
'stdWrap.'
=>
[
'data'
=>
'register:count_HMENU_MENUOBJ'
,
'wrap'
=>
'|-1'
],
'splitChar'
=>
','
],
'wrap'
=>
',"languageUid":"|"'
]
]
);
}
}
/**
*/
public
function
buildConfiguration
()
{
for
(
$i
=
1
;
$i
<=
$this
->
menuLevels
;
$i
++
)
{
$this
->
menuConfig
[
$i
]
=
'TMENU'
;
$this
->
menuConfig
[
$i
.
'.'
][
'IProcFunc'
]
=
't3o\t3olayout\DataProcessing\MenuProcessor->replacePlaceholderInRenderedMenuItem'
;
if
(
$i
>
1
)
{
$this
->
menuConfig
[
$i
.
'.'
][
'stdWrap.'
][
'wrap'
]
=
',"children": [|]'
;
}
$this
->
menuConfig
[
$i
.
'.'
][
'expAll'
]
=
$this
->
menuExpandAll
;
$this
->
menuConfig
[
$i
.
'.'
][
'NO'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'NO.'
]
=
$this
->
menuLevelConfig
;
if
(
$this
->
menuIncludeSpacer
)
{
$this
->
menuConfig
[
$i
.
'.'
][
'SPC'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'SPC.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'NO.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'SPC.'
][
'stdWrap.'
][
'cObject.'
][
'50.'
][
'value'
]
=
'1'
;
}
$this
->
menuConfig
[
$i
.
'.'
][
'IFSUB'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'IFSUB.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'NO.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'ACT'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'ACT.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'NO.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'ACT.'
][
'stdWrap.'
][
'cObject.'
][
'30.'
][
'value'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'ACTIFSUB'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'ACTIFSUB.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'ACT.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'CUR'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'CUR.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'ACT.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'CUR.'
][
'stdWrap.'
][
'cObject.'
][
'40.'
][
'value'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'CURIFSUB'
]
=
'1'
;
$this
->
menuConfig
[
$i
.
'.'
][
'CURIFSUB.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'CUR.'
];
if
(
$this
->
menuConfig
[
'special'
]
===
'language'
)
{
$this
->
menuConfig
[
$i
.
'.'
][
'USERDEF1'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'NO'
];
$this
->
menuConfig
[
$i
.
'.'
][
'USERDEF1.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'NO.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'USERDEF1.'
][
'stdWrap.'
][
'cObject.'
][
'60.'
][
'value'
]
=
'0'
;
$this
->
menuConfig
[
$i
.
'.'
][
'USERDEF2'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'ACT'
];
$this
->
menuConfig
[
$i
.
'.'
][
'USERDEF2.'
]
=
$this
->
menuConfig
[
$i
.
'.'
][
'ACT.'
];
$this
->
menuConfig
[
$i
.
'.'
][
'USERDEF2.'
][
'stdWrap.'
][
'cObject.'
][
'60.'
][
'value'
]
=
'0'
;
}
}
}
/**
* @param ContentObjectRenderer $cObj The data of the content element or page
* @param array $contentObjectConfiguration The configuration of Content Object
* @param array $processorConfiguration The configuration of this processor
* @param array $processedData Key/value store of processed data (e.g. to be passed to a Fluid View)
* @return array the processed data as key/value store
*/
public
function
process
(
ContentObjectRenderer
$cObj
,
array
$contentObjectConfiguration
,
array
$processorConfiguration
,
array
$processedData
)
{
$this
->
cObj
=
$cObj
;
$this
->
processorConfiguration
=
$processorConfiguration
;
// Get Configuration
$this
->
menuLevels
=
(
int
)
$this
->
getConfigurationValue
(
'levels'
)
?:
1
;
$this
->
menuExpandAll
=
(
int
)
$this
->
getConfigurationValue
(
'expandAll'
);
$this
->
menuIncludeSpacer
=
(
int
)
$this
->
getConfigurationValue
(
'includeSpacer'
);
$this
->
menuTargetVariableName
=
$this
->
getConfigurationValue
(
'as'
);
$this
->
menuTitleField
=
$this
->
getConfigurationValue
(
'titleField'
);
// Validate Configuration
$this
->
validateConfiguration
();
// Build Configuration
$this
->
prepareConfiguration
();
$this
->
prepareLevelConfiguration
();
$this
->
prepareLevelLanguageConfiguration
();
$this
->
buildConfiguration
();
// Process Configuration
$menuContentObject
=
$cObj
->
getContentObject
(
'HMENU'
);
$renderedMenu
=
$menuContentObject
->
render
(
$this
->
menuConfig
);
if
(
!
$renderedMenu
)
{
return
$processedData
;
}
// Process menu
$menu
=
json_decode
(
$renderedMenu
,
true
);
$processedMenu
=
[];
foreach
(
$menu
as
$key
=>
$page
)
{
$processedMenu
[
$key
]
=
$this
->
processAdditionalDataProcessors
(
$page
,
$processorConfiguration
);
}
// Return processed data
$processedData
[
$this
->
menuTargetVariableName
]
=
$processedMenu
;
return
$processedData
;
}
/**
* Process additional data processors
*
* @param array $page
* @param array $processorConfiguration
*/
protected
function
processAdditionalDataProcessors
(
$page
,
$processorConfiguration
)
{
if
(
is_array
(
$page
[
'children'
]))
{
foreach
(
$page
[
'children'
]
as
$key
=>
$item
)
{
$page
[
'children'
][
$key
]
=
$this
->
processAdditionalDataProcessors
(
$item
,
$processorConfiguration
);
}
}
/** @var ContentObjectRenderer $recordContentObjectRenderer */
$recordContentObjectRenderer
=
GeneralUtility
::
makeInstance
(
ContentObjectRenderer
::
class
);
$recordContentObjectRenderer
->
start
(
$page
[
'data'
],
'pages'
);
$processedPage
=
$this
->
contentDataProcessor
->
process
(
$recordContentObjectRenderer
,
$processorConfiguration
,
$page
);
return
$processedPage
;
}
/**
* Gets the data of the current record in JSON format
*
* @return string JSON encoded data
*/
public
function
getDataAsJson
()
{
return
$this
->
jsonEncode
(
$this
->
cObj
->
data
);
}
/**
* This UserFunc encodes the content as Json
*
* @param string $content
* @param array $conf
* @return string JSON encoded content
*/
public
function
jsonEncodeUserFunc
(
$content
,
$conf
)
{
$content
=
$this
->
jsonEncode
(
$content
);
return
$content
;
}
/**
* JSON Encode
*
* @param mixed $value
* @return string
*/
public
function
jsonEncode
(
$value
)
{
return
json_encode
(
$value
,
JSON_HEX_TAG
|
JSON_HEX_APOS
|
JSON_HEX_QUOT
|
JSON_HEX_AMP
|
JSON_UNESCAPED_UNICODE
);
}
/**
* This UserFunc gets the link and the target
*
* @param array $menuItem
* @param array $conf
*/
public
function
replacePlaceholderInRenderedMenuItem
(
$menuItem
,
$conf
)
{
$link
=
$this
->
jsonEncode
(
$menuItem
[
'linkHREF'
][
'HREF'
]);
$target
=
$this
->
jsonEncode
(
$menuItem
[
'linkHREF'
][
'TARGET'
]);
$menuItem
[
'parts'
][
'title'
]
=
str_replace
(
self
::
LINK_PLACEHOLDER
,
$link
,
$menuItem
[
'parts'
][
'title'
]);
$menuItem
[
'parts'
][
'title'
]
=
str_replace
(
self
::
TARGET_PLACEHOLDER
,
$target
,
$menuItem
[
'parts'
][
'title'
]);
return
$menuItem
;
}
}
Classes/Domain/.gitkeep
deleted
100755 → 0
View file @
49681637
Classes/Domain/Model/.gitkeep
deleted
100755 → 0
View file @
49681637
Classes/Domain/Repository/.gitkeep
deleted
100755 → 0
View file @
49681637
Classes/ViewHelpers/.gitkeep
deleted
100755 → 0
View file @
49681637
ext_localconf.php
View file @
bec1b064
...
...
@@ -24,21 +24,6 @@ SETUP {
}'
);
if
(
class_exists
(
'T3o\T3olayout\Hooks\MultiContentPreviewRenderer'
))
{
$GLOBALS
[
'TYPO3_CONF_VARS'
][
'SC_OPTIONS'
][
'cms/layout/class.tx_cms_layout.php'
][
'tt_content_drawItem'
][]
=
\
T3o\T3olayout\Hooks\MultiContentPreviewRenderer
::
class
;
}
/***************
* Set alias for menu processor as fallback if the core menu
* processor does not exist for TYPO3 Versions below 8.5
*/
if
(
!
class_exists
(
'TYPO3\CMS\Frontend\DataProcessing\MenuProcessor'
))
{
class_alias
(
\
T3o\T3olayout\DataProcessing\MenuProcessor
::
class
,
'TYPO3\CMS\Frontend\DataProcessing\MenuProcessor'
);
}
unset
(
$GLOBALS
[
'TYPO3_CONF_VARS'
][
'SC_OPTIONS'
][
'cms/layout/class.tx_cms_layout.php'
][
'tt_content_drawItem'
][
'textmedia'
]);
$GLOBALS
[
'TYPO3_CONF_VARS'
][
'RTE'
][
'Presets'
][
'custom'
]
=
'EXT:t3olayout/Configuration/Yaml/Rte/Custom.yaml'
;
...
...
@@ -47,6 +32,6 @@ $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['nolink'] = 'EXT:t3olayout/Configu
$GLOBALS
[
'TYPO3_CONF_VARS'
][
'EXTENSIONS'
][
'backend'
][
'loginBackgroundImage'
]
=
'EXT:t3olayout/Resources/Public/Images/login_background.jpg'
;
// Deactivate deprecation log for stage and production
if
(
\
TYPO3\CMS\Core\
Utility\GeneralUtility
::
getApplicationContext
()
!==
'Development'
)
{
if
(
\
TYPO3\CMS\Core\
Core\Environment
::
getContext
()
->
isProduction
()
||
\
TYPO3\CMS\Core\Core\Environment
::
getContext
()
->
isTesting
()
)
{
$GLOBALS
[
'TYPO3_CONF_VARS'
][
'LOG'
][
'TYPO3'
][
'CMS'
][
'deprecations'
][
'writerConfiguration'
][
\
TYPO3\CMS\Core\Log\LogLevel
::
NOTICE
]
=
[];
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment