* @copyright Copyright (c) 2020 Samuel Marshall / JCH Optimize * @license GNU/GPLv3, or later. See LICENSE file * * If LICENSE file missing, see . */ namespace JchOptimize\WordPress\Controller; use _JchOptimizeVendor\V91\Joomla\Input\Input; use FilesystemIterator; use JchOptimize\Core\Admin\AdminHelper; use JchOptimize\Core\Admin\Icons; use JchOptimize\Core\Model\CacheMaintainer; use JchOptimize\Core\Mvc\Controller; use JchOptimize\Core\PageCache\CaptureCache; use JchOptimize\Core\Platform\PathsInterface; use JchOptimize\Core\Registry; use JchOptimize\Core\Settings; use JchOptimize\WordPress\Contracts\WillEnqueueAssets; use JchOptimize\WordPress\Model\NotificationIcons; use JchOptimize\WordPress\Model\PageCache as PageCacheModel; use JchOptimize\WordPress\View\MainHtml; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use UnexpectedValueException; use function admin_url; use function array_filter; use function count; use function get_option; use function in_array; use function is_dir; use function pathinfo; use function strtolower; use const PATHINFO_EXTENSION; class Main extends Controller implements WillEnqueueAssets { use AuthorizesAdminRequestsTrait; public function __construct( private MainHtml $view, private Icons $icons, private NotificationIcons $notificationIcons, ?Input $input ) { parent::__construct($input); } public function execute(): bool { $this->authorizeManageOptions(); if (JCH_PRO) { $this->getContainer()->get(CaptureCache::class)->updateHtaccess(); } [$cacheSize, $cacheFiles] = $this->getContainer()->get(CacheMaintainer::class)->getCacheSize(); $lastCleared = (int)get_option('jch_optimize_cache_last_cleared', 0); $pageCacheItems = $this->getContainer()->get(PageCacheModel::class)->getItems(); $adminHelper = $this->getContainer()->get(AdminHelper::class); $paths = $this->getContainer()->get(PathsInterface::class); $params = $this->getContainer()->get(Registry::class); $optimizedImages = count(array_filter($adminHelper->getOptimizedFiles())); $webpImages = $this->countFilesByExtension($paths->nextGenImagesPath(), ['webp']); $avifImages = $this->countFilesByExtension($paths->nextGenImagesPath(), ['avif']); $this->view->setData([ 'tab' => 'main', 'icons' => $this->icons, 'notifications' => $this->notificationIcons->getNotificationIcons(), 'optimizationSnapshot' => [ 'cacheSize' => $cacheSize, 'cacheFiles' => $cacheFiles, 'lastCleared' => $lastCleared, 'pageCacheCount' => count($pageCacheItems), 'optimizedImages' => $optimizedImages, 'webpImages' => $webpImages, 'avifImages' => $avifImages, 'webpAvifEnabled' => $params->isEnabled(Settings::LOAD_AVIF_WEBP_IMAGES), 'optimizeImagesUrl' => admin_url('options-general.php?page=jch_optimize&tab=optimizeimages'), 'pageCacheUrl' => admin_url('options-general.php?page=jch_optimize&tab=pagecache'), 'configurationsUrl' => admin_url('options-general.php?page=jch_optimize&tab=configurations'), ], ]); echo $this->view->render(); return true; } public function enqueueAssets(): void { $this->view->loadResources(); } /** * @param string[] $extensions */ private function countFilesByExtension(string $path, array $extensions): int { if (!is_dir($path)) { return 0; } try { $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS) ); } catch (UnexpectedValueException) { return 0; } $count = 0; foreach ($files as $file) { if ( $file->isFile() && in_array(strtolower(pathinfo($file->getFilename(), PATHINFO_EXTENSION)), $extensions, true) ) { $count++; } } return $count; } }