├── .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 .= '';
86 |         $out .= '';
87 |         $sourcesDiff = str_replace('', '', $sourcesDiff);
88 |         $sourcesDiff = str_replace('', '', $sourcesDiff);
89 |         $out .= $sourcesDiff;
90 |         $out .= '
Local file
TER file
'; 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 | * 27 | * (Content of {string} without any conversion/escaping) 28 | * 29 | * 30 | * 31 | * 32 | * 33 | * 34 | * (Content of {string} without any conversion/escaping) 35 | * 36 | * 37 | * 38 | * {string -> f:format.raw()} 39 | * 40 | * 41 | * (Content of {string} without any conversion/escaping) 42 | * 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 | [![Latest Stable Version](https://img.shields.io/packagist/v/apen/additional_reports?label=version)](https://packagist.org/packages/apen/additional_reports) 4 | [![Total Downloads](https://img.shields.io/packagist/dt/apen/additional_reports)](https://packagist.org/packages/apen/additional_reports) 5 | [![TYPO3](https://img.shields.io/badge/TYPO3-12.4-orange.svg?style=flat-square)](https://get.typo3.org/version/12) 6 | [![TYPO3](https://img.shields.io/badge/TYPO3-13.4-orange.svg?style=flat-square)](https://get.typo3.org/version/13) 7 | ![CI](https://github.com/Apen/additional_reports/actions/workflows/ci.yaml/badge.svg) 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 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/eid.png) 44 | 45 | ### Commands 46 | 47 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/commands.png) 48 | 49 | ### Plugins and CTypes 50 | 51 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/plugins.png) 52 | 53 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/ctypes.png) 54 | 55 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/summary.png) 56 | 57 | ### XCLASS 58 | 59 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/xclass.png) 60 | 61 | ### Hooks 62 | 63 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/hooks.png) 64 | 65 | ### Global status 66 | 67 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/status1.png) 68 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/status2.png) 69 | 70 | ### Grouped logs 71 | 72 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/logs.png) 73 | 74 | ### List of websites and domains 75 | 76 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/websites.png) 77 | 78 | ### Extensions 79 | 80 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/extensions.png) 81 | 82 | Text diff with TER and last version 83 | 84 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/extensions-diff.png) 85 | 86 | ### EventDispatcher (PSR-14) 87 | 88 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/eventdispatcher.png) 89 | 90 | ### Middlewares (PSR-15) 91 | 92 | ![](https://raw.githubusercontent.com/Apen/additional_reports/master/Resources/Public/Images/middlewares.png) 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 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
6 | 7 |
CommandClass
{command}{class}
23 |
24 | -------------------------------------------------------------------------------- /Resources/Private/Templates/eid-fluid.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 14 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
6 | 7 |
  12 | 13 | 15 | 16 | 18 | 19 |
{eid.extension}{eid.name}{eid.path}
33 |
34 | -------------------------------------------------------------------------------- /Resources/Private/Templates/events-fluid.html: -------------------------------------------------------------------------------- 1 | {namespace ar=Sng\AdditionalReports\ViewHelpers} 2 | 3 | 4 |
5 | 6 | 7 | 8 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 |
9 | 10 | 12 | 13 |
{event.className} 21 | {event.list} 22 |
27 |
28 |
-------------------------------------------------------------------------------- /Resources/Private/Templates/extensions-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 | 30 | 31 | 32 | 35 | 38 | 41 | 44 | 47 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 61 | 64 | 68 | 72 | 73 | 74 | 75 |
27 | 28 | 29 |
33 | 34 | 36 | 37 | 39 | 40 | 42 | 43 | 45 | 46 | 48 | 49 |
{extension.extension}{extension.version} 59 | {extension.versionlast} 60 | 62 | 63 | 65 | {extension.confintegrity} 66 | 67 | 69 | 70 | 71 |
76 |
77 |
78 | 79 | 80 |
81 | 82 | 83 | 84 | 88 | 89 | 90 | 93 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 109 | 110 | 111 | 112 |
85 | 86 | 87 |
91 | 92 | 94 | 95 | 97 | 98 |
{extension.extension}{extension.version} 107 | 108 |
113 |
114 |
115 | 116 | 117 |
118 | 119 | 120 | 121 | 125 | 126 | 127 | 130 | 133 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 146 | 147 | 148 | 149 |
122 | 123 | 124 |
128 | 129 | 131 | 132 | 134 | 135 |
{extension.extension}{extension.version} 144 | 145 |
150 |
151 |
152 | 153 | 154 | 155 | 158 | 170 | 171 | 172 | 173 | 174 | 175 | 178 | 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 | 11 | 12 | 13 | 16 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 35 |
9 | 10 |
14 | 15 | 17 | 18 | 20 | 21 |
{hook.corefile}{hook.name} 30 | {hook.file} 31 |
36 |
37 |
38 | 39 | 40 |
41 | 42 | 43 | 44 | 47 | 48 | 49 | 52 | 55 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 68 | 69 | 70 | 71 |
45 | 46 |
50 | 51 | 53 | 54 | 56 | 57 |
{hook.corefile}{hook.name} 66 | {hook.file} 67 |
72 |
73 |
-------------------------------------------------------------------------------- /Resources/Private/Templates/logerrors-fluid.html: -------------------------------------------------------------------------------- 1 | {namespace ar=Sng\AdditionalReports\ViewHelpers} 2 | 3 |
4 | 5 | 6 | 7 | 10 | 11 | 12 | 18 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 40 | 41 | 42 | 43 |
8 | 9 |
13 | 14 | 15 | 16 | {ordercounter} 17 | 19 | 20 | 21 | 22 | {ordertstamp} 23 | 25 | 26 |
{item.nb} 34 | @{item.tstamp} 35 | 37 | {item.details}
38 | DELETE FROM sys_log WHERE error>0 AND details = "{item.details}" 39 |
44 |
45 | 46 | -------------------------------------------------------------------------------- /Resources/Private/Templates/middlewares-fluid.html: -------------------------------------------------------------------------------- 1 | {namespace ar=Sng\AdditionalReports\ViewHelpers} 2 | 3 | 4 |
5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
9 | frontend 10 |
# 15 | 16 | Class
{iterator.cycle}{name}{class}
30 |
31 |
32 | 33 | 34 |
35 | 36 | 37 | 38 | 41 | 42 | 43 | 44 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
39 | backend 40 |
# 45 | 46 | Class
{iterator.cycle}{name}{class}
60 |
61 |
-------------------------------------------------------------------------------- /Resources/Private/Templates/plugins-fluid.html: -------------------------------------------------------------------------------- 1 | {namespace ar=Sng\AdditionalReports\ViewHelpers} 2 | 3 | 4 | 5 | {caution} 6 | 7 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 44 |
10 | 11 | 14 | 16 | 17 | 20 |
24 | 25 | 28 | 30 | 31 | 34 |
38 | 39 | 42 |
45 |
46 | 47 | 48 | 49 | 50 |
51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 63 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
55 | 56 |
  61 | 62 | 64 | 65 | %
{item.content}{item.references}{item.pourc}%
80 |
81 |
82 | 83 | 84 | 85 | {filtersCat} 86 |
87 | 88 | 89 | 90 | 93 | 94 | 95 | 96 | 99 | 102 | 105 | 108 | 111 | 112 | 113 | 114 | 115 | 118 | 119 | 120 | 121 | 122 | 123 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 137 | 140 | 143 | 144 | 147 | 150 | 151 | 152 | 153 | 158 | 159 | 160 | 161 |
91 | 92 |
  97 | 98 | 100 | 101 | 103 | 104 | 106 | 107 | 109 | 110 | DB modePage TV 116 | 117 | Page 124 | 125 |
{item.ctype} 135 | {item.domain} 136 | 138 | {item.pid} 139 | 141 | {item.uid} 142 | {item.pagetitle} 145 | {item.db} 146 | 148 | {item.page} 149 | {item.usedtv} 154 | 155 | 156 | 157 |
162 |
163 | 164 | 165 |
166 | 167 | 168 | 169 | 170 | {filtersCat} 171 |
172 | 173 | 174 | 175 | 178 | 179 | 180 | 181 | 184 | 187 | 190 | 193 | 196 | 199 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 209 | 210 | 211 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 226 | 229 | 232 | 233 | 236 | 239 | 240 | 241 | 242 | 247 | 248 | 249 | 250 |
176 | 177 |
  182 | 183 | 185 | 186 | 188 | 189 | 191 | 192 | 194 | 195 | 197 | 198 | DB modePage TV 204 | 205 | Page 212 | 213 |
{item.extension}{item.plugin} 224 | {item.domain} 225 | 227 | {item.pid} 228 | 230 | {item.uid} 231 | {item.pagetitle} 234 | {item.db} 235 | 237 | {item.page} 238 | {item.usedtv} 243 | 244 | 245 | 246 |
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 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 |
{datas_mysql.typo3db} - 78 | 79 | tables 80 |
NameEngineCollationRowsSize (in MB)
{table.name}{table.engine}{table.collation}{table.rows}{table.size}
Total{datas_mysql.tablessize} MB
106 |
107 |
108 | 109 | 110 | 111 | 112 | 113 | 114 |
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 | 8 | 9 | 10 | 13 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 35 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
6 | 7 |
11 | 12 | 14 | 15 | 17 | 18 | sys_templatepagespages.hiddenpages.no_search
{item.pid} 30 | {item.pagetitle} 31 | 33 | {item.domains} 34 | 36 | {item.template} 37 | {item.pages}{item.pageshidden}{item.pagesnosearch}
45 |
46 | -------------------------------------------------------------------------------- /Resources/Private/Templates/xclass-fluid.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
XCLASS with $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']
11 | 12 | 14 | 15 |
{path.className}{name}
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 | --------------------------------------------------------------------------------