├── .github
├── FUNDING.yml
└── workflows
│ ├── ci.yaml
│ └── release.yaml
├── .gitignore
├── Build
├── .php_cs
├── FunctionalTests.xml
├── UnitTests.xml
├── UpdateChangelog.php
├── ecs.php
├── phpstan.neon
└── rector.php
├── CHANGELOG.md
├── Classes
├── Eid
│ └── CallAjax.php
├── Pagination
│ └── SimplePagination.php
├── Reports
│ ├── AbstractReport.php
│ ├── CommandControllers.php
│ ├── Eid.php
│ ├── EventDispatcher.php
│ ├── Extensions.php
│ ├── Hooks.php
│ ├── LogErrors.php
│ ├── Middlewares.php
│ ├── Plugins.php
│ ├── Status.php
│ ├── WebsiteConf.php
│ └── Xclass.php
├── Utility.php
└── ViewHelpers
│ ├── ContentInfosViewHelper.php
│ ├── InListViewHelper.php
│ ├── RawViewHelper.php
│ └── SpriteManagerIconViewHelper.php
├── Configuration
├── Backend
│ └── Routes.php
├── Icons.php
└── Services.yaml
├── Documentation
└── README.md
├── LICENSE.txt
├── README.md
├── Resources
├── Private
│ ├── Language
│ │ ├── de.locallang.xlf
│ │ ├── fr.locallang.xlf
│ │ └── locallang.xlf
│ ├── Partials
│ │ └── Pagination.html
│ └── Templates
│ │ ├── commandcontrollers-fluid.html
│ │ ├── eid-fluid.html
│ │ ├── events-fluid.html
│ │ ├── extensions-fluid.html
│ │ ├── hooks-fluid.html
│ │ ├── logerrors-fluid.html
│ │ ├── middlewares-fluid.html
│ │ ├── plugins-fluid.html
│ │ ├── status-fluid.html
│ │ ├── websiteconf-fluid.html
│ │ └── xclass-fluid.html
└── Public
│ ├── Css
│ └── tx_additionalreports.css
│ ├── Icons
│ ├── Extension.svg
│ ├── garbage.gif
│ ├── module_web_layout.gif
│ ├── module_web_list.gif
│ ├── reddown.gif
│ ├── redup.gif
│ ├── refresh_n.gif
│ ├── tx_additionalreports_ajax.png
│ ├── tx_additionalreports_clikeys.png
│ ├── tx_additionalreports_commandcontrollers.png
│ ├── tx_additionalreports_dbcheck.png
│ ├── tx_additionalreports_eid.png
│ ├── tx_additionalreports_eventdispatcher.png
│ ├── tx_additionalreports_extdirect.png
│ ├── tx_additionalreports_extensions.png
│ ├── tx_additionalreports_hooks.png
│ ├── tx_additionalreports_logerrors.png
│ ├── tx_additionalreports_middlewares.png
│ ├── tx_additionalreports_plugins.png
│ ├── tx_additionalreports_realurlerrors.png
│ ├── tx_additionalreports_status.png
│ ├── tx_additionalreports_websitesconf.png
│ ├── tx_additionalreports_xclass.png
│ └── zoom.gif
│ ├── Images
│ ├── ajax.png
│ ├── clikeys.png
│ ├── commands.png
│ ├── ctypes.png
│ ├── eid.png
│ ├── eventdispatcher.png
│ ├── extdirect.png
│ ├── extensions-diff.png
│ ├── extensions.png
│ ├── hooks.png
│ ├── logs.png
│ ├── middlewares.png
│ ├── plugins.png
│ ├── realurl.png
│ ├── sql.png
│ ├── status-typo3.png
│ ├── status1.png
│ ├── status2.png
│ ├── summary.png
│ ├── websites.png
│ └── xclass.png
│ └── JavaScript
│ └── plugins.js
├── Tests
├── Functional
│ ├── Fixtures
│ │ ├── be_users.csv
│ │ ├── pages.csv
│ │ ├── pages.xml
│ │ ├── tt_content.csv
│ │ └── tt_content.xml
│ ├── FunctionalTestCase.php
│ ├── Reports
│ │ ├── CommandControllersTest.php
│ │ ├── EidTest.php
│ │ ├── ExtensionsTest.php
│ │ ├── HooksTest.php
│ │ ├── LogErrorsTest.php
│ │ ├── MiddlewaresTest.php
│ │ ├── PluginsTest.php
│ │ ├── StatusTest.php
│ │ ├── WebsiteConfTest.php
│ │ └── XclassTest.php
│ └── UtilityTest.php
└── Unit
│ └── UtilityTest.php
├── composer.json
├── ext_conf_template.txt
├── ext_emconf.php
└── ext_tables.php
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: https://paypal.me/cerdanyohann
2 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yaml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | pull_request:
8 | branches:
9 | - master
10 | jobs:
11 | build:
12 | name: Build PHP/TYPO3
13 | runs-on: ubuntu-22.04
14 | strategy:
15 | fail-fast: false
16 | matrix:
17 | php-versions: [ '8.2' ]
18 | packages:
19 | - typo3: '^12'
20 | testingframework: '^8'
21 | - typo3: '^13'
22 | testingframework: 'dev-main'
23 | steps:
24 | - name: Check out repository
25 | uses: actions/checkout@v3
26 | with:
27 | fetch-depth: 1
28 | - name: Setup PHP version
29 | uses: shivammathur/setup-php@v2
30 | with:
31 | php-version: ${{ matrix.php-versions }}
32 | extensions: mbstring
33 | tools: composer:v2.2
34 | - name: Install composer dependencies
35 | run: |
36 | composer --version
37 | composer require typo3/cms-core=${{ matrix.packages.typo3 }} typo3/cms-reports=${{ matrix.packages.typo3 }} "typo3/testing-framework:${{ matrix.packages.testingframework }}"
38 | git checkout composer.json
39 | - name: Run PHP linter
40 | run: |
41 | find . -name \*.php ! -path "./.Build/*" -exec php -l {} \;
42 | - name: Run unit tests
43 | run: |
44 | .Build/bin/phpunit -c Build/UnitTests.xml
45 | - name: Start MySQL
46 | run: sudo /etc/init.d/mysql start
47 | - name: Run functional tests
48 | run: |
49 | export typo3DatabaseName="typo3";
50 | export typo3DatabaseHost="127.0.0.1";
51 | export typo3DatabaseUsername="root";
52 | export typo3DatabasePassword="root";
53 | .Build/bin/phpunit -c Build/FunctionalTests.xml
--------------------------------------------------------------------------------
/.github/workflows/release.yaml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | push:
5 | tags:
6 | - '*'
7 |
8 | jobs:
9 | release:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v2
13 | - uses: tomasnorre/typo3-upload-ter@v2
14 | with:
15 | api-token: ${{ secrets.TYPO3_API_TOKEN }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | composer.lock
3 | Build/.phpunit.result.cache
4 | Build/coverage/
--------------------------------------------------------------------------------
/Build/.php_cs:
--------------------------------------------------------------------------------
1 | setRiskyAllowed(true)
21 | ->setUsingCache(false)
22 | ->setRules([
23 | '@DoctrineAnnotation' => true,
24 | '@PSR2' => true,
25 | 'array_syntax' => ['syntax' => 'short'],
26 | 'cast_spaces' => ['space' => 'none'],
27 | 'concat_space' => ['spacing' => 'one'],
28 | 'declare_equal_normalize' => ['space' => 'single'],
29 | 'dir_constant' => true,
30 | 'function_typehint_space' => true,
31 | 'hash_to_slash_comment' => true,
32 | 'lowercase_cast' => true,
33 | 'modernize_types_casting' => true,
34 | 'native_function_casing' => true,
35 | 'no_alias_functions' => true,
36 | 'no_blank_lines_after_phpdoc' => false,
37 | 'no_empty_phpdoc' => true,
38 | 'no_empty_statement' => true,
39 | 'no_extra_consecutive_blank_lines' => true,
40 | 'no_leading_import_slash' => true,
41 | 'no_leading_namespace_whitespace' => true,
42 | 'no_null_property_initialization' => true,
43 | 'no_short_bool_cast' => true,
44 | 'no_singleline_whitespace_before_semicolons' => true,
45 | 'no_superfluous_elseif' => true,
46 | 'no_trailing_comma_in_singleline_array' => true,
47 | 'no_unneeded_control_parentheses' => true,
48 | 'no_unused_imports' => true,
49 | 'no_useless_else' => true,
50 | 'no_whitespace_in_blank_line' => true,
51 | 'ordered_imports' => true,
52 | 'php_unit_construct' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame'],
53 | 'php_unit_mock_short_will_return' => true,
54 | 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'],
55 | 'phpdoc_no_access' => true,
56 | 'phpdoc_no_empty_return' => true,
57 | 'phpdoc_no_package' => true,
58 | 'phpdoc_scalar' => true,
59 | 'phpdoc_trim' => true,
60 | 'phpdoc_types' => true,
61 | 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],
62 | 'return_type_declaration' => ['space_before' => 'none'],
63 | 'single_quote' => true,
64 | 'whitespace_after_comma_in_array' => true,
65 | 'single_line_after_imports' => true,
66 | ]);
--------------------------------------------------------------------------------
/Build/FunctionalTests.xml:
--------------------------------------------------------------------------------
1 |
17 |
18 |
19 |
20 | ../Tests/Functional/
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Build/UnitTests.xml:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 | ../Tests/Unit/
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Build/UpdateChangelog.php:
--------------------------------------------------------------------------------
1 | version = trim(shell_exec('git describe --tags --abbrev=0'));
15 | $this->versionDate = trim(shell_exec('git log -1 --format=%ai ' . $this->version));
16 | }
17 |
18 | public function generate()
19 | {
20 | $changelog = '';
21 |
22 | $changelog .= 'Latest release : ' . $this->version . ' (' . $this->versionDate . ")\r\n";
23 | $changelog .= "\r\n\r\n";
24 |
25 | $allTags = json_decode($this->getUrl(self::GITHUB_TAGS), true);
26 | $allTagsContent = [];
27 | $lastTag = '';
28 | for ($i = 0; $i < count($allTags); $i++) {
29 | $tag = str_replace('refs/tags/', '', $allTags[$i]['ref']);
30 | $tagDate = trim(shell_exec('git log -1 --format=%ai ' . $tag));
31 | if ($i === 0) {
32 | array_unshift(
33 | $allTagsContent,
34 | '* ' . $tag . ' (' . $tagDate . ' First release'
35 | );
36 | } else {
37 | array_unshift(
38 | $allTagsContent,
39 | '* ' . $tag . ' (' . $tagDate . ') [Full list of changes](' . self::GITHUB_URL . 'compare/' . $lastTag . '...' . $tag . ')'
40 | );
41 | }
42 | $lastTag = $tag;
43 | }
44 |
45 | $changelog .= implode("\r\n", $allTagsContent);
46 | file_put_contents(self::CHANGELOG_FILE, $changelog);
47 | }
48 |
49 | public function getUrl($url)
50 | {
51 | $ch = curl_init();
52 | curl_setopt($ch, CURLOPT_URL, $url);
53 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
54 | curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
55 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
56 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
57 | curl_setopt($ch, CURLOPT_USERAGENT, 'ApenBot');
58 | $content = curl_exec($ch);
59 | curl_close($ch);
60 | return $content;
61 | }
62 | }
63 |
64 | call_user_func(function () {
65 | $changelog = new UpdateChangelog();
66 | $changelog->generate();
67 | });
68 |
--------------------------------------------------------------------------------
/Build/ecs.php:
--------------------------------------------------------------------------------
1 | import(SetList::PSR_12);
35 | $ecsConfig->import(SetList::CLEAN_CODE);
36 | $ecsConfig->import(SetList::COMMON);
37 |
38 | $ecsConfig->skip([
39 | dirname(__DIR__) . '/Build/*',
40 | dirname(__DIR__) . '/.Build/*',
41 | TrailingCommaInMultilineFixer::class,
42 | \PhpCsFixer\Fixer\ControlStructure\YodaStyleFixer::class,
43 | PhpUnitStrictFixer::class,
44 | PhpUnitTestAnnotationFixer::class,
45 | ArrayOpenerAndCloserNewlineFixer::class,
46 | ArrayListItemNewlineFixer::class,
47 | CastSpacesFixer::class,
48 | NotOperatorWithSuccessorSpaceFixer::class,
49 | NoSuperfluousPhpdocTagsFixer::class,
50 | ClassAttributesSeparationFixer::class,
51 | OrderedClassElementsFixer::class,
52 | NoSpacesAroundOffsetFixer::class,
53 | AssignmentInConditionSniff::class . '.Found',
54 | DeclareStrictTypesFixer::class => [
55 | '**/ext_emconf.php',
56 | '**/ext_localconf.php',
57 | '**/ext_tables.php',
58 | '**/TCA/*',
59 | ],
60 | ]);
61 |
62 | $ecsConfig->ruleWithConfiguration(ArraySyntaxFixer::class, ['syntax' => 'short']);
63 | $ecsConfig->ruleWithConfiguration(ConcatSpaceFixer::class, ['spacing' => 'one']);
64 | $ecsConfig->ruleWithConfiguration(BinaryOperatorSpacesFixer::class, ['default' => 'single_space']);
65 | $ecsConfig->rule(NoExtraBlankLinesFixer::class);
66 | $ecsConfig->rule(TernaryOperatorSpacesFixer::class);
67 | $ecsConfig->rule(NoBlankLinesAfterPhpdocFixer::class);
68 | $ecsConfig->ruleWithConfiguration(AlignMultilineCommentFixer::class, ['comment_type' => 'phpdocs_only']);
69 | $ecsConfig->ruleWithConfiguration(GeneralPhpdocAnnotationRemoveFixer::class, ['annotations' => ['author', 'since']]);
70 | $ecsConfig->rule(NoLeadingImportSlashFixer::class);
71 | $ecsConfig->rule(NoUnusedImportsFixer::class);
72 | $ecsConfig->ruleWithConfiguration(OrderedImportsFixer::class, ['imports_order' => ['class', 'const', 'function']]);
73 | // $ecsConfig->ruleWithConfiguration(CyclomaticComplexitySniff::class, ['complexity' => 20, 'absoluteComplexity' => 20]);
74 | };
75 |
--------------------------------------------------------------------------------
/Build/phpstan.neon:
--------------------------------------------------------------------------------
1 | parameters:
2 | level: 4
3 | reportUnmatchedIgnoredErrors: false
4 | paths:
5 | - ../Classes/
6 | excludePaths:
7 | - ../Build/*
8 | - ../.Build/*
9 | ignoreErrors:
10 | - "#Undefined variable: \\$_EXTKEY#"
11 | - "#Constant .*? not found.#"
--------------------------------------------------------------------------------
/Build/rector.php:
--------------------------------------------------------------------------------
1 | parameters();
22 |
23 | // php
24 | $rectorConfig->import(SetList::CODE_QUALITY);
25 | $rectorConfig->import(SetList::CODING_STYLE);
26 | $rectorConfig->import(SetList::DEAD_CODE);
27 | $rectorConfig->import(SetList::PHP_53);
28 | $rectorConfig->import(SetList::PHP_54);
29 | $rectorConfig->import(SetList::PHP_55);
30 | $rectorConfig->import(SetList::PHP_56);
31 | $rectorConfig->import(SetList::PHP_70);
32 | $rectorConfig->import(SetList::PHP_71);
33 | $rectorConfig->import(SetList::PHP_72);
34 | $rectorConfig->import(SetList::PHP_73);
35 | $rectorConfig->import(SetList::PHP_74);
36 | $rectorConfig->import(SetList::PHP_80);
37 | $rectorConfig->import(SetList::PHP_81);
38 |
39 | // typo3
40 | $rectorConfig->sets([
41 | Typo3LevelSetList::UP_TO_TYPO3_11,
42 | // SetList::TYPE_DECLARATION
43 | ]);
44 | $rectorConfig->import(Typo3SetList::UNDERSCORE_TO_NAMESPACE);
45 | $rectorConfig->import(Typo3SetList::EXTBASE_COMMAND_CONTROLLERS_TO_SYMFONY_COMMANDS);
46 | $rectorConfig->import(Typo3SetList::DATABASE_TO_DBAL);
47 |
48 | // In order to have a better analysis from phpstan we teach it here some more things
49 | $rectorConfig->phpstanConfig(Typo3Option::PHPSTAN_FOR_RECTOR_PATH);
50 |
51 | // FQN classes are not imported by default. If you don't do it manually after every Rector run, enable it by:
52 | $rectorConfig->importNames(true, false);
53 |
54 | // Disable parallel otherwise non php file processing is not working i.e. typoscript
55 | $rectorConfig->disableParallel();
56 |
57 | // Define your target version which you want to support
58 | $rectorConfig->phpVersion(PhpVersion::PHP_81);
59 |
60 | // If you only want to process one/some TYPO3 extension(s), you can specify its path(s) here.
61 | // If you use the option --config change __DIR__ to getcwd()
62 | // $rectorConfig->paths([
63 | // __DIR__ . '/packages/acme_demo/',
64 | // ]);
65 |
66 | // is there a file you need to skip?
67 | $rectorConfig->skip([
68 | '*/news/*',
69 | '*/flux/*',
70 | '*Build/*',
71 | '*/Resources/Private/Php/*',
72 | '*/Resources/Public/*',
73 | '*/Configuration/TypoScript/*',
74 | '*/Configuration/RequestMiddlewares.php',
75 | AddLiteralSeparatorToNumberRector::class,
76 | SensitiveConstantNameRector::class,
77 | PostIncDecToPreIncDecRector::class,
78 | UnSpreadOperatorRector::class,
79 | RemoveUselessReturnTagRector::class,
80 | RemoveUselessParamTagRector::class,
81 | RemoveUselessVarTagRector::class,
82 | NameImportingPostRector::class => [
83 | '*/ClassAliasMap.php',
84 | '*/ext_localconf.php',
85 | '*/ext_emconf.php',
86 | '*/ext_tables.php',
87 | '*/Configuration/TCA/*',
88 | '*/Configuration/RequestMiddlewares.php',
89 | '*/Configuration/Commands.php',
90 | '*/Configuration/AjaxRoutes.php',
91 | 'Configuration/Routes.php',
92 | '*/Configuration/Extbase/Persistence/Classes.php',
93 | ],
94 | ]);
95 |
96 | // is there single rule you don't like from a set you use?
97 | // $parameters->set(Option::EXCLUDE_RECTORS, [
98 | // \Rector\Php71\Rector\FuncCall\CountOnNullRector::class,
99 | // \Rector\Php71\Rector\BinaryOp\BinaryOpBetweenNumberAndStringRector::class,
100 | // \Rector\DeadCode\Rector\ClassMethod\RemoveUnusedParameterRector::class,
101 | // \Rector\CodingStyle\Rector\ClassMethod\NewlineBeforeNewAssignSetRector::class
102 | // ]);
103 |
104 | /*// get services (needed for register a single rule)
105 | $services = $rectorConfig->services();
106 |
107 | // register a single rule
108 | $services->set(ContentObjectRendererFileResourceRector::class);
109 | $services->set(TemplateGetFileNameToFilePathSanitizerRector::class);*/
110 | };
111 |
--------------------------------------------------------------------------------
/Classes/Eid/CallAjax.php:
--------------------------------------------------------------------------------
1 | ';
36 |
37 | if ($mode == 'compareFile') {
38 | if (!strstr($file1, $realPathExt)) {
39 | die('Access denied.');
40 | }
41 | $terFileContent = Utility::downloadT3x($extKey, $extVersion, $extFile);
42 | $content .= $this->t3Diff(GeneralUtility::getURL($file1), $terFileContent);
43 | } elseif ($mode == 'compareExtension') {
44 | $t3xfiles = Utility::downloadT3x($extKey, $extVersion);
45 | $diff = 0;
46 | foreach ($t3xfiles['FILES'] as $filePath => $file) {
47 | $currentFileContent = GeneralUtility::getURL($realPathExt . '/' . $filePath);
48 | if ($file['content_md5'] !== md5($currentFileContent)) {
49 | $diff++;
50 | $content .= '
' . $filePath . '
';
51 | $content .= $this->t3Diff($currentFileContent, $file['content']);
52 | }
53 | }
54 | if (empty($diff)) {
55 | $content .= 'No diff to show';
56 | }
57 | }
58 |
59 | $content .= '';
60 | echo $content;
61 | return new NullResponse();
62 | }
63 |
64 | /**
65 | * @param string $file1
66 | * @param string $file2
67 | * @return string
68 | */
69 | public function t3Diff($file1, $file2)
70 | {
71 | $diff = GeneralUtility::makeInstance(DiffUtility::class);
72 | $diff->stripTags = false;
73 | $sourcesDiff = $diff->makeDiffDisplay($file1, $file2);
74 | return $this->printT3Diff($sourcesDiff);
75 | }
76 |
77 | /**
78 | * @param string $sourcesDiff
79 | * @return string
80 | */
81 | public function printT3Diff($sourcesDiff)
82 | {
83 | $out = '';
84 | $out .= '
';
85 | $out .= 'Local file |
';
86 | $out .= 'TER file |
';
87 | $sourcesDiff = str_replace('', '', $sourcesDiff);
88 | $sourcesDiff = str_replace('', '', $sourcesDiff);
89 | $out .= $sourcesDiff;
90 | $out .= '
';
91 | $out .= '';
92 | return $out;
93 | }
94 | }
--------------------------------------------------------------------------------
/Classes/Pagination/SimplePagination.php:
--------------------------------------------------------------------------------
1 | paginator = $paginator;
47 | }
48 |
49 | public function getPreviousPageNumber(): ?int
50 | {
51 | $previousPage = $this->paginator->getCurrentPageNumber() - 1;
52 |
53 | if ($previousPage > $this->paginator->getNumberOfPages()) {
54 | return null;
55 | }
56 |
57 | return $previousPage >= $this->getFirstPageNumber()
58 | ? $previousPage
59 | : null;
60 | }
61 |
62 | public function getNextPageNumber(): ?int
63 | {
64 | $nextPage = $this->paginator->getCurrentPageNumber() + 1;
65 |
66 | return $nextPage <= $this->paginator->getNumberOfPages()
67 | ? $nextPage
68 | : null;
69 | }
70 |
71 | public function generate(): void
72 | {
73 | $this->calculateDisplayRange();
74 | $pages = [];
75 | for ($i = $this->displayRangeStart; $i <= $this->displayRangeEnd; $i++) {
76 | $pages[] = ['number' => $i, 'isCurrent' => $i === $this->paginator->getCurrentPageNumber()];
77 | }
78 | $this->pages = $pages;
79 | }
80 |
81 | public function getFirstPageNumber(): int
82 | {
83 | return 1;
84 | }
85 |
86 | public function getLastPageNumber(): int
87 | {
88 | return $this->paginator->getNumberOfPages();
89 | }
90 |
91 | public function getStartRecordNumber(): int
92 | {
93 | if ($this->paginator->getCurrentPageNumber() > $this->paginator->getNumberOfPages()) {
94 | return 0;
95 | }
96 |
97 | return $this->paginator->getKeyOfFirstPaginatedItem() + 1;
98 | }
99 |
100 | public function getEndRecordNumber(): int
101 | {
102 | if ($this->paginator->getCurrentPageNumber() > $this->paginator->getNumberOfPages()) {
103 | return 0;
104 | }
105 |
106 | return $this->paginator->getKeyOfLastPaginatedItem() + 1;
107 | }
108 |
109 | /**
110 | * If a certain number of links should be displayed, adjust before and after
111 | * amounts accordingly.
112 | */
113 | protected function calculateDisplayRange(): void
114 | {
115 | $maximumNumberOfLinks = $this->maximumNumberOfLinks;
116 | if ($maximumNumberOfLinks > $this->paginator->getNumberOfPages()) {
117 | $maximumNumberOfLinks = $this->paginator->getNumberOfPages();
118 | }
119 | $delta = floor($maximumNumberOfLinks / 2);
120 | $this->displayRangeStart = $this->paginator->getCurrentPageNumber() - $delta;
121 | $this->displayRangeEnd = $this->paginator->getCurrentPageNumber() + $delta - ($maximumNumberOfLinks % 2 === 0 ? 1 : 0);
122 | if ($this->displayRangeStart < 1) {
123 | $this->displayRangeEnd -= $this->displayRangeStart - 1;
124 | }
125 | if ($this->displayRangeEnd > $this->paginator->getNumberOfPages()) {
126 | $this->displayRangeStart -= $this->displayRangeEnd - $this->paginator->getNumberOfPages();
127 | }
128 | $this->displayRangeStart = (int)max($this->displayRangeStart, 1);
129 | $this->displayRangeEnd = (int)min($this->displayRangeEnd, $this->paginator->getNumberOfPages());
130 | }
131 |
132 | public function setMaximumNumberOfLinks(int $maximumNumberOfLinks): void
133 | {
134 | $this->maximumNumberOfLinks = $maximumNumberOfLinks;
135 | }
136 |
137 | public function getPages(): array
138 | {
139 | return $this->pages;
140 | }
141 |
142 | public function getHasLessPages(): bool
143 | {
144 | return $this->displayRangeStart > 2;
145 | }
146 |
147 | public function getHasMorePages(): bool
148 | {
149 | return $this->displayRangeEnd + 1 < $this->paginator->getNumberOfPages();
150 | }
151 |
152 | public function getAllPageNumbers(): array
153 | {
154 | $pageNumbers = [];
155 | for ($i = 1; $i <= $this->paginator->getNumberOfPages(); $i++) {
156 | $pageNumbers[] = $i;
157 | }
158 | return $pageNumbers;
159 | }
160 | }
--------------------------------------------------------------------------------
/Classes/Reports/AbstractReport.php:
--------------------------------------------------------------------------------
1 | reportObject = $reportObject;
36 | $this->setCss('EXT:additional_reports/Resources/Public/Css/tx_additionalreports.css');
37 | $this->setJs('EXT:additional_reports/Resources/Public/JavaScript/plugins.js');
38 | Utility::getLanguageService()->includeLLFile('EXT:additional_reports/Resources/Private/Language/locallang.xlf');
39 | }
40 |
41 | public function setCss(string $path): void
42 | {
43 | if (isset($this->reportObject->doc)) {
44 | $this->reportObject->doc->getPageRenderer()->addCssFile($path);
45 | }
46 | $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
47 | $pageRenderer->addCssFile($path);
48 | }
49 |
50 | public function setJs(string $path): void
51 | {
52 | if (isset($this->reportObject->doc)) {
53 | $this->reportObject->doc->getPageRenderer()->addJsFile($path);
54 | }
55 | $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
56 | $pageRenderer->addJsFile($path);
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/Classes/Reports/CommandControllers.php:
--------------------------------------------------------------------------------
1 | display();
28 | }
29 |
30 | /**
31 | * Generate the CommandControllers report
32 | *
33 | * @return string HTML code
34 | */
35 | public function display(): string
36 | {
37 | $view = GeneralUtility::makeInstance(StandaloneView::class);
38 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/commandcontrollers-fluid.html');
39 | $commands = GeneralUtility::makeInstance(CommandRegistry::class);
40 | $items = [];
41 | foreach ($commands->getSchedulableCommands() as $cmd => $el) {
42 | $items[$cmd] = get_class($el);
43 | }
44 | $view->assign('itemsNew', $items);
45 | return $view->render();
46 | }
47 |
48 | public function getIdentifier(): string
49 | {
50 | return 'additionalreports_commandcontrollers';
51 | }
52 |
53 | public function getTitle(): string
54 | {
55 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:commandcontrollers_title';
56 | }
57 |
58 | public function getDescription(): string
59 | {
60 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:commandcontrollers_description';
61 | }
62 |
63 | public function getIconIdentifier(): string
64 | {
65 | return 'additionalreports_commandcontrollers';
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/Classes/Reports/Eid.php:
--------------------------------------------------------------------------------
1 | display();
28 | }
29 |
30 | /**
31 | * Generate the eid report
32 | *
33 | * @return string HTML code
34 | */
35 | public function display()
36 | {
37 | $items = $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include'];
38 | $eids = [];
39 |
40 | if (count($items) > 0) {
41 | foreach ($items as $itemKey => $itemValue) {
42 | preg_match('#EXT:(.*?)\/#', $itemValue, $ext);
43 | if ($ext[1] ?? false) {
44 | continue;
45 | }
46 | if (ExtensionManagementUtility::isLoaded($ext[1] ?? '')) {
47 | $eids[] = [
48 | 'icon' => Utility::getExtIcon($ext[1]),
49 | 'extension' => $ext[1],
50 | 'name' => $itemKey,
51 | 'path' => $itemValue,
52 | ];
53 | }
54 | }
55 | }
56 |
57 | $view = GeneralUtility::makeInstance(StandaloneView::class);
58 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/eid-fluid.html');
59 | $view->assign('eids', $eids);
60 | return $view->render();
61 | }
62 |
63 | public function getIdentifier(): string
64 | {
65 | return 'additionalreports_eid';
66 | }
67 |
68 | public function getTitle(): string
69 | {
70 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:eid_title';
71 | }
72 |
73 | public function getDescription(): string
74 | {
75 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:eid_description';
76 | }
77 |
78 | public function getIconIdentifier(): string
79 | {
80 | return 'additionalreports_eid';
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/Classes/Reports/EventDispatcher.php:
--------------------------------------------------------------------------------
1 | display();
36 | }
37 |
38 | /**
39 | * Generate the eventdispatcher report
40 | *
41 | * @return string HTML code
42 | */
43 | public function display()
44 | {
45 | $events = $this->getAllEvents();
46 | $view = GeneralUtility::makeInstance(StandaloneView::class);
47 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/events-fluid.html');
48 | $view->assign('events', $events);
49 | return $view->render();
50 | }
51 |
52 | public function getAllEvents()
53 | {
54 | $packageManager = GeneralUtility::makeInstance(PackageManager::class);
55 | $packages = $packageManager->getActivePackages();
56 | $containerBuilder = new SymfonyContainerBuilder();
57 | $registry = new ServiceProviderRegistry($packageManager);
58 | $containerBuilder->addCompilerPass(new ServiceProviderCompilationPass($registry, 'service_provider_registry'));
59 |
60 | foreach ($packages as $package) {
61 | $diConfigDir = $package->getPackagePath() . 'Configuration/';
62 | if (file_exists($diConfigDir . 'Services.php')) {
63 | $phpFileLoader = new PhpFileLoader($containerBuilder, new FileLocator($diConfigDir));
64 | $phpFileLoader->load('Services.php');
65 | }
66 | if (file_exists($diConfigDir . 'Services.yaml')) {
67 | $yamlFileLoader = new YamlFileLoader($containerBuilder, new FileLocator($diConfigDir));
68 | $yamlFileLoader->load('Services.yaml');
69 | }
70 | }
71 |
72 | $events = [];
73 | foreach ($containerBuilder->getDefinitions() as $className => $definition) {
74 | $tags = $definition->getTags();
75 | if (!empty($tags)) {
76 | foreach ($tags as $tagType => $tag) {
77 | if ($tagType === 'event.listener') {
78 | $events[] = [
79 | 'className' => $className,
80 | 'list' => Utility::viewArray($tag)
81 | ];
82 | }
83 | }
84 | }
85 | }
86 | return $events;
87 | }
88 |
89 | public function getIdentifier(): string
90 | {
91 | return 'additionalreports_eventdispatcher';
92 | }
93 |
94 | public function getTitle(): string
95 | {
96 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:eventdispatcher_title';
97 | }
98 |
99 | public function getDescription(): string
100 | {
101 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:eventdispatcher_description';
102 | }
103 |
104 | public function getIconIdentifier(): string
105 | {
106 | return 'additionalreports_eventdispatcher';
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/Classes/Reports/Extensions.php:
--------------------------------------------------------------------------------
1 | display();
28 | }
29 |
30 | /**
31 | * Generate the loaded extension report
32 | *
33 | * @return string HTML code
34 | */
35 | public function display()
36 | {
37 | $extensionsToUpdate = 0;
38 |
39 | $allExtension = Utility::getInstExtList(Utility::getPathTypo3Conf() . 'ext/');
40 |
41 | $listExtensionsTer = [];
42 | $listExtensionsDev = [];
43 | $listExtensionsUnloaded = [];
44 |
45 | if (!empty($allExtension['ter'])) {
46 | foreach ($allExtension['ter'] as $itemValue) {
47 | $currentExtension = $this->getExtensionInformations($itemValue);
48 | if (version_compare($itemValue['EM_CONF']['version'], $itemValue['lastversion']['version'], '<')) {
49 | $extensionsToUpdate++;
50 | }
51 | $listExtensionsTer[] = $currentExtension;
52 | }
53 | }
54 |
55 | if (!empty($allExtension['dev'])) {
56 | foreach ($allExtension['dev'] as $itemValue) {
57 | $listExtensionsDev[] = $this->getExtensionInformations($itemValue);
58 | }
59 | }
60 |
61 | if (!empty($allExtension['unloaded'])) {
62 | foreach ($allExtension['unloaded'] as $itemValue) {
63 | $listExtensionsUnloaded[] = $this->getExtensionInformations($itemValue);
64 | }
65 | }
66 |
67 | $addContent = '';
68 | $addContent .= (count($listExtensionsTer) + count($listExtensionsDev)) . ' ' . Utility::getLl('extensions_extensions');
69 | $addContent .= '
';
70 | $addContent .= count($listExtensionsTer) . ' ' . Utility::getLl('extensions_ter');
71 | $addContent .= ' / ';
72 | $addContent .= count($listExtensionsDev) . ' ' . Utility::getLl('extensions_dev');
73 | $addContent .= '
';
74 | $addContent .= $extensionsToUpdate . ' ' . Utility::getLl('extensions_toupdate');
75 | $addContentItem = Utility::writeInformation(Utility::getLl('pluginsmode5') . '
' . Utility::getLl('extensions_updateter') . '', $addContent);
76 |
77 | $view = GeneralUtility::makeInstance(StandaloneView::class);
78 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/extensions-fluid.html');
79 | $view->assign('listExtensionsTer', $listExtensionsTer);
80 | $view->assign('listExtensionsDev', $listExtensionsDev);
81 | $view->assign('listExtensionsUnloaded', $listExtensionsUnloaded);
82 | $view->assign('composer', Utility::isComposerMode());
83 | return $addContentItem . $view->render();
84 | }
85 |
86 | /**
87 | * Get all necessary informations about an ext
88 | *
89 | * @param array $itemValue
90 | * @return array
91 | */
92 | public function getExtensionInformations($itemValue)
93 | {
94 | $extKey = $itemValue['extkey'];
95 | $extVersion = $itemValue['EM_CONF']['version'] ?? '';
96 | $listExtensionsTerItem = [];
97 | $listExtensionsTerItem['extension'] = $extKey;
98 | $listExtensionsTerItem['version'] = $extVersion;
99 |
100 | // version compare
101 | $compareUrl = GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
102 |
103 | $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
104 | $routeIdentifier = 'additional_reports_compareFiles';
105 | $uri = (string)$uriBuilder->buildUriFromRoute($routeIdentifier, []);
106 |
107 | // Bugfix for wrong CompareUrl in case of TYPO3 is installed in a subdirectory
108 | if (strpos($uri, 'typo3/index.php') > 0) {
109 | $uri = substr($uri, strpos($uri, 'typo3/index.php'));
110 | }
111 |
112 | $compareUrl .= $uri;
113 | $compareUrl .= '&extKey=' . $extKey . '&mode=compareExtension&extVersion=' . $extVersion;
114 | $listExtensionsTerItem['compareUrl'] = $compareUrl;
115 |
116 | // need extension update ?
117 | if (version_compare($extVersion, $itemValue['lastversion']['version'] ?? '', '<')) {
118 | $listExtensionsTerItem['versionlast'] = '' . $itemValue['lastversion']['version'] . ' (' . $itemValue['lastversion']['updatedate'] . ')';
119 | $compareUrl = GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
120 | $compareUrl .= $uri;
121 | $compareUrl .= '&extKey=' . $extKey . '&mode=compareExtension&extVersion=' . $itemValue['lastversion']['version'];
122 | $listExtensionsTerItem['compareUrlLast'] = $compareUrl;
123 | } else {
124 | $listExtensionsTerItem['versionlast'] = ($itemValue['lastversion']['version'] ?? '') . ' (' . ($itemValue['lastversion']['updatedate'] ?? '') . ')';
125 | $listExtensionsTerItem['compareUrlLast'] = '';
126 | }
127 |
128 | $listExtensionsTerItem['downloads'] = $itemValue['lastversion']['alldownloadcounter'] ?? '';
129 | $listExtensionsTerItem['tablesmodal'] = !empty($itemValue['fdfile']) ? '' . (htmlspecialchars($itemValue['fdfile'])) . '
' : '';
130 |
131 | // need extconf update
132 | $listExtensionsTerItem['confintegrity'] = Utility::getLl('no');
133 | $listExtensionsTerItem['confintegrityContent'] = '';
134 |
135 | return $listExtensionsTerItem;
136 | }
137 |
138 | public function getIdentifier(): string
139 | {
140 | return 'additionalreports_extensions';
141 | }
142 |
143 | public function getTitle(): string
144 | {
145 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:extensions_title';
146 | }
147 |
148 | public function getDescription(): string
149 | {
150 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:extensions_description';
151 | }
152 |
153 | public function getIconIdentifier(): string
154 | {
155 | return 'additionalreports_extensions';
156 | }
157 | }
158 |
--------------------------------------------------------------------------------
/Classes/Reports/Hooks.php:
--------------------------------------------------------------------------------
1 | ' . Utility::getLL('hooks_description') . '';
28 | return $content . $this->display();
29 | }
30 |
31 | /**
32 | * Generate the hooks report
33 | *
34 | * @return string HTML code
35 | */
36 | public function display()
37 | {
38 | $hooks = [];
39 |
40 | // core hooks
41 | $items = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'];
42 | if (count($items) > 0) {
43 | foreach ($items as $itemKey => $itemValue) {
44 | if (preg_match('#.*?\/.*?\.php#', $itemKey, $matches)) {
45 | foreach ($itemValue as $hookName => $hookList) {
46 | $hookList = Utility::getHook($hookList);
47 | if (!empty($hookList)) {
48 | $hooks['core'][] = [
49 | 'corefile' => $itemKey,
50 | 'name' => $hookName,
51 | 'file' => Utility::viewArray($hookList)
52 | ];
53 | }
54 | }
55 | }
56 | }
57 | }
58 |
59 | $items = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'];
60 | if (count($items) > 0) {
61 | foreach ($items as $itemKey => $itemValue) {
62 | foreach ($itemValue as $hookName => $hookList) {
63 | $hookList = Utility::getHook($hookList);
64 | if (!empty($hookList)) {
65 | $hooks['extensions'][] = [
66 | 'corefile' => $itemKey,
67 | 'name' => $hookName,
68 | 'file' => Utility::viewArray($hookList)
69 | ];
70 | }
71 | }
72 | }
73 | }
74 |
75 | $view = GeneralUtility::makeInstance(StandaloneView::class);
76 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/hooks-fluid.html');
77 | $view->assign('hooks', $hooks);
78 | return $view->render();
79 | }
80 |
81 | public function getIdentifier(): string
82 | {
83 | return 'additionalreports_hooks';
84 | }
85 |
86 | public function getTitle(): string
87 | {
88 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:hooks_title';
89 | }
90 |
91 | public function getDescription(): string
92 | {
93 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:hooks_description';
94 | }
95 |
96 | public function getIconIdentifier(): string
97 | {
98 | return 'additionalreports_hooks';
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/Classes/Reports/LogErrors.php:
--------------------------------------------------------------------------------
1 | display();
28 | }
29 |
30 | /**
31 | * Generate the log error report
32 | *
33 | * @return string HTML code
34 | */
35 | public function display()
36 | {
37 | $query = [];
38 | $query['SELECT'] = 'COUNT(*) AS "nb",details,MAX(tstamp) as "tstamp"';
39 | $query['FROM'] = 'sys_log';
40 | $query['WHERE'] = 'error>0';
41 | $query['GROUPBY'] = 'details';
42 | $query['ORDERBY'] = 'nb DESC,tstamp DESC';
43 | $query['LIMIT'] = '';
44 |
45 | $orderby = Utility::_GP('orderby');
46 | if ($orderby !== null) {
47 | $query['ORDERBY'] = $orderby;
48 | }
49 |
50 | $content = Utility::writeInformation(
51 | Utility::getLl('flushalllog'),
52 | 'DELETE FROM sys_log WHERE error > 0;'
53 | );
54 |
55 | $view = GeneralUtility::makeInstance(StandaloneView::class);
56 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/logerrors-fluid.html');
57 | $view->setPartialRootPaths([ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Partials/']);
58 | $view->assign('reportname', $_GET['report'] ?? 'additionalreports_logerrors');
59 | $view->assign('extconf', unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['additional_reports'] ?? ''));
60 | $view->assign('baseUrl', Utility::getBaseUrl());
61 | $view->assign('requestDir', GeneralUtility::getIndpEnv('TYPO3_REQUEST_DIR'));
62 |
63 | Utility::buildPagination(Utility::exec_SELECT_queryArrayRows($query), !empty($_GET['currentPage']) ? (int)$_GET['currentPage'] : 1, $view);
64 |
65 | return $content . $view->render();
66 | }
67 |
68 | public function getIdentifier(): string
69 | {
70 | return 'additionalreports_logerrors';
71 | }
72 |
73 | public function getTitle(): string
74 | {
75 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:logerrors_title';
76 | }
77 |
78 | public function getDescription(): string
79 | {
80 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:logerrors_description';
81 | }
82 |
83 | public function getIconIdentifier(): string
84 | {
85 | return 'additionalreports_logerrors';
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/Classes/Reports/Middlewares.php:
--------------------------------------------------------------------------------
1 | display();
29 | }
30 |
31 | /**
32 | * Generate the middlewares report
33 | *
34 | * @return string HTML code
35 | */
36 | public function display()
37 | {
38 | $allMiddlewares = $this->getAllMiddlewares();
39 | $view = GeneralUtility::makeInstance(StandaloneView::class);
40 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/middlewares-fluid.html');
41 | $view->assign('middlewares', $this->filterAllMiddlewares($allMiddlewares));
42 | return $view->render();
43 | }
44 |
45 | public function getAllMiddlewares(): array
46 | {
47 | $packageManager = GeneralUtility::makeInstance(PackageManager::class);
48 | $packages = $packageManager->getActivePackages();
49 | $allMiddlewares = [[]];
50 | foreach ($packages as $package) {
51 | $packageConfiguration = $package->getPackagePath() . 'Configuration/RequestMiddlewares.php';
52 | if (file_exists($packageConfiguration)) {
53 | $middlewaresInPackage = require $packageConfiguration;
54 | if (is_array($middlewaresInPackage)) {
55 | $allMiddlewares[] = $middlewaresInPackage;
56 | }
57 | }
58 | }
59 | return array_replace_recursive(...$allMiddlewares);
60 | }
61 |
62 | public function filterAllMiddlewares(array $allMiddlewares): array
63 | {
64 | $dependencyOrderingService = GeneralUtility::makeInstance(DependencyOrderingService::class);
65 | $middlewares = [];
66 | foreach ($allMiddlewares as $stack => $middlewaresOfStack) {
67 | $middlewaresOfStack = $dependencyOrderingService->orderByDependencies($middlewaresOfStack);
68 | $sanitizedMiddlewares = [];
69 | foreach ($middlewaresOfStack as $name => $middleware) {
70 | if (isset($middleware['disabled']) && $middleware['disabled'] === true) {
71 | continue;
72 | }
73 | $sanitizedMiddlewares[$name] = $middleware['target'];
74 | }
75 | $middlewares[$stack] = $sanitizedMiddlewares;
76 | }
77 | return $middlewares;
78 | }
79 |
80 | public function getIdentifier(): string
81 | {
82 | return 'additionalreports_middlewares';
83 | }
84 |
85 | public function getTitle(): string
86 | {
87 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:middlewares_title';
88 | }
89 |
90 | public function getDescription(): string
91 | {
92 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:middlewares_description';
93 | }
94 |
95 | public function getIconIdentifier(): string
96 | {
97 | return 'additionalreports_middlewares';
98 | }
99 | }
100 |
--------------------------------------------------------------------------------
/Classes/Reports/Plugins.php:
--------------------------------------------------------------------------------
1 | display();
28 | }
29 |
30 | /**
31 | * Generate the plugins and ctypes report
32 | *
33 | * @return string HTML code
34 | */
35 | public function display()
36 | {
37 | $view = GeneralUtility::makeInstance(StandaloneView::class);
38 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/plugins-fluid.html');
39 | $view->setPartialRootPaths([ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Partials/']);
40 |
41 | $view->assign('reportname', $_GET['report'] ?? 'additionalreports_plugins');
42 | $view->assign('extconf', unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['additional_reports'] ?? ''));
43 | $view->assign('url', Utility::getBaseUrl());
44 | $view->assign('caution', Utility::writeInformation(Utility::getLl('careful'), Utility::getLl('carefuldesc')));
45 | $view->assign('checkedpluginsmode3', (Utility::getPluginsDisplayMode() === 3) ? ' checked="checked"' : '');
46 | $view->assign('checkedpluginsmode4', (Utility::getPluginsDisplayMode() === 4) ? ' checked="checked"' : '');
47 | $view->assign('checkedpluginsmode5', (Utility::getPluginsDisplayMode() === 5) ? ' checked="checked"' : '');
48 | $view->assign('checkedpluginsmode6', (Utility::getPluginsDisplayMode() === 6) ? ' checked="checked"' : '');
49 | $view->assign('checkedpluginsmode7', (Utility::getPluginsDisplayMode() === 7) ? ' checked="checked"' : '');
50 | $view->assign('filtersCatParam', Utility::_GP('filtersCat'));
51 |
52 | $currentPage = !empty($_GET['currentPage']) ? (int)$_GET['currentPage'] : 1;
53 |
54 | switch (Utility::getPluginsDisplayMode()) {
55 | case 3:
56 | $view->assign('filtersCat', Utility::getAllDifferentCtypesSelect(false));
57 | Utility::buildPagination(self::getAllUsedCtypes(), $currentPage, $view);
58 | break;
59 | case 4:
60 | $view->assign('filtersCat', Utility::getAllDifferentPluginsSelect(false));
61 | Utility::buildPagination(self::getAllUsedPlugins(), $currentPage, $view);
62 | break;
63 | case 6:
64 | $view->assign('filtersCat', Utility::getAllDifferentPluginsSelect(true));
65 | Utility::buildPagination(self::getAllUsedPlugins(true), $currentPage, $view);
66 | break;
67 | case 7:
68 | $view->assign('filtersCat', Utility::getAllDifferentCtypesSelect(true));
69 | Utility::buildPagination(self::getAllUsedCtypes(true), $currentPage, $view);
70 | break;
71 | default:
72 | $view->assign('items', self::getSummary());
73 | break;
74 | }
75 |
76 | $view->assign('display', Utility::getPluginsDisplayMode());
77 |
78 | if (ExtensionManagementUtility::isLoaded('templavoila') && class_exists('tx_templavoila_api')) {
79 | $view->assign('tvused', true);
80 | } else {
81 | $view->assign('tvused', false);
82 | }
83 |
84 | return $view->render();
85 | }
86 |
87 | /**
88 | * Generate the summary of the plugins and ctypes report
89 | *
90 | * @return array
91 | */
92 | public static function getSummary()
93 | {
94 | $plugins = [];
95 | foreach (($GLOBALS['TCA']['tt_content']['columns']['list_type']['config']['items'] ?? []) as $itemValue) {
96 | if (trim($itemValue[1] ?? '') !== '') {
97 | $plugins[$itemValue[1]] = $itemValue;
98 | }
99 | }
100 |
101 | $ctypes = [];
102 | foreach (($GLOBALS['TCA']['tt_content']['columns']['CType']['config']['items'] ?? []) as $itemValue) {
103 | if (($itemValue[1] ?? '') != '--div--') {
104 | $ctypes[$itemValue[1] ?? ''] = $itemValue;
105 | }
106 | }
107 |
108 | $itemsCount = Utility::exec_SELECTgetRows(
109 | 'COUNT( tt_content.uid ) as "nb"',
110 | 'tt_content,pages',
111 | 'tt_content.pid=pages.uid AND pages.pid>=0 AND tt_content.hidden=0 ' .
112 | 'AND tt_content.deleted=0 AND pages.hidden=0 AND pages.deleted=0'
113 | );
114 |
115 | $items = Utility::exec_SELECTgetRows(
116 | 'tt_content.CType,tt_content.list_type,count(*) as "nb"',
117 | 'tt_content,pages',
118 | 'tt_content.pid=pages.uid AND pages.pid>=0 AND tt_content.hidden=0 ' .
119 | 'AND tt_content.deleted=0 AND pages.hidden=0 AND pages.deleted=0',
120 | 'tt_content.CType,tt_content.list_type',
121 | 'nb DESC'
122 | );
123 |
124 | $allItems = [];
125 |
126 | foreach ($items as $itemValue) {
127 | $itemTemp = [];
128 | if ($itemValue['CType'] == 'list') {
129 | $itemTemp = array_merge($itemTemp, Utility::getContentInfosFromTca('plugin', $itemValue['list_type']));
130 | $itemTemp['content'] = $itemTemp['plugin'] ?? '';
131 | } else {
132 | $itemTemp = array_merge($itemTemp, Utility::getContentInfosFromTca('ctype', $itemValue['CType']));
133 | $itemTemp['content'] = $itemTemp['ctype'] ?? '';
134 | }
135 | $itemTemp['references'] = $itemValue['nb'];
136 | $itemTemp['pourc'] = round((($itemValue['nb'] * 100) / $itemsCount[0]['nb']), 2);
137 | $allItems[] = $itemTemp;
138 | }
139 |
140 | return $allItems;
141 | }
142 |
143 | /**
144 | * Generate the used plugins report
145 | */
146 | public static function getAllUsedPlugins(bool $displayHidden = false): array
147 | {
148 | $getFiltersCat = Utility::_GP('filtersCat');
149 | $addHidden = ($displayHidden) ? '' : ' AND tt_content.hidden=0 AND pages.hidden=0 ';
150 | $addWhere = ($getFiltersCat !== null && $getFiltersCat != 'all') ? " AND tt_content.list_type='" . $getFiltersCat . "'" : '';
151 | return Utility::getAllPlugins($addHidden . $addWhere, '');
152 | }
153 |
154 | /**
155 | * Generate the used ctypes report
156 | */
157 | public static function getAllUsedCtypes(bool $displayHidden = false): array
158 | {
159 | $getFiltersCat = Utility::_GP('filtersCat');
160 | $addHidden = ($displayHidden) ? '' : ' AND tt_content.hidden=0 AND pages.hidden=0 ';
161 | $addWhere = ($getFiltersCat !== null && $getFiltersCat != 'all') ? " AND tt_content.CType='" . $getFiltersCat . "'" : '';
162 | return Utility::getAllCtypes($addHidden . $addWhere, '');
163 | }
164 |
165 | public function getIdentifier(): string
166 | {
167 | return 'additionalreports_plugins';
168 | }
169 |
170 | public function getTitle(): string
171 | {
172 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:plugins_title';
173 | }
174 |
175 | public function getDescription(): string
176 | {
177 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:plugins_description';
178 | }
179 |
180 | public function getIconIdentifier(): string
181 | {
182 | return 'additionalreports_plugins';
183 | }
184 | }
185 |
--------------------------------------------------------------------------------
/Classes/Reports/Status.php:
--------------------------------------------------------------------------------
1 | ' . Utility::getLL('status_description') . '';
31 |
32 | return $content . $this->display();
33 | }
34 |
35 | /**
36 | * Generate the global status report
37 | *
38 | * @return string HTML code
39 | */
40 | public function display()
41 | {
42 | $view = GeneralUtility::makeInstance(StandaloneView::class);
43 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/status-fluid.html');
44 |
45 | $this->displayTypo3($view);
46 | $this->displayEnv($view);
47 | $this->displayPhp($view);
48 | $this->displayMySql($view);
49 | $this->displayCronTab($view);
50 |
51 | return $view->render();
52 | }
53 |
54 | /**
55 | * @param \TYPO3\CMS\Fluid\View\AbstractTemplateView $view
56 | */
57 | public function displayTypo3(AbstractTemplateView $view)
58 | {
59 | // infos about typo3 versions
60 | $datas = [];
61 | $jsonVersions = Utility::getJsonVersionInfos();
62 | $currentVersionInfos = Utility::getCurrentVersionInfos($jsonVersions, GeneralUtility::makeInstance(Typo3Version::class)->getVersion());
63 | $currentBranch = Utility::getCurrentBranchInfos($jsonVersions, GeneralUtility::makeInstance(Typo3Version::class)->getVersion());
64 | $latestStable = Utility::getLatestStableInfos($jsonVersions);
65 | $latestLts = Utility::getLatestLtsInfos($jsonVersions);
66 |
67 | $extensions = [];
68 | if (is_file(Utility::getPathSite() . '/typo3conf/PackageStates.php')) {
69 | $packages = include(Utility::getPathSite() . '/typo3conf/PackageStates.php');
70 | foreach ($packages['packages'] as $extensionKey => $package) {
71 | $extensions[] = $extensionKey;
72 | }
73 | }
74 |
75 | if (Utility::isComposerMode()) {
76 | $packageManager = GeneralUtility::makeInstance(PackageManager::class);
77 | /** @var \TYPO3\CMS\Core\Package\PackageInterface $package */
78 | $activePackages = $packageManager->getActivePackages();
79 | foreach ($activePackages as $package) {
80 | $extensions[] = $package->getPackageKey();
81 | }
82 | }
83 |
84 | sort($extensions);
85 | foreach ($extensions as $aKey => $extension) {
86 | $extensions[$aKey] = $extension . ' (' . Utility::getExtensionVersion($extension) . ')';
87 | }
88 |
89 | $datas['sitename'] = $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
90 | $datas['version'] = GeneralUtility::makeInstance(Typo3Version::class)->getVersion() . ' [' . ($currentVersionInfos['date'] ?? '') . ']';
91 | $datas['current_branch'] = $currentBranch['version'] . ' [' . $currentBranch['date'] . ']';
92 | $datas['latest_stable'] = $latestStable['version'] . ' [' . $latestStable['date'] . ']';
93 | $datas['latest_lts'] = $latestLts['version'] . ' [' . $latestLts['date'] . ']';
94 | $datas['path'] = Utility::getPathSite();
95 | $datas['db_name'] = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['dbname'];
96 | $datas['db_user'] = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['user'];
97 | $datas['db_host'] = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['host'];
98 | $datas['db_init'] = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['initCommands'] ?? '';
99 | $datas['db_pcon'] = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['persistentConnection'] ?? '';
100 |
101 | // debug
102 | $datas['displayErrors'] = [
103 | 'BE/debug : ' . $GLOBALS['TYPO3_CONF_VARS']['BE']['debug'],
104 | 'FE/debug : ' . $GLOBALS['TYPO3_CONF_VARS']['FE']['debug'],
105 | 'devIPmask : ' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'],
106 | 'displayErrors : ' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'],
107 | 'systemLogLevel : ' . ($GLOBALS['TYPO3_CONF_VARS']['SYS']['systemLogLevel'] ?? ''),
108 | ];
109 |
110 | // gfx
111 | $datas['gfx'] = [
112 | 'processor_enabled : ' . $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_enabled'],
113 | 'processor_path : ' . $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path'],
114 | 'processor_path_lzw : ' . ($GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path_lzw'] ?? ''),
115 | 'processor : ' . $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor'],
116 | 'processor_effects : ' . $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_effects'],
117 | 'processor_allowTemporaryMasksAsPng : ' . ($GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_allowTemporaryMasksAsPng'] ?? ''),
118 | 'processor_colorspace : ' . $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_colorspace'],
119 | ];
120 |
121 | // mail
122 | $datas['mail'] = [
123 | 'transport : ' . $GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport'],
124 | 'transport_sendmail_command : ' . $GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_sendmail_command'],
125 | 'transport_smtp_server : ' . $GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_server'],
126 | 'transport_smtp_encrypt : ' . $GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_encrypt'],
127 | 'transport_smtp_username : ' . $GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_username'],
128 | 'transport_smtp_password : ' . $GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_password'],
129 | ];
130 |
131 | $datas['password'] = [
132 | 'BE/passwordHashing/className : ' . $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className'],
133 | 'FE/passwordHashing/className : ' . $GLOBALS['TYPO3_CONF_VARS']['FE']['passwordHashing']['className'],
134 | ];
135 |
136 | $datas['extensions'] = $extensions;
137 |
138 | $view->assign('datas_typo3', $datas);
139 | }
140 |
141 | public function displayEnv(AbstractTemplateView $view)
142 | {
143 | $datas = [];
144 | $vars = GeneralUtility::getIndpEnv('_ARRAY');
145 | foreach ($vars as $varKey => $varValue) {
146 | $datas[$varKey] = $varValue;
147 | }
148 | $gE_keys = explode(',', 'HTTP_ACCEPT,HTTP_ACCEPT_ENCODING,HTTP_CONNECTION,HTTP_COOKIE,REMOTE_PORT,SERVER_ADDR,SERVER_ADMIN,SERVER_NAME,SERVER_PORT,SERVER_SIGNATURE,SERVER_SOFTWARE,GATEWAY_INTERFACE,SERVER_PROTOCOL,REQUEST_METHOD,PATH_TRANSLATED');
149 | foreach ($gE_keys as $k) {
150 | $datas[$k] = getenv($k);
151 | }
152 | $view->assign('datas_env', $datas);
153 | }
154 |
155 | public function displayPhp(AbstractTemplateView $view): void
156 | {
157 | $data = [];
158 | $data['status_version'] = phpversion();
159 | $data['memory_limit'] = ini_get('memory_limit');
160 | $data['max_execution_time'] = ini_get('max_execution_time');
161 | $data['post_max_size'] = ini_get('post_max_size');
162 | $data['upload_max_filesize'] = ini_get('upload_max_filesize');
163 | $data['display_errors'] = ini_get('display_errors');
164 | $data['error_reporting'] = ini_get('error_reporting');
165 |
166 | if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
167 | $apacheUser = posix_getpwuid(posix_getuid());
168 | $apacheGroup = posix_getgrgid(posix_getgid());
169 | $data['apache_user'] = $apacheUser['name'] . ' (' . $apacheUser['gid'] . ')';
170 | $data['apache_group'] = $apacheGroup['name'] . ' (' . $apacheGroup['gid'] . ')';
171 | }
172 |
173 | if (function_exists('get_loaded_extensions')) {
174 | $extensions = array_map('strtolower', get_loaded_extensions());
175 | natcasesort($extensions);
176 | $data['extensions'] = $extensions;
177 | }
178 |
179 | $view->assign('datas_php', $data);
180 | }
181 |
182 | public function displayMySql(AbstractTemplateView $view)
183 | {
184 | $connection = Utility::getDatabaseConnection();
185 | $connectionParams = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections'][ConnectionPool::DEFAULT_CONNECTION_NAME];
186 |
187 | $data = [];
188 | $data['version'] = $connection->getServerVersion();
189 |
190 | $items = Utility::getQueryBuilder()
191 | ->select('default_character_set_name', 'default_collation_name')
192 | ->from('information_schema.schemata')
193 | ->where("schema_name = '" . $connectionParams['dbname'] . "'")
194 | ->executeQuery()
195 | ->fetchAllAssociative();
196 |
197 | $data['default_character_set_name'] = $items[0]['default_character_set_name'] ?? '';
198 | $data['default_collation_name'] = $items[0]['default_collation_name'] ?? '';
199 | $data['query_cache'] = Utility::getMySqlCacheInformations();
200 | $data['character_set'] = Utility::getMySqlCharacterSet();
201 |
202 | // TYPO3 database
203 | $items = Utility::getQueryBuilder()
204 | ->select(
205 | 'table_name as table_name',
206 | 'engine as engine',
207 | 'table_collation as table_collation',
208 | 'table_rows as table_rows'
209 | )
210 | ->addSelectLiteral('((data_length+index_length)/1024/1024) as "size"')
211 | ->from('information_schema.tables')
212 | ->where("table_schema = '" . $connectionParams['dbname'] . "'")
213 | ->orderBy('table_name')
214 | ->executeQuery()
215 | ->fetchAllAssociative();
216 |
217 | $tables = [];
218 | $size = 0;
219 |
220 | foreach ($items as $itemValue) {
221 | $tables[] = [
222 | 'name' => $itemValue['table_name'],
223 | 'engine' => $itemValue['engine'],
224 | 'collation' => $itemValue['table_collation'],
225 | 'rows' => $itemValue['table_rows'],
226 | 'size' => round($itemValue['size'], 2),
227 | ];
228 | $size += round($itemValue['size'], 2);
229 | }
230 |
231 | $data['tables'] = $tables;
232 | $data['tablessize'] = round($size, 2);
233 | $data['typo3db'] = $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['dbname'];
234 |
235 | $view->assign('datas_mysql', $data);
236 | }
237 |
238 | public function displayCronTab(AbstractTemplateView $view)
239 | {
240 | $data = [];
241 | if (is_executable('crontab')) {
242 | exec('crontab -l', $crontab);
243 | $crontabString = Utility::getLl('status_nocrontab');
244 | if (count($crontab) > 0) {
245 | $crontabString = '';
246 | foreach ($crontab as $cron) {
247 | if (trim($cron) !== '') {
248 | $crontabString .= $cron . '
';
249 | }
250 | }
251 | }
252 | $data['crontab'] = $crontabString;
253 | }
254 | $view->assign('datas_crontab', $data);
255 | }
256 |
257 | public function getIdentifier(): string
258 | {
259 | return 'additionalreports_status';
260 | }
261 |
262 | public function getTitle(): string
263 | {
264 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:status_title';
265 | }
266 |
267 | public function getDescription(): string
268 | {
269 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:status_description';
270 | }
271 |
272 | public function getIconIdentifier(): string
273 | {
274 | return 'additionalreports_status';
275 | }
276 | }
277 |
--------------------------------------------------------------------------------
/Classes/Reports/WebsiteConf.php:
--------------------------------------------------------------------------------
1 | display();
30 | }
31 |
32 | /**
33 | * Generate the website conf report
34 | *
35 | * @return string HTML code
36 | */
37 | public function display()
38 | {
39 | $items = Utility::exec_SELECTgetRows(
40 | 'uid, title',
41 | 'pages',
42 | 'is_siteroot = 1 AND deleted = 0 AND hidden = 0 AND pid != -1',
43 | '',
44 | '',
45 | '',
46 | 'uid'
47 | );
48 |
49 | $websiteconf = [];
50 |
51 | if (!empty($items)) {
52 | foreach ($items as $itemValue) {
53 | $websiteconfItem = [];
54 |
55 | $websiteconfItem['pid'] = $itemValue['uid'];
56 | $websiteconfItem['pagetitle'] = $itemValue['title'];
57 | $websiteconfItem['domains'] = '';
58 | $websiteconfItem['template'] = '';
59 | $websiteconfItem['domains'] = Utility::getDomain($itemValue['uid']) . '
';
60 |
61 | $templates = Utility::exec_SELECTgetRows(
62 | 'uid,title,root',
63 | 'sys_template',
64 | 'pid IN(' . $itemValue['uid'] . ') AND deleted=0 AND hidden=0',
65 | '',
66 | 'sorting'
67 | );
68 |
69 | foreach ($templates as $templateObj) {
70 | $websiteconfItem['template'] .= $templateObj['title'] . ' ';
71 | $websiteconfItem['template'] .= '[uid=' . $templateObj['uid'] . ',root=' . $templateObj['root'] . ']
';
72 | }
73 |
74 | // count pages
75 | $list = Utility::getTreeList($itemValue['uid'], 99);
76 | $listArray = explode(',', $list);
77 | $websiteconfItem['pages'] = (count($listArray) - 1);
78 | $websiteconfItem['pageshidden'] = (Utility::getCountPagesUids($list, 'hidden=1'));
79 | $websiteconfItem['pagesnosearch'] = (Utility::getCountPagesUids($list, 'no_search=1'));
80 |
81 | $websiteconf[] = $websiteconfItem;
82 | }
83 | }
84 |
85 | $view = GeneralUtility::makeInstance(StandaloneView::class);
86 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/websiteconf-fluid.html');
87 | $view->assign('items', $websiteconf);
88 | return $view->render();
89 | }
90 |
91 | public function getIdentifier(): string
92 | {
93 | return 'additionalreports_websitesconf';
94 | }
95 |
96 | public function getTitle(): string
97 | {
98 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:websitesconf_title';
99 | }
100 |
101 | public function getDescription(): string
102 | {
103 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:websitesconf_description';
104 | }
105 |
106 | public function getIconIdentifier(): string
107 | {
108 | return 'additionalreports_websitesconf';
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/Classes/Reports/Xclass.php:
--------------------------------------------------------------------------------
1 | ' . Utility::getLL('xclass_description') . '';
28 | return $content . $this->display();
29 | }
30 |
31 | /**
32 | * Generate the xclass report
33 | *
34 | * @return string HTML code
35 | */
36 | public function display()
37 | {
38 | $xclassList = [];
39 | $xclassList['objects'] = $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'];
40 | $view = GeneralUtility::makeInstance(StandaloneView::class);
41 | $view->setTemplatePathAndFilename(ExtensionManagementUtility::extPath('additional_reports') . 'Resources/Private/Templates/xclass-fluid.html');
42 | $view->assign('xclass', $xclassList);
43 | return $view->render();
44 | }
45 |
46 | public function getIdentifier(): string
47 | {
48 | return 'additionalreports_xclass';
49 | }
50 |
51 | public function getTitle(): string
52 | {
53 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:xclass_title';
54 | }
55 |
56 | public function getDescription(): string
57 | {
58 | return 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:xclass_description';
59 | }
60 |
61 | public function getIconIdentifier(): string
62 | {
63 | return 'additionalreports_xclass';
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/ContentInfosViewHelper.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class ContentInfosViewHelper extends AbstractViewHelper
24 | {
25 | /**
26 | * Disable escaping of tag based ViewHelpers so that the rendered tag is not htmlspecialchar'd
27 | *
28 | * @var boolean
29 | */
30 | protected $escapeOutput = false;
31 |
32 | public function initializeArguments()
33 | {
34 | $this->registerArgument('item', 'array', 'Current item array', false, null);
35 | $this->registerArgument('as', 'string', 'Name of the items array', false, null);
36 | $this->registerArgument('plugin', 'boolean', 'Is it a plugin?', false, null);
37 | $this->registerArgument('ctype', 'boolean', 'Is it a CType?', false, null);
38 | }
39 |
40 | /**
41 | * Renders else-child or else-argument if variable $item is in $list
42 | */
43 | public function render()
44 | {
45 | $item = $this->arguments['item'];
46 | $as = $this->arguments['as'];
47 | $plugin = $this->arguments['plugin'];
48 | $ctype = $this->arguments['ctype'];
49 |
50 | // plugin
51 | if ($plugin === true) {
52 | $item = array_merge($item, \Sng\AdditionalReports\Utility::getContentInfosFromTca('plugin', $item['list_type']));
53 | }
54 |
55 | // CType
56 | if ($ctype === true) {
57 | $item = array_merge($item, \Sng\AdditionalReports\Utility::getContentInfosFromTca('ctype', $item['CType']));
58 | }
59 |
60 | $item = array_merge($item, $this->getContentInfos($item));
61 |
62 | if ($this->templateVariableContainer->exists($as)) {
63 | $this->templateVariableContainer->remove($as);
64 | }
65 | $this->templateVariableContainer->add($as, $item);
66 | }
67 |
68 | /**
69 | * Return informations about a ctype or plugin
70 | *
71 | * @param array $itemValue
72 | * @return array
73 | */
74 | public function getContentInfos(array $itemValue): array
75 | {
76 | $markersExt = [];
77 |
78 | $domain = Utility::getDomain($itemValue['pid']);
79 | $markersExt['domain'] = Utility::getIconDomain() . ' ' . $domain;
80 |
81 | $iconPage = ($itemValue['hiddenpages'] == 0) ? Utility::getIconPage() : Utility::getIconPage(true);
82 | $iconContent = ($itemValue['hiddentt_content'] == 0) ? Utility::getIconContent() : Utility::getIconContent(true);
83 |
84 | $markersExt['pid'] = $iconPage . ' ' . $itemValue['pid'];
85 | $markersExt['uid'] = $iconContent . ' ' . $itemValue['uid'];
86 | $markersExt['pagetitle'] = $itemValue['title'];
87 |
88 | $markersExt['usedtv'] = '';
89 | $markersExt['usedtvclass'] = '';
90 |
91 | $linkAtt = ['href' => '#', 'title' => Utility::getLl('switch'), 'onclick' => Utility::goToModuleList($itemValue['pid']), 'class' => 'btn btn-default'];
92 | $markersExt['db'] = Utility::generateLink($linkAtt, Utility::getIconWebList());
93 |
94 | $linkAtt = ['href' => Utility::goToModuleList($itemValue['pid'], true), 'target' => '_blank', 'title' => Utility::getLl('newwindow'), 'class' => 'btn btn-default'];
95 | $markersExt['db'] .= Utility::generateLink($linkAtt, Utility::getIconWebList());
96 |
97 | $linkAtt = ['href' => '#', 'title' => Utility::getLl('switch'), 'onclick' => Utility::goToModulePage($itemValue['pid']), 'class' => 'btn btn-default'];
98 | $markersExt['page'] = Utility::generateLink($linkAtt, Utility::getIconWebPage());
99 |
100 | $linkAtt = ['href' => Utility::goToModulePage($itemValue['pid'], true), 'target' => '_blank', 'title' => Utility::getLl('newwindow'), 'class' => 'btn btn-default'];
101 | $markersExt['page'] .= Utility::generateLink($linkAtt, Utility::getIconWebPage());
102 |
103 | $markersExt['preview'] = '/index.php?id=' . $itemValue['pid'];
104 |
105 | return $markersExt;
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/InListViewHelper.php:
--------------------------------------------------------------------------------
1 | ...
20 | */
21 | class InListViewHelper extends AbstractConditionViewHelper
22 | {
23 | public function initializeArguments()
24 | {
25 | $this->registerArgument('list', 'string', 'List');
26 | $this->registerArgument('item', 'string', 'Item');
27 | }
28 |
29 | /**
30 | * Renders else-child or else-argument if variable $item is in $list
31 | *
32 | * @return string
33 | */
34 | public function render()
35 | {
36 | if (GeneralUtility::inList($this->arguments['list'], $this->arguments['item'])) {
37 | return $this->renderThenChild();
38 | }
39 | return $this->renderElseChild();
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/RawViewHelper.php:
--------------------------------------------------------------------------------
1 |
24 | * {string}
25 | *
26 | *
29 | *
30 | *
31 | *
32 | *
33 | *
36 | *
37 | *
38 | * {string -> f:format.raw()}
39 | *
40 | *
43 | */
44 | class RawViewHelper extends AbstractViewHelper
45 | {
46 |
47 | /**
48 | * Disable the escaping interceptor because otherwise the child nodes would be escaped before this view helper
49 | * can decode the text's entities.
50 | *
51 | * @var bool
52 | */
53 | protected $escapingInterceptorEnabled = false;
54 |
55 | /**
56 | * @param mixed $value The value to output
57 | * @return string
58 | */
59 | public function render($value = null)
60 | {
61 | if ($value === null) {
62 | return $this->renderChildren();
63 | }
64 | return $value;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/Classes/ViewHelpers/SpriteManagerIconViewHelper.php:
--------------------------------------------------------------------------------
1 | registerArgument('iconName', 'string', 'as', true);
37 | $this->registerArgument('size', 'integer', 'size', false, Icon::SIZE_SMALL);
38 | }
39 |
40 | /**
41 | * Prints sprite icon html for $iconName key
42 | *
43 | * @return string
44 | */
45 | public function render()
46 | {
47 | $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
48 | return $iconFactory->getIcon($this->arguments['iconName'], $this->arguments['size']);
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Configuration/Backend/Routes.php:
--------------------------------------------------------------------------------
1 | [
4 | 'path' => '/additional_reports/compareFiles',
5 | 'target' => \Sng\AdditionalReports\Eid\CallAjax::class . '::main',
6 | ],
7 | ];
8 |
--------------------------------------------------------------------------------
/Configuration/Icons.php:
--------------------------------------------------------------------------------
1 | [
4 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
5 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_eid.png',
6 | ],
7 | 'additionalreports_commandcontrollers' => [
8 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
9 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_commandcontrollers.png',
10 | ],
11 | 'additionalreports_plugins' => [
12 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
13 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_plugins.png',
14 | ],
15 | 'additionalreports_xclass' => [
16 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
17 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_xclass.png',
18 | ],
19 | 'additionalreports_hooks' => [
20 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
21 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_hooks.png',
22 | ],
23 | 'additionalreports_status' => [
24 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
25 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_status.png',
26 | ],
27 | 'additionalreports_logerrors' => [
28 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
29 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_logerrors.png',
30 | ],
31 | 'additionalreports_middlewares' => [
32 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
33 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_middlewares.png',
34 | ],
35 | 'additionalreports_websitesconf' => [
36 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
37 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_websitesconf.png',
38 | ],
39 | 'additionalreports_extensions' => [
40 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
41 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_extensions.png',
42 | ],
43 | 'additionalreports_eventdispatcher' => [
44 | 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
45 | 'source' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_eventdispatcher.png',
46 | ],
47 | ];
--------------------------------------------------------------------------------
/Configuration/Services.yaml:
--------------------------------------------------------------------------------
1 | services:
2 | _defaults:
3 | autoconfigure: true
4 |
5 | Sng\AdditionalReports\Reports\CommandControllers:
6 | tags:
7 | - { name: additionalreports_commandcontrollers.report }
8 |
9 | Sng\AdditionalReports\Reports\Eid:
10 | tags:
11 | - { name: additionalreports_eid.report }
12 |
13 | Sng\AdditionalReports\Reports\EventDispatcher:
14 | tags:
15 | - { name: additionalreports_eventdispatcher.report }
16 |
17 | Sng\AdditionalReports\Reports\Extensions:
18 | tags:
19 | - { name: additionalreports_extensions.report }
20 |
21 | Sng\AdditionalReports\Reports\Hooks:
22 | tags:
23 | - { name: additionalreports_hooks.report }
24 |
25 | Sng\AdditionalReports\Reports\LogErrors:
26 | tags:
27 | - { name: additionalreports_logerrors.report }
28 |
29 | Sng\AdditionalReports\Reports\Middlewares:
30 | tags:
31 | - { name: additionalreports_middlewares.report }
32 |
33 | Sng\AdditionalReports\Reports\Plugins:
34 | tags:
35 | - { name: additionalreports_plugins.report }
36 |
37 | Sng\AdditionalReports\Reports\Status:
38 | tags:
39 | - { name: additionalreports_status.report }
40 |
41 | Sng\AdditionalReports\Reports\WebsiteConf:
42 | tags:
43 | - { name: additionalreports_websitesconf.report }
44 |
45 | Sng\AdditionalReports\Reports\Xclass:
46 | tags:
47 | - { name: additionalreports_xclass.report }
48 |
--------------------------------------------------------------------------------
/Documentation/README.md:
--------------------------------------------------------------------------------
1 | additional_reports : Useful information in reports module
2 | =======================================================
3 |
4 | Please visit our full documentation at: https://github.com/Apen/additional_reports/blob/master/README.md.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # additional_reports
2 |
3 | [](https://packagist.org/packages/apen/additional_reports)
4 | [](https://packagist.org/packages/apen/additional_reports)
5 | [](https://get.typo3.org/version/12)
6 | [](https://get.typo3.org/version/13)
7 | 
8 |
9 | **Display some useful information in the reports module.**
10 |
11 | ## ❓ What does it do?
12 |
13 | Display some useful information in the reports module, like :
14 |
15 | * list of eID
16 | * list of CommandController and Symfony Commands
17 | * list of all the contents and plugins on the instance (used or not) with filters
18 | * list of xclass declared
19 | * list of hooks declared
20 | * lot of information about the website : TYPO3, System Environment Variables, PHP, MySQL, Apache, Crontab, encoding...
21 | * list of log errors group by number of occurrences (sorting by last time seen or number)
22 | * list of all websites declared with information : domain, sys_template, number of pages...
23 | * list of extensions with information : number of tables, last version date, visual comparison between current and TER extension to see what could be hard coded
24 | * list of all the Middlewares (PSR-15) for frontend and backend
25 |
26 | All this tools can really help you during migration or new existing project (to have a global reports of the system).
27 | Do not hesitate to contact me if you have any good ideas.
28 |
29 | ## ⏳ Installation
30 |
31 | Download and install as TYPO3 extension.
32 |
33 | * Composer : `composer require apen/additional_reports`
34 | * TER url : https://extensions.typo3.org/extension/additional_reports/
35 | * Releases on Github : https://github.com/Apen/additional_reports/releases
36 |
37 | Maybe a "clear cache" is needed, then go to the reports module.
38 |
39 | ## 💻 Features
40 |
41 | ### eID
42 |
43 | 
44 |
45 | ### Commands
46 |
47 | 
48 |
49 | ### Plugins and CTypes
50 |
51 | 
52 |
53 | 
54 |
55 | 
56 |
57 | ### XCLASS
58 |
59 | 
60 |
61 | ### Hooks
62 |
63 | 
64 |
65 | ### Global status
66 |
67 | 
68 | 
69 |
70 | ### Grouped logs
71 |
72 | 
73 |
74 | ### List of websites and domains
75 |
76 | 
77 |
78 | ### Extensions
79 |
80 | 
81 |
82 | Text diff with TER and last version
83 |
84 | 
85 |
86 | ### EventDispatcher (PSR-14)
87 |
88 | 
89 |
90 | ### Middlewares (PSR-15)
91 |
92 | 
93 |
--------------------------------------------------------------------------------
/Resources/Private/Language/de.locallang.xlf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | module
6 | Language labels for module 'Additional reports'
7 | LFEditor
8 |
9 |
10 |
11 | List of all the ajax.php methods with informations and status for each of them.
12 |
13 | Auflistung aller registrierten ajax.php-Methoden mit Informationen
14 |
15 |
16 | Additional reports - ajax
17 | Zusatzbericht - AJAX (ajax.php)
18 |
19 |
20 | All
21 | Alle
22 |
23 |
24 | List of all the cliKeys with informations and status for each of them.
25 | Auflistung aller vorhandenen cliKeys mit Informationen
26 |
27 |
28 | Additional reports - cliKeys
29 | Zusatzbericht - cliKeys
30 |
31 |
32 | Content
33 | Inhalt
34 |
35 |
36 | Content type
37 | Inhaltstyp
38 |
39 |
40 | List of all the eID with informations and status for each of them.
41 | Auflistung aller eID-Skripte mit Informationen
42 |
43 |
44 | Additional reports - eID
45 | Zusatzbericht - AJAX (eID)
46 |
47 |
48 | Extension manager
49 | Erweiterungsmanager
50 |
51 |
52 | EM Link
53 | EM-Link
54 |
55 |
56 | List of all the ExtDirect with informations and status for each of them.
57 | Auflistung aller ExtDirect-Klassen mit Informationen
58 |
59 |
60 | Additional reports - ExtDirect
61 | Zusatzbericht - AJAX (ExtDirect)
62 |
63 |
64 | Extension
65 | Erweiterung
66 |
67 |
68 | List of all the extension with informations for each of them.
69 | Auflistung aller Erweiterungen mit Informationen
70 |
71 |
72 | specific developpment(s)
73 | Spezifische Entwicklung(en)
74 |
75 |
76 | loaded extension(s)
77 | Geladene Erweiterung(en)
78 |
79 |
80 | modified extension(s)
81 | Modifizierte Erweiterung(en)
82 |
83 |
84 | Modified files !!!
85 | Modifizierte Dateien
86 |
87 |
88 | modified(s) file(s) in this extension
89 | Modifizierte Dateien in dieser Erweiterung
90 |
91 |
92 | Tables and fields
93 | Tabellen und Felder
94 |
95 |
96 | Need DB update ?
97 | Datenbank-Aktualisierung benötigt?
98 |
99 |
100 | table(s) in this extension
101 | DB-Tabellen in dieser Erweiterung
102 |
103 |
104 | extension(s) from the TER
105 | Erweiterung(en) aus dem TER
106 |
107 |
108 | Additional reports - loaded extension list
109 | Zusatzbericht - Geladene Erweiterungen
110 |
111 |
112 | extension(s) to update
113 | Aktualisierbare Erweiterungen
114 |
115 |
116 | You need to update the extension list in the Extension Manager.
117 | Btte aktualisieren Sie die Erweiterungsliste, um aktuelle Daten angezeigt zu
118 | bekommen.
119 |
120 |
121 |
122 | Filter by category
123 | Filtern nach Kategorie
124 |
125 |
126 | Core hooks
127 | Core-Hooks
128 |
129 |
130 | Core file
131 | Core-Datei
132 |
133 |
134 | List of all the hooks with the name and the path for each of them.
135 | Auflistung aller Hooks mit Namen und Pfad
136 |
137 |
138 | Extension hooks
139 | Hooks in Erweiterungen
140 |
141 |
142 | File or class
143 | Datei oder Klasse
144 |
145 |
146 | Line with the hook in the ext_localconf.php file of the extension
147 | Zeilenangabe der Hook-Registrierung in der ext_localconf.php der Erweiterung
148 |
149 |
150 | Hook name
151 | Hook-Name
152 |
153 |
154 | Additional reports - hooks
155 | Zusatzbericht - Hooks
156 |
157 |
158 | Locallang
159 | Locallang
160 |
161 |
162 | Name
163 | Name
164 |
165 |
166 | No
167 | Nein
168 |
169 |
170 | There is no results to display
171 | Keine Ergebnisse zum Anzeigen
172 |
173 |
174 | Page title
175 | Seitentitel
176 |
177 |
178 | Path
179 | Pfad
180 |
181 |
182 | Page uid
183 | Seiten-ID
184 |
185 |
186 | Plugin
187 | Plugin
188 |
189 |
190 | List of all the plugins and contents type with informations and status for each of
191 | them. With this report you can easily know if a plugin or a content
192 | type is used on the system (and where it is used).
193 |
194 | Eine Auflistung aller Plugins und Inhaltstypen mit Informationen. Hierdurch können
195 | Sie prüfen, welche davon auf diesem System im Einsatz bzw. wo diese
196 | genutzt werden.
197 |
198 |
199 |
200 | Additional reports - plugins & content type
201 | Zusatzbericht - Plugins & Inhaltstypen
202 |
203 |
204 | Choose a display mode :
205 | Anzeigemodus auswählen:
206 |
207 |
208 | List of all the plugins
209 | Liste aller Plugins
210 |
211 |
212 | List of all the content types
213 | Liste aller Inhaltstypen
214 |
215 |
216 | List of used content types
217 | Liste der benutzten Inhaltstypen
218 |
219 |
220 | List of used content types (and hidden)
221 | Liste der benutzten Inhaltstypen (berücksichtigt versteckte Inhalte)
222 |
223 |
224 | List of used plugins
225 | Liste der benutzten Plugins
226 |
227 |
228 | List of used plugins (and hidden)
229 | Liste der benutzten Plugins (berücksichtigt versteckte Inhalte)
230 |
231 |
232 | Summary
233 | Zusammenfassung
234 |
235 |
236 | Display
237 | Anzeigen
238 |
239 |
240 | References
241 | Referenzen
242 |
243 |
244 | List of all the usefull informations about your installation.
245 | Auflistung nützlicher Informationen zum System
246 |
247 |
248 | ImageMagick
249 | ImageMagick
250 |
251 |
252 | Last version
253 | Letzte Version
254 |
255 |
256 | Loaded extensions
257 | Geladene Erweiterungen
258 |
259 |
260 | No crontab
261 | Kein Crontab
262 |
263 |
264 | Path
265 | Pfad
266 |
267 |
268 | Sitename
269 | Seitenname
270 |
271 |
272 | Additional reports - general status
273 | Zusatzbericht - Allgemeiner Status
274 |
275 |
276 | Version
277 | Version
278 |
279 |
280 | Used by templavoila ?
281 | Benutzt durch TemplaVoila?
282 |
283 |
284 | Content uid
285 | Inhalts-Id
286 |
287 |
288 | Used ?
289 | Benutzt?
290 |
291 |
292 | Backend user
293 | Backend-Benutzer
294 |
295 |
296 | List of all the XCLASS with the name and the path for each of them.
297 | Auflistung aller XCLASS-Registrierungen mit Namen und Pfad
298 |
299 |
300 | Additional reports - XCLASS
301 | Zusatzbericht - XCLASS
302 |
303 |
304 | Yes
305 | Ja
306 |
307 |
308 |
309 |
--------------------------------------------------------------------------------
/Resources/Private/Partials/Pagination.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/commandcontrollers-fluid.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | |
8 |
9 |
10 | Command |
11 | Class |
12 |
13 |
14 |
15 |
16 |
17 | {command} |
18 | {class} |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/eid-fluid.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | |
8 |
9 |
10 | |
11 |
12 |
13 | |
14 |
15 |
16 | |
17 |
18 |
19 | |
20 |
21 |
22 |
23 |
24 |
25 |  |
26 | {eid.extension} |
27 | {eid.name} |
28 | {eid.path} |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/events-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | |
11 |
12 |
13 | |
14 |
15 |
16 |
17 |
18 |
19 | {event.className} |
20 |
21 | {event.list}
22 | |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/extensions-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
4 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | |
30 |
31 |
32 |
33 |
34 | |
35 |
36 |
37 | |
38 |
39 |
40 | |
41 |
42 |
43 | |
44 |
45 |
46 | |
47 |
48 |
49 | |
50 |
51 |
52 |
53 |
54 |
55 |
56 | {extension.extension} |
57 | {extension.version} |
58 |
59 | {extension.versionlast}
60 | |
61 |
62 |
63 | |
64 |
65 | {extension.confintegrity}
66 |
67 | |
68 |
69 |
70 |
71 | |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | |
88 |
89 |
90 |
91 |
92 | |
93 |
94 |
95 | |
96 |
97 |
98 | |
99 |
100 |
101 |
102 |
103 |
104 | {extension.extension} |
105 | {extension.version} |
106 |
107 |
108 | |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 | |
125 |
126 |
127 |
128 |
129 | |
130 |
131 |
132 | |
133 |
134 |
135 | |
136 |
137 |
138 |
139 |
140 |
141 | {extension.extension} |
142 | {extension.version} |
143 |
144 |
145 | |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
158 |
159 |
160 |
161 |
164 |
165 | {content}
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
178 |
179 |
180 |
181 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
202 |
203 |
204 |
205 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/hooks-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | |
11 |
12 |
13 |
14 |
15 | |
16 |
17 |
18 | |
19 |
20 |
21 | |
22 |
23 |
24 |
25 |
26 |
27 | {hook.corefile} |
28 | {hook.name} |
29 |
30 | {hook.file}
31 | |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | |
47 |
48 |
49 |
50 |
51 | |
52 |
53 |
54 | |
55 |
56 |
57 | |
58 |
59 |
60 |
61 |
62 |
63 | {hook.corefile} |
64 | {hook.name} |
65 |
66 | {hook.file}
67 | |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/logerrors-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
45 |
46 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/middlewares-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | frontend
10 | |
11 |
12 |
13 | # |
14 |
15 |
16 | |
17 | Class |
18 |
19 |
20 |
21 |
22 |
23 | {iterator.cycle} |
24 | {name} |
25 | {class} |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | backend
40 | |
41 |
42 |
43 | # |
44 |
45 |
46 | |
47 | Class |
48 |
49 |
50 |
51 |
52 |
53 | {iterator.cycle} |
54 | {name} |
55 | {class} |
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/plugins-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
4 |
5 | {caution}
6 |
7 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | |
57 |
58 |
59 | |
60 |
61 |
62 | |
63 |
64 |
65 | |
66 | % |
67 |
68 |
69 |
70 |
71 |
72 |  |
73 | {item.content} |
74 | {item.references} |
75 | {item.pourc}% |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 | {filtersCat}
86 |
87 |
88 |
89 |
90 |
91 |
92 | |
93 |
94 |
95 | |
96 |
97 |
98 | |
99 |
100 |
101 | |
102 |
103 |
104 | |
105 |
106 |
107 | |
108 |
109 |
110 | |
111 | DB mode |
112 |
113 |
114 | Page TV |
115 |
116 |
117 | |
118 |
119 |
120 | Page |
121 |
122 |
123 |
124 |
125 | |
126 |
127 |
128 |
129 |
130 |
131 |
132 |  |
133 | {item.ctype} |
134 |
135 | {item.domain}
136 | |
137 |
138 | {item.pid}
139 | |
140 |
141 | {item.uid}
142 | |
143 | {item.pagetitle} |
144 |
145 | {item.db}
146 | |
147 |
148 | {item.page}
149 | |
150 |
151 | {item.usedtv} |
152 |
153 |
154 |
155 |
156 |
157 | |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 | {filtersCat}
171 |
172 |
173 |
174 |
175 |
176 |
177 | |
178 |
179 |
180 | |
181 |
182 |
183 | |
184 |
185 |
186 | |
187 |
188 |
189 | |
190 |
191 |
192 | |
193 |
194 |
195 | |
196 |
197 |
198 | |
199 | DB mode |
200 |
201 |
202 | Page TV |
203 |
204 |
205 | |
206 |
207 |
208 | Page |
209 |
210 |
211 |
212 |
213 | |
214 |
215 |
216 |
217 |
218 |
219 |
220 |  |
221 | {item.extension} |
222 | {item.plugin} |
223 |
224 | {item.domain}
225 | |
226 |
227 | {item.pid}
228 | |
229 |
230 | {item.uid}
231 | |
232 | {item.pagetitle} |
233 |
234 | {item.db}
235 | |
236 |
237 | {item.page}
238 | |
239 |
240 | {item.usedtv} |
241 |
242 |
243 |
244 |
245 |
246 | |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/status-fluid.html:
--------------------------------------------------------------------------------
1 | {namespace ar=Sng\AdditionalReports\ViewHelpers}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | {datas_mysql.typo3db} -
78 |
79 | tables
80 | |
81 |
82 |
83 | Name |
84 | Engine |
85 | Collation |
86 | Rows |
87 | Size (in MB) |
88 |
89 |
90 |
91 |
92 |
93 | {table.name} |
94 | {table.engine} |
95 | {table.collation} |
96 | {table.rows} |
97 | {table.size} |
98 |
99 |
100 |
101 | Total |
102 | {datas_mysql.tablessize} MB |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | {forcelabel}
126 |
127 |
128 | |
129 |
130 |
131 | {value}
132 |
133 |
134 |
135 |
136 | -
137 | {value}
138 |
139 |
140 |
141 |
142 | |
143 |
144 |
145 |
146 |
147 |
148 |
153 |
154 |
155 | {content}
156 |
157 |
158 |
159 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/websiteconf-fluid.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | |
8 |
9 |
10 |
11 |
12 | |
13 |
14 |
15 | |
16 |
17 |
18 | |
19 | sys_template |
20 | pages |
21 | pages.hidden |
22 | pages.no_search |
23 |
24 |
25 |
26 |
27 |
28 | {item.pid} |
29 |
30 | {item.pagetitle}
31 | |
32 |
33 | {item.domains}
34 | |
35 |
36 | {item.template}
37 | |
38 | {item.pages} |
39 | {item.pageshidden} |
40 | {item.pagesnosearch} |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/Resources/Private/Templates/xclass-fluid.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | XCLASS with $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'] |
8 |
9 |
10 |
11 |
12 | |
13 |
14 |
15 | |
16 |
17 |
18 |
19 |
20 |
21 | {path.className} |
22 | {name} |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/Resources/Public/Css/tx_additionalreports.css:
--------------------------------------------------------------------------------
1 | div.module div.container-small {
2 | all: revert;
3 | }
4 |
5 | .message-information {
6 | background-color: #EAF7FF;
7 | border-color: #C5DBE6;
8 | color: #4C73A1 !important;
9 | }
10 |
11 | .typo3-message {
12 | background-position: 10px 4px;
13 | background-repeat: no-repeat;
14 | border: 1px solid;
15 | margin-bottom: 4px;
16 | padding: 5px 12px 5px 36px;
17 | }
18 |
19 | .typo3-message li {
20 | margin-bottom: 0px;
21 | }
22 |
23 | .message-left {
24 | float: left;
25 | width: 400px;
26 | color: #4C73A1 !important;
27 | }
28 |
29 | .message-right {
30 | float: left;
31 | color: #4C73A1 !important;
32 | }
33 |
34 | .message-body {
35 | clear: left;
36 | }
37 |
38 | .typo3-message .message-header {
39 | font-size: 11px;
40 | font-weight: bold;
41 | display: block;
42 | }
43 |
44 | .tx_sv_reportlist td {
45 | vertical-align: middle;
46 | }
47 |
48 | .tx_sv_reportlist td ul {
49 | margin-top: 0px;
50 | margin-bottom: 0px;
51 | }
52 |
53 | .tx_sv_reportlist .bgColor2 td {
54 | text-align: left;
55 | font-weight: bold;
56 | color: #fff;
57 | }
58 |
59 | table.typo3-dblist {
60 | margin-bottom: 1.5em;
61 | width: 100%;
62 | border: 1px solid #d7d7d7;
63 | border-collapse: separate;
64 | }
65 |
66 | table.typo3-dblist tr td {
67 | padding: 3px 6px 3px 6px;
68 | }
69 |
70 | .t3-row-header {
71 | background-color: #5B5B5B;
72 | background-image: -moz-linear-gradient(center top, #7F7F7F 10%, #5B5B5B 100%);
73 | background-repeat: repeat-x;
74 | color: #FFFFFF;
75 | font-size: 10px;
76 | height: 20px;
77 | line-height: 19px;
78 | padding: 1px 4px;
79 | }
80 |
81 | .t3-row-header:hover, .t3-row-header:hover td {
82 | background-color: #5B5B5B !important;
83 | background-image: -moz-linear-gradient(center top, #7F7F7F 10%, #5B5B5B 100%) !important;
84 | background-repeat: repeat-x !important;
85 | }
86 |
87 | tr.t3-row-header td {
88 | color: #FFFFFF;
89 | font-size: 10px;
90 | font-weight: bold;
91 | line-height: 16px;
92 | }
93 |
94 | table.typo3-dblist tr td.c-headLine, table.typo3-dblist tr.c-headLine td {
95 | border-bottom: 1px solid #CDCDCD;
96 | background-color: #FFFFFF !important;
97 | height: 24px;
98 | background-image: none !important;
99 | }
100 |
101 | table.typo3-dblist tr:hover td.c-headLine, table.typo3-dblist tr.c-headLine:hover td {
102 | background-color: #FFFFFF;
103 | }
104 |
105 | table.typo3-dblist tr.db_list_normal td {
106 | padding-bottom: 5px;
107 | padding-top: 5px;
108 | }
109 |
110 | table.typo3-dblist tr.db_list_normal:nth-child(2n+1) td {
111 | background-color: #F7F7F7;
112 | }
113 |
114 | table.typo3-dblist tr.db_list_normal:hover td {
115 | background-color: #DEDEDE;
116 | }
117 |
118 | td.col-icon img {
119 | max-height: 16px;
120 | max-width: 16px;
121 | }
122 |
123 | table.typo3-dblist tr td.col-icon {
124 | padding-left: 4px;
125 | padding-right: 0;
126 | vertical-align: middle;
127 | width: 20px;
128 | }
129 |
130 | table.typo3-dblist tr td.col-icon img {
131 | max-height: 18px;
132 | width: auto;
133 | vertical-align: middle;
134 | }
135 |
136 | table.typo3-dblist tr td.typo3-message {
137 | padding: 12px 12px 12px 36px;
138 | width: 50px;
139 | background-position: 10px 12px;
140 | background-repeat: no-repeat;
141 | border: 1px solid;
142 | }
143 |
144 | table.typo3-dblist tr td.message-ok {
145 | background-color: #CDEACA !important;
146 | background-image: url("../../../../../typo3/sysext/t3skin/icons/gfx/ok.png");
147 | border-color: #58B548;
148 | color: #3B7826;
149 | }
150 |
151 | table.typo3-dblist tr td.message-error {
152 | background-color: #F6D3CF !important;
153 | background-image: url("../../../../../typo3/sysext/t3skin/icons/gfx/error.png");
154 | border-color: #D66C68;
155 | color: #AA0225;
156 | }
157 |
158 | table.typo3-dblist tr td.infos {
159 | background-color: #FBF6DE !important;
160 | }
161 |
162 | table.typo3-dblist tr td.specs {
163 | background-color: #FFDDDD !important;
164 | }
165 |
166 | table.debug {
167 | font-size: 10px;
168 | }
169 |
170 | table.debug td.debugvar {
171 | color: red;
172 | }
173 |
174 | #filtersCat {
175 | margin: 10px;
176 | }
--------------------------------------------------------------------------------
/Resources/Public/Icons/Extension.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Resources/Public/Icons/garbage.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/garbage.gif
--------------------------------------------------------------------------------
/Resources/Public/Icons/module_web_layout.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/module_web_layout.gif
--------------------------------------------------------------------------------
/Resources/Public/Icons/module_web_list.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/module_web_list.gif
--------------------------------------------------------------------------------
/Resources/Public/Icons/reddown.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/reddown.gif
--------------------------------------------------------------------------------
/Resources/Public/Icons/redup.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/redup.gif
--------------------------------------------------------------------------------
/Resources/Public/Icons/refresh_n.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/refresh_n.gif
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_ajax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_ajax.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_clikeys.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_clikeys.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_commandcontrollers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_commandcontrollers.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_dbcheck.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_dbcheck.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_eid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_eid.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_eventdispatcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_eventdispatcher.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_extdirect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_extdirect.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_extensions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_extensions.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_hooks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_hooks.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_logerrors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_logerrors.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_middlewares.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_middlewares.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_plugins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_plugins.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_realurlerrors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_realurlerrors.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_status.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_status.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_websitesconf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_websitesconf.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/tx_additionalreports_xclass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/tx_additionalreports_xclass.png
--------------------------------------------------------------------------------
/Resources/Public/Icons/zoom.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Icons/zoom.gif
--------------------------------------------------------------------------------
/Resources/Public/Images/ajax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/ajax.png
--------------------------------------------------------------------------------
/Resources/Public/Images/clikeys.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/clikeys.png
--------------------------------------------------------------------------------
/Resources/Public/Images/commands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/commands.png
--------------------------------------------------------------------------------
/Resources/Public/Images/ctypes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/ctypes.png
--------------------------------------------------------------------------------
/Resources/Public/Images/eid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/eid.png
--------------------------------------------------------------------------------
/Resources/Public/Images/eventdispatcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/eventdispatcher.png
--------------------------------------------------------------------------------
/Resources/Public/Images/extdirect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/extdirect.png
--------------------------------------------------------------------------------
/Resources/Public/Images/extensions-diff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/extensions-diff.png
--------------------------------------------------------------------------------
/Resources/Public/Images/extensions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/extensions.png
--------------------------------------------------------------------------------
/Resources/Public/Images/hooks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/hooks.png
--------------------------------------------------------------------------------
/Resources/Public/Images/logs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/logs.png
--------------------------------------------------------------------------------
/Resources/Public/Images/middlewares.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/middlewares.png
--------------------------------------------------------------------------------
/Resources/Public/Images/plugins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/plugins.png
--------------------------------------------------------------------------------
/Resources/Public/Images/realurl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/realurl.png
--------------------------------------------------------------------------------
/Resources/Public/Images/sql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/sql.png
--------------------------------------------------------------------------------
/Resources/Public/Images/status-typo3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/status-typo3.png
--------------------------------------------------------------------------------
/Resources/Public/Images/status1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/status1.png
--------------------------------------------------------------------------------
/Resources/Public/Images/status2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/status2.png
--------------------------------------------------------------------------------
/Resources/Public/Images/summary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/summary.png
--------------------------------------------------------------------------------
/Resources/Public/Images/websites.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/websites.png
--------------------------------------------------------------------------------
/Resources/Public/Images/xclass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Apen/additional_reports/aeb90ae72c056866cc452bc8dce56892ac7d4f81/Resources/Public/Images/xclass.png
--------------------------------------------------------------------------------
/Resources/Public/JavaScript/plugins.js:
--------------------------------------------------------------------------------
1 | document.addEventListener("DOMContentLoaded", function () {
2 | function jumpToUrl(URL) {
3 | window.location.href = URL;
4 | }
5 |
6 | document.querySelectorAll("#choice-display input[name='display']").forEach(function (input) {
7 | input.addEventListener("click", function () {
8 | jumpToUrl(this.dataset.url);
9 | });
10 | });
11 |
12 | if (document.getElementById("filtersCat")) {
13 | document.getElementById("filtersCat").addEventListener("change", function () {
14 | jumpToUrl(this.dataset.url + "&filtersCat=" + this.value);
15 | });
16 | }
17 | });
--------------------------------------------------------------------------------
/Tests/Functional/Fixtures/be_users.csv:
--------------------------------------------------------------------------------
1 | "be_users",,,,,,,,
2 | ,uid,pid,username,email,realName,admin,deleted,disable
3 | ,1,0,admin@test.fr,admin@test.fr,Admin,1,0,0
4 | ,2,0,user@test.fr,user@test.fr,User,0,0,0
5 | ,3,0,user2@test.fr,user2@test.fr,User,0,0,0
--------------------------------------------------------------------------------
/Tests/Functional/Fixtures/pages.csv:
--------------------------------------------------------------------------------
1 | "pages"
2 | ,"uid","pid","title","deleted","hidden","no_search"
3 | ,1,0,"Congratulations",0,0,0
4 | ,2,1,"Frontend User",0,0,0
5 | ,3,1,"File Collections",0,0,0
6 | ,4,1,"Shared Content",0,0,0
7 | ,5,1,"404",0,0,1
8 | ,6,1,"Content Examples",0,0,0
9 | ,7,6,"And more...",0,0,0
10 | ,8,7,"Frames",0,0,0
11 | ,9,7,"Images with links",0,0,0
12 | ,10,7,"Any language, any character",0,0,0
13 | ,11,6,"Special elements",0,0,0
14 | ,12,11,"Divider",0,0,0
15 | ,13,11,"HTML",0,0,0
16 | ,14,11,"Insert records",0,0,0
17 | ,15,6,"Menu's",0,0,0
18 | ,16,15,"Thumbnails",0,0,0
19 | ,17,15,"Sitemap",0,0,0
20 | ,18,15,"Sections",0,0,0
21 | ,19,15,"Related Pages",0,0,0
22 | ,20,15,"Recently Updated",0,0,0
23 | ,21,15,"Categorized",0,0,0
24 | ,22,15,"Abstract",0,0,0
25 | ,23,15,"Pages",0,0,0
26 | ,24,6,"Form elements",0,0,0
27 | ,25,24,"Search",0,0,0
28 | ,26,24,"Login",0,0,0
29 | ,27,24,"Forms",0,0,0
30 | ,28,6,"Intreractive",0,0,0
31 | ,29,28,"Tab",0,0,0
32 | ,30,28,"Carousel",0,0,0
33 | ,31,28,"Accordion",0,0,0
34 | ,32,6,"Media",0,0,0
35 | ,33,32,"External Media",0,0,0
36 | ,34,32,"Media",0,0,0
37 | ,35,32,"Images",0,0,0
38 | ,36,32,"File downloads",0,0,0
39 | ,37,32,"Text and Media",0,0,0
40 | ,38,32,"Text and Images",0,0,0
41 | ,39,32,"Audio",0,0,0
42 | ,40,6,"Text",0,0,0
43 | ,41,40,"Quote",0,0,0
44 | ,42,40,"Table",0,0,0
45 | ,43,40,"Panel",0,0,0
46 | ,44,40,"List Group",0,0,0
47 | ,45,40,"Text in Columns",0,0,0
48 | ,46,40,"Text and Icon",0,0,0
49 | ,47,40,"Text with Teaser",0,0,0
50 | ,48,40,"Bullet List",0,0,0
51 | ,49,40,"Headers",0,0,0
52 | ,50,40,"Rich Text",0,0,0
53 | ,51,6,"Overview",0,0,0
54 | ,52,1,"Customizings",0,0,0
55 | ,53,1,"Features",0,0,0
56 | ,54,1,"Home",0,0,0
57 |
--------------------------------------------------------------------------------
/Tests/Functional/Fixtures/pages.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 1
6 | 0
7 | Congratulations
8 | 0
9 | 0
10 | 0
11 |
12 |
13 | 2
14 | 1
15 | Frontend User
16 | 0
17 | 0
18 | 0
19 |
20 |
21 | 3
22 | 1
23 | File Collections
24 | 0
25 | 0
26 | 0
27 |
28 |
29 | 4
30 | 1
31 | Shared Content
32 | 0
33 | 0
34 | 0
35 |
36 |
37 | 5
38 | 1
39 | 404
40 | 0
41 | 0
42 | 1
43 |
44 |
45 | 6
46 | 1
47 | Content Examples
48 | 0
49 | 0
50 | 0
51 |
52 |
53 | 7
54 | 6
55 | And more...
56 | 0
57 | 0
58 | 0
59 |
60 |
61 | 8
62 | 7
63 | Frames
64 | 0
65 | 0
66 | 0
67 |
68 |
69 | 9
70 | 7
71 | Images with links
72 | 0
73 | 0
74 | 0
75 |
76 |
77 | 10
78 | 7
79 | Any language, any character
80 | 0
81 | 0
82 | 0
83 |
84 |
85 | 11
86 | 6
87 | Special elements
88 | 0
89 | 0
90 | 0
91 |
92 |
93 | 12
94 | 11
95 | Divider
96 | 0
97 | 0
98 | 0
99 |
100 |
101 | 13
102 | 11
103 | HTML
104 | 0
105 | 0
106 | 0
107 |
108 |
109 | 14
110 | 11
111 | Insert records
112 | 0
113 | 0
114 | 0
115 |
116 |
117 | 15
118 | 6
119 | Menu's
120 | 0
121 | 0
122 | 0
123 |
124 |
125 | 16
126 | 15
127 | Thumbnails
128 | 0
129 | 0
130 | 0
131 |
132 |
133 | 17
134 | 15
135 | Sitemap
136 | 0
137 | 0
138 | 0
139 |
140 |
141 | 18
142 | 15
143 | Sections
144 | 0
145 | 0
146 | 0
147 |
148 |
149 | 19
150 | 15
151 | Related Pages
152 | 0
153 | 0
154 | 0
155 |
156 |
157 | 20
158 | 15
159 | Recently Updated
160 | 0
161 | 0
162 | 0
163 |
164 |
165 | 21
166 | 15
167 | Categorized
168 | 0
169 | 0
170 | 0
171 |
172 |
173 | 22
174 | 15
175 | Abstract
176 | 0
177 | 0
178 | 0
179 |
180 |
181 | 23
182 | 15
183 | Pages
184 | 0
185 | 0
186 | 0
187 |
188 |
189 | 24
190 | 6
191 | Form elements
192 | 0
193 | 0
194 | 0
195 |
196 |
197 | 25
198 | 24
199 | Search
200 | 0
201 | 0
202 | 0
203 |
204 |
205 | 26
206 | 24
207 | Login
208 | 0
209 | 0
210 | 0
211 |
212 |
213 | 27
214 | 24
215 | Forms
216 | 0
217 | 0
218 | 0
219 |
220 |
221 | 28
222 | 6
223 | Intreractive
224 | 0
225 | 0
226 | 0
227 |
228 |
229 | 29
230 | 28
231 | Tab
232 | 0
233 | 0
234 | 0
235 |
236 |
237 | 30
238 | 28
239 | Carousel
240 | 0
241 | 0
242 | 0
243 |
244 |
245 | 31
246 | 28
247 | Accordion
248 | 0
249 | 0
250 | 0
251 |
252 |
253 | 32
254 | 6
255 | Media
256 | 0
257 | 0
258 | 0
259 |
260 |
261 | 33
262 | 32
263 | External Media
264 | 0
265 | 0
266 | 0
267 |
268 |
269 | 34
270 | 32
271 | Media
272 | 0
273 | 0
274 | 0
275 |
276 |
277 | 35
278 | 32
279 | Images
280 | 0
281 | 0
282 | 0
283 |
284 |
285 | 36
286 | 32
287 | File downloads
288 | 0
289 | 0
290 | 0
291 |
292 |
293 | 37
294 | 32
295 | Text and Media
296 | 0
297 | 0
298 | 0
299 |
300 |
301 | 38
302 | 32
303 | Text and Images
304 | 0
305 | 0
306 | 0
307 |
308 |
309 | 39
310 | 32
311 | Audio
312 | 0
313 | 0
314 | 0
315 |
316 |
317 | 40
318 | 6
319 | Text
320 | 0
321 | 0
322 | 0
323 |
324 |
325 | 41
326 | 40
327 | Quote
328 | 0
329 | 0
330 | 0
331 |
332 |
333 | 42
334 | 40
335 | Table
336 | 0
337 | 0
338 | 0
339 |
340 |
341 | 43
342 | 40
343 | Panel
344 | 0
345 | 0
346 | 0
347 |
348 |
349 | 44
350 | 40
351 | List Group
352 | 0
353 | 0
354 | 0
355 |
356 |
357 | 45
358 | 40
359 | Text in Columns
360 | 0
361 | 0
362 | 0
363 |
364 |
365 | 46
366 | 40
367 | Text and Icon
368 | 0
369 | 0
370 | 0
371 |
372 |
373 | 47
374 | 40
375 | Text with Teaser
376 | 0
377 | 0
378 | 0
379 |
380 |
381 | 48
382 | 40
383 | Bullet List
384 | 0
385 | 0
386 | 0
387 |
388 |
389 | 49
390 | 40
391 | Headers
392 | 0
393 | 0
394 | 0
395 |
396 |
397 | 50
398 | 40
399 | Rich Text
400 | 0
401 | 0
402 | 0
403 |
404 |
405 | 51
406 | 6
407 | Overview
408 | 0
409 | 0
410 | 0
411 |
412 |
413 | 52
414 | 1
415 | Customizings
416 | 0
417 | 0
418 | 0
419 |
420 |
421 | 53
422 | 1
423 | Features
424 | 0
425 | 0
426 | 0
427 |
428 |
429 | 54
430 | 1
431 | Home
432 | 0
433 | 0
434 | 0
435 |
436 |
437 |
--------------------------------------------------------------------------------
/Tests/Functional/Fixtures/tt_content.csv:
--------------------------------------------------------------------------------
1 | "tt_content"
2 | ,"uid","pid","deleted","hidden","CType","list_type","header"
3 | ,1,53,0,0,"text","","Upgrading TYPO3? No problem."
4 | ,2,53,0,0,"textpic","","Ease of Use"
5 | ,3,53,0,0,"textpic","","Publishing Content"
6 | ,4,53,0,0,"textpic","","Runs everywhere"
7 | ,5,53,0,0,"textpic","","Multi-Language and Multiple Domains"
8 | ,6,53,0,0,"textpic","","Your data - our strength"
9 | ,7,53,0,0,"textpic","","Granular Frontend and Backend Access Rights"
10 | ,8,53,0,0,"textpic","","No Design Constraints For Your Web Project"
11 | ,9,53,0,0,"textpic","","Frontend Editing"
12 | ,10,53,0,0,"text","","And More..."
13 | ,11,53,0,0,"text","","Enterprise Features"
14 | ,133,25,0,0,"list","indexedsearch_pi2","Search"
--------------------------------------------------------------------------------
/Tests/Functional/FunctionalTestCase.php:
--------------------------------------------------------------------------------
1 | importCSVDataSet(__DIR__ . '/Fixtures/be_users.csv');
32 | $this->setUpBackendUser(1);
33 | $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageServiceFactory::class)->createFromUserPreferences($GLOBALS['BE_USER']);
34 |
35 | $uri = new Uri('https://localhost/typo3/');
36 | $request = new ServerRequest($uri);
37 | $request = $request->withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE);
38 | $GLOBALS['TYPO3_REQUEST'] = $request;
39 | }
40 |
41 | public static function getReportObject()
42 | {
43 | return GeneralUtility::makeInstance(ReportController::class);
44 | }
45 |
46 |
47 | }
--------------------------------------------------------------------------------
/Tests/Functional/Reports/CommandControllersTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/EidTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/ExtensionsTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/HooksTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/LogErrorsTest.php:
--------------------------------------------------------------------------------
1 | display());
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/MiddlewaresTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/PluginsTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/StatusTest.php:
--------------------------------------------------------------------------------
1 | display());
20 | }
21 | }
22 |
23 | public static function isNotSqlite()
24 | {
25 | return $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['driver'] !== 'pdo_sqlite';
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/WebsiteConfTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/Reports/XclassTest.php:
--------------------------------------------------------------------------------
1 | display());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Tests/Functional/UtilityTest.php:
--------------------------------------------------------------------------------
1 | [
32 | 'caching' => [
33 | 'cacheConfigurations' => [
34 | 'assets' => [
35 | 'frontend' => VariableFrontend::class,
36 | 'backend' => SimpleFileBackend::class,
37 | 'options' => [
38 | 'defaultLifetime' => 0,
39 | ],
40 | 'groups' => ['system']
41 | ],
42 | 'l10n' => [
43 | 'frontend' => VariableFrontend::class,
44 | 'backend' => SimpleFileBackend::class,
45 | 'options' => [
46 | 'defaultLifetime' => 0,
47 | ],
48 | 'groups' => ['system']
49 | ],
50 | ]
51 | ]
52 | ]
53 | ];
54 |
55 | protected function setUp(): void
56 | {
57 | parent::setUp();
58 | $this->importCSVDataSet(__DIR__ . '/Fixtures/be_users.csv');
59 | $this->setUpBackendUser(1);
60 | $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageServiceFactory::class)->createFromUserPreferences($GLOBALS['BE_USER']);
61 | $this->importCSVDataSet(__DIR__ . '/Fixtures/pages.csv');
62 | $this->importCSVDataSet(__DIR__ . '/Fixtures/tt_content.csv');
63 | $uri = new Uri('https://localhost/typo3/');
64 | $request = new ServerRequest($uri);
65 | $request = $request->withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE);
66 | $GLOBALS['TYPO3_REQUEST'] = $request;
67 | }
68 |
69 | public function testGetInstExtList()
70 | {
71 | $extLits = Utility::getInstExtList(Environment::getPublicPath() . '/typo3/sysext/');
72 | self::assertNotEmpty($extLits);
73 | self::assertEquals('core', $extLits['dev']['core']['extkey']);
74 | }
75 |
76 | public function testGetExtensionType()
77 | {
78 | self::assertNotEmpty(Utility::getExtensionType('core'));
79 | }
80 |
81 | public function testGetExtPath()
82 | {
83 | self::assertNotEmpty(Utility::getExtPath('core'));
84 | }
85 |
86 | public function testGetExtensionVersion()
87 | {
88 | self::assertEquals(GeneralUtility::makeInstance(Typo3Version::class)->getVersion(), Utility::getExtensionVersion('core'));
89 | }
90 |
91 | public function testGetExtIcon()
92 | {
93 | self::assertNotEmpty(Utility::getExtIcon('core'));
94 | }
95 |
96 | public function testGetJsonVersionInfos()
97 | {
98 | self::assertNotEmpty(Utility::getJsonVersionInfos());
99 | }
100 |
101 | public function testGetCurrentVersionInfos()
102 | {
103 | self::assertNotEmpty(Utility::getCurrentVersionInfos(Utility::getJsonVersionInfos(), GeneralUtility::makeInstance(Typo3Version::class)->getVersion()));
104 | }
105 |
106 | public function testGetCurrentBranchInfos()
107 | {
108 | self::assertNotEmpty(Utility::getCurrentBranchInfos(Utility::getJsonVersionInfos(), GeneralUtility::makeInstance(Typo3Version::class)->getVersion()));
109 | }
110 |
111 | public function testGetLatestStableInfos()
112 | {
113 | self::assertNotEmpty(Utility::getLatestStableInfos(Utility::getJsonVersionInfos()));
114 | }
115 |
116 | public function testGetLatestLtsInfos()
117 | {
118 | self::assertNotEmpty(Utility::getLatestLtsInfos(Utility::getJsonVersionInfos()));
119 | }
120 |
121 | public function testDownloadT3x()
122 | {
123 | self::assertNotEmpty(Utility::downloadT3x('additional_reports', '3.3.2'));
124 | }
125 |
126 | public function testBaseUrl()
127 | {
128 | self::assertNotEmpty(Utility::getBaseUrl());
129 | }
130 |
131 | public function testGetTreeList()
132 | {
133 | self::assertEquals($this->pagesListProvider(), Utility::getTreeList(1, 99));
134 | }
135 |
136 | public function testGetCountPagesUids()
137 | {
138 | if (self::isNotSqlite()) {
139 | self::assertEquals(0, Utility::getCountPagesUids($this->pagesListProvider(), 'hidden=1'));
140 | self::assertEquals(1, Utility::getCountPagesUids($this->pagesListProvider(), 'no_search=1'));
141 | }
142 | }
143 |
144 | public function testGetIconRefresh()
145 | {
146 | self::assertNotEmpty(Utility::getIconRefresh());
147 | }
148 |
149 | public function testGetIconDomain()
150 | {
151 | self::assertNotEmpty(Utility::getIconDomain());
152 | }
153 |
154 | public function testGetIconWebPage()
155 | {
156 | self::assertNotEmpty(Utility::getIconWebPage());
157 | }
158 |
159 | public function testGetIconTemplate()
160 | {
161 | self::assertNotEmpty(Utility::getIconTemplate());
162 | }
163 |
164 | public function testGetIconWebList()
165 | {
166 | self::assertNotEmpty(Utility::getIconWebList());
167 | }
168 |
169 | public function testGetIconPage()
170 | {
171 | self::assertNotEmpty(Utility::getIconPage());
172 | }
173 |
174 | public function testGetIconContent()
175 | {
176 | self::assertNotEmpty(Utility::getIconContent());
177 | }
178 |
179 | public function testGetRootLine()
180 | {
181 | self::assertNotEmpty(Utility::getRootLine(1));
182 | }
183 |
184 | public function testGetDomain()
185 | {
186 | $this->writeSiteConfiguration(
187 | 'acme-com',
188 | [
189 | 'rootPageId' => 1,
190 | 'base' => 'https://acme.com/',
191 | ]
192 | );
193 | self::assertEquals('acme.com', Utility::getDomain(1));
194 | }
195 |
196 | public function testGoToModuleList()
197 | {
198 | self::assertNotEmpty(Utility::goToModuleList(1));
199 | }
200 |
201 | public function testGoToModulePage()
202 | {
203 | self::assertNotEmpty(Utility::goToModulePage(1));
204 | }
205 |
206 | public function testGetMySqlCacheInformations()
207 | {
208 | if (self::isNotSqlite()) {
209 | self::assertNotEmpty(Utility::getMySqlCacheInformations());
210 | }
211 | }
212 |
213 | public function testGetMySqlCharacterSet()
214 | {
215 | if (self::isNotSqlite()) {
216 | self::assertNotEmpty(Utility::getMySqlCharacterSet());
217 | }
218 | }
219 |
220 | public function testGetAllDifferentPlugins()
221 | {
222 | self::assertNotEmpty(Utility::getAllDifferentPlugins(''));
223 | }
224 |
225 | public function testGetAllDifferentPluginsSelect()
226 | {
227 | self::assertNotEmpty(Utility::getAllDifferentPluginsSelect(true));
228 | }
229 |
230 | public function testGetAllDifferentCtypes()
231 | {
232 | self::assertNotEmpty(Utility::getAllDifferentCtypes(''));
233 | }
234 |
235 | public function testGetAllDifferentCtypesSelect()
236 | {
237 | self::assertNotEmpty(Utility::getAllDifferentCtypesSelect(true));
238 | }
239 |
240 | public function testGetAllPlugins()
241 | {
242 | self::assertNotEmpty(Utility::getAllPlugins(''));
243 | }
244 |
245 | public function testGetAllCtypes()
246 | {
247 | self::assertNotEmpty(Utility::getAllCtypes(''));
248 | }
249 |
250 | public function testGetLl()
251 | {
252 | self::assertNotEmpty(Utility::getLl('domain'));
253 | }
254 |
255 | public function testGetLanguageService()
256 | {
257 | self::assertNotEmpty(Utility::getLanguageService());
258 | }
259 |
260 | public function testSubModules()
261 | {
262 | self::assertNotEmpty(Utility::getSubModules());
263 | }
264 |
265 | public function testExec_SELECT_queryArray()
266 | {
267 | self::assertNotEmpty(Utility::exec_SELECT_queryArray(['SELECT' => '*', 'FROM' => 'pages', 'WHERE' => '']));
268 | }
269 |
270 | public function testExec_SELECTgetRows()
271 | {
272 | self::assertNotEmpty(Utility::exec_SELECTgetRows(' * ', 'pages', ''));
273 | }
274 |
275 | public function pagesListProvider()
276 | {
277 | return '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54';
278 | }
279 |
280 | public static function isNotSqlite()
281 | {
282 | return $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['driver'] !== 'pdo_sqlite';
283 | }
284 |
285 | /**
286 | * @param string $identifier
287 | * @param array $site
288 | * @param array $languages
289 | * @param array $errorHandling
290 | */
291 | protected function writeSiteConfiguration(
292 | string $identifier,
293 | array $site = [],
294 | array $languages = [],
295 | array $errorHandling = []
296 | )
297 | {
298 | $configuration = $site;
299 | if (!empty($languages)) {
300 | $configuration['languages'] = $languages;
301 | }
302 | if (!empty($errorHandling)) {
303 | $configuration['errorHandling'] = $errorHandling;
304 | }
305 |
306 | if (GeneralUtility::makeInstance(Typo3Version::class)->getBranch() === '12.4') {
307 | $siteConfiguration = new SiteConfiguration(
308 | $this->instancePath . '/typo3conf/sites/',
309 | $this->getContainer()->get(EventDispatcher::class)
310 | );
311 | try {
312 | // ensure no previous site configuration influences the test
313 | GeneralUtility::rmdir($this->instancePath . '/typo3conf/sites/' . $identifier, true);
314 | $siteConfiguration->write($identifier, $configuration);
315 | } catch (\Exception $exception) {
316 | self::markTestSkipped($exception->getMessage());
317 | }
318 | } else {
319 | try {
320 | $siteConfiguration = GeneralUtility::makeInstance(SiteConfiguration::class);
321 | GeneralUtility::rmdir($this->instancePath . '/typo3conf/sites/' . $identifier, true);
322 | $siteWriter = GeneralUtility::makeInstance(
323 | \TYPO3\CMS\Core\Configuration\SiteWriter::class,
324 | $this->instancePath . '/typo3conf/sites/',
325 | $this->getContainer()->get(EventDispatcher::class),
326 | GeneralUtility::makeInstance(YamlFileLoader::class)
327 | );
328 | $siteWriter->write($identifier, $configuration);
329 | $siteConfiguration->load($identifier);
330 | } catch (\Exception $exception) {
331 | self::markTestSkipped($exception->getMessage());
332 | }
333 | }
334 | }
335 | }
336 |
--------------------------------------------------------------------------------
/Tests/Unit/UtilityTest.php:
--------------------------------------------------------------------------------
1 | 'additional_reports']));
29 | }
30 |
31 | public function testViewArray()
32 | {
33 | self::assertNotEmpty(Utility::viewArray(['foo' => 'bar']));
34 | }
35 |
36 | public function testGenerateLink()
37 | {
38 | self::assertNotEmpty(Utility::generateLink());
39 | }
40 |
41 | public function testWriteInformation()
42 | {
43 | self::assertNotEmpty(Utility::writeInformation('foo', 'bar'));
44 | }
45 |
46 | public function testGetPluginsDisplayMode()
47 | {
48 | self::assertEmpty(Utility::getPluginsDisplayMode());
49 | }
50 |
51 | public function testIsHook()
52 | {
53 | $hook = EmailLoginNotification::class . '->emailAtLogin';
54 | self::assertTrue(Utility::isHook($hook));
55 | }
56 |
57 | public function testGetHook()
58 | {
59 | $hook = EmailLoginNotification::class . '->emailAtLogin';
60 | self::assertNotEmpty(Utility::getHook($hook));
61 | }
62 |
63 | public function testGetPathSite()
64 | {
65 | self::assertNotEmpty(Utility::getPathSite());
66 | }
67 |
68 | public function testGetPathTypo3Conf()
69 | {
70 | self::assertNotEmpty(Utility::getPathTypo3Conf());
71 | }
72 |
73 | public function testIsComposerMode()
74 | {
75 | self::assertTrue(Utility::isComposerMode());
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "apen/additional_reports",
3 | "type": "typo3-cms-extension",
4 | "description": "Useful information in the reports module : xclass, ajax, cliKeys, eID, general status of the system (encoding, DB, php vars...), hooks, compare local and TER extension (diff), used content type, used plugins, ExtDirect... It can really help you during migration or new existing project (to have a global reports of the system).",
5 | "keywords": [
6 | "TYPO3"
7 | ],
8 | "authors": [
9 | {
10 | "name": "Yohann Cerdan",
11 | "email": "yohann@site-ngo.fr",
12 | "role": "Developer",
13 | "homepage": "https://www.site-ngo.fr"
14 | }
15 | ],
16 | "license": "GPL-2.0+",
17 | "require": {
18 | "php": ">= 8.1 <=8.4.99",
19 | "typo3/cms-core": "^12||^13",
20 | "typo3/cms-reports": "^12||^13"
21 | },
22 | "require-dev": {
23 | "friendsofphp/php-cs-fixer": "^3",
24 | "saschaegerer/phpstan-typo3": "^1",
25 | "typo3/testing-framework": "^8",
26 | "nikic/php-parser": "^4||^5",
27 | "helmich/typo3-typoscript-lint": "^3",
28 | "symplify/easy-coding-standard": "^11"
29 | },
30 | "config": {
31 | "vendor-dir": ".Build/vendor",
32 | "bin-dir": ".Build/bin",
33 | "allow-plugins": {
34 | "typo3/class-alias-loader": true,
35 | "typo3/cms-composer-installers": true,
36 | "sbuerk/typo3-cmscomposerinstallers-testingframework-bridge": true
37 | }
38 | },
39 | "autoload": {
40 | "psr-4": {
41 | "Sng\\AdditionalReports\\": "Classes",
42 | "Sng\\AdditionalReports\\Tests\\": "Tests"
43 | }
44 | },
45 | "scripts": {
46 | "php:ecs": ".Build/bin/ecs check . --config ./Build/ecs.php --fix --ansi",
47 | "php:ecsdry": ".Build/bin/ecs check . --config ./Build/ecs.php --ansi",
48 | "php:fix": ".Build/bin/php-cs-fixer --config=./Build/.php-cs-fixer.php fix",
49 | "php:fixdry": ".Build/bin/php-cs-fixer -vvv --diff --dry-run --config=./Build/.php-cs-fixer.php fix",
50 | "php:phpstan": ".Build/bin/phpstan analyse -c ./Build/phpstan.neon --ansi",
51 | "php:rector": ".Build/bin/rector process . -c ./Build/rector.php --ansi",
52 | "php:rectordry": ".Build/bin/rector process . -c ./Build/rector.php --dry-run --ansi",
53 | "post-autoload-dump": [
54 | "TYPO3\\TestingFramework\\Composer\\ExtensionTestEnvironment::prepare"
55 | ]
56 | },
57 | "extra": {
58 | "typo3/cms": {
59 | "extension-key": "additional_reports",
60 | "cms-package-dir": "{$vendor-dir}/typo3/cms",
61 | "app-dir": ".Build",
62 | "web-dir": ".Build/public"
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/ext_conf_template.txt:
--------------------------------------------------------------------------------
1 | # cat=basic; type=text; label= Pagebrowser:Number of items per page
2 | itemsPerPage = 30
--------------------------------------------------------------------------------
/ext_emconf.php:
--------------------------------------------------------------------------------
1 | 'Useful information in reports module',
5 | 'description' => 'Useful information in the reports module: xclass, ajax, cliKeys, eID, general status of the system (encoding, DB, php vars...), hooks, compare local and TER extension (diff), used content type, used plugins, ExtDirect... It can really help you during migration or new existing project (to have global reports of the system).',
6 | 'version' => '3.4.8',
7 | 'state' => 'stable',
8 | 'uploadfolder' => '',
9 | 'createDirs' => '',
10 | 'clearcacheonload' => true,
11 | 'author' => 'CERDAN Yohann',
12 | 'author_email' => 'cerdanyohann@yahoo.fr',
13 | 'author_company' => '',
14 | 'constraints' => [
15 | 'depends' => [
16 | 'typo3' => '12.4.0-13.4.99',
17 | ],
18 | 'conflicts' => [],
19 | 'suggests' => [],
20 | ],
21 | ];
22 |
--------------------------------------------------------------------------------
/ext_tables.php:
--------------------------------------------------------------------------------
1 | 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:' . $report[1] . '_title',
11 | 'description' => 'LLL:EXT:additional_reports/Resources/Private/Language/locallang.xlf:' . $report[1] . '_description',
12 | 'icon' => 'EXT:additional_reports/Resources/Public/Icons/tx_additionalreports_' . $report[1] . '.png',
13 | 'report' => 'Sng\AdditionalReports\Reports\\' . $report[0]
14 | ];
15 | }
16 |
--------------------------------------------------------------------------------