186 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | namespace Grav\Plugin; | ||
|  | 
 | ||
|  | use Composer\Autoload\ClassLoader; | ||
|  | use Grav\Common\Plugin; | ||
|  | use Grav\Common\Uri; | ||
|  | use Grav\Plugin\Problems\Base\ProblemChecker; | ||
|  | use RocketTheme\Toolbox\Event\Event; | ||
|  | use Twig\Environment; | ||
|  | use Twig\Extension\DebugExtension; | ||
|  | use Twig\Loader\FilesystemLoader; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class ProblemsPlugin | ||
|  |  * @package Grav\Plugin | ||
|  |  */ | ||
|  | class ProblemsPlugin extends Plugin | ||
|  | { | ||
|  |     /** @var ProblemChecker|null */ | ||
|  |     protected $checker; | ||
|  |     /** @var array */ | ||
|  |     protected $problems = []; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public static function getSubscribedEvents() | ||
|  |     { | ||
|  |         return [ | ||
|  |             'onPluginsInitialized' => [ | ||
|  |                 ['autoload', 100002], | ||
|  |                 ['onPluginsInitialized', 100001] | ||
|  |             ], | ||
|  |             'onAdminGenerateReports' => ['onAdminGenerateReports', 0], | ||
|  |             'onAdminCompilePresetSCSS' => ['onAdminCompilePresetSCSS', 0] | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * [onPluginsInitialized:100000] Composer autoload. | ||
|  |      * | ||
|  |      * @return ClassLoader | ||
|  |      */ | ||
|  |     public function autoload(): ClassLoader | ||
|  |     { | ||
|  |         return require __DIR__ . '/vendor/autoload.php'; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return void | ||
|  |      */ | ||
|  |     public function onFatalException(): void | ||
|  |     { | ||
|  |         if (\defined('GRAV_CLI') || $this->isAdmin()) { | ||
|  |             return; | ||
|  |         } | ||
|  | 
 | ||
|  |         // Run through potential issues
 | ||
|  |         if ($this->problemsFound()) { | ||
|  |             $this->renderProblems(); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Add Flex-Object's preset.scss to the Admin Preset SCSS compile process | ||
|  |      * | ||
|  |      * @param Event $event | ||
|  |      */ | ||
|  |     public function onAdminCompilePresetSCSS(Event $event): void | ||
|  |     { | ||
|  |         $event['scss']->add($this->grav['locator']->findResource('plugins://problems/scss/_preset.scss')); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return void | ||
|  |      */ | ||
|  |     public function onPluginsInitialized(): void | ||
|  |     { | ||
|  |         if (\defined('GRAV_CLI') || $this->isAdmin()) { | ||
|  |             return; | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->enable([ | ||
|  |             'onFatalException' => ['onFatalException', 0], | ||
|  |         ]); | ||
|  | 
 | ||
|  |         $this->checker = new ProblemChecker(); | ||
|  | 
 | ||
|  |         if (!$this->checker->statusFileExists()) { | ||
|  |             // If no issues remain, save a state file in the cache
 | ||
|  |             if (!$this->problemsFound()) { | ||
|  |                 // delete any existing validated files
 | ||
|  |                 /** @var \SplFileInfo $fileInfo */ | ||
|  |                 foreach (new \GlobIterator(CACHE_DIR . ProblemChecker::PROBLEMS_PREFIX . '*') as $fileInfo) { | ||
|  |                     @unlink($fileInfo->getPathname()); | ||
|  |                 } | ||
|  |                 // create a file in the cache dir so it only runs on cache changes
 | ||
|  |                 $this->checker->storeStatusFile(); | ||
|  |             } else { | ||
|  |                 $this->renderProblems(); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return never-return | ||
|  |      */ | ||
|  |     private function renderProblems(): void | ||
|  |     { | ||
|  |         /** @var Uri $uri */ | ||
|  |         $uri = $this->grav['uri']; | ||
|  | 
 | ||
|  |         /** @var Environment $twig */ | ||
|  |         $twig = $this->getTwig(); | ||
|  | 
 | ||
|  |         $data = [ | ||
|  |             'problems' => $this->problems, | ||
|  |             'base_url' => $baseUrlRelative = $uri->rootUrl(false), | ||
|  |             'problems_url' => $baseUrlRelative . '/user/plugins/problems', | ||
|  |         ]; | ||
|  | 
 | ||
|  |         echo $twig->render('problems.html.twig', $data); | ||
|  |         http_response_code(500); | ||
|  |         exit(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param Event $e | ||
|  |      * @return void | ||
|  |      */ | ||
|  |     public function onAdminGenerateReports(Event $e): void | ||
|  |     { | ||
|  |         $reports = $e['reports']; | ||
|  | 
 | ||
|  |         $this->checker = new ProblemChecker(); | ||
|  | 
 | ||
|  |         // Check for problems
 | ||
|  |         $this->problemsFound(); | ||
|  | 
 | ||
|  |         /** @var Uri $uri */ | ||
|  |         $uri = $this->grav['uri']; | ||
|  | 
 | ||
|  |         /** @var Environment $twig */ | ||
|  |         $twig = $this->getTwig(); | ||
|  | 
 | ||
|  |         $data = [ | ||
|  |             'problems' => $this->problems, | ||
|  |             'base_url' => $baseUrlRelative = $uri->rootUrl(false), | ||
|  |             'problems_url' => $baseUrlRelative . '/user/plugins/problems', | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $reports['Grav Potential Problems'] = $twig->render('reports/problems-report.html.twig', $data); | ||
|  | 
 | ||
|  |         $this->grav['assets']->addCss('plugins://problems/css/admin.css'); | ||
|  |         $this->grav['assets']->addCss('plugins://problems/css/spectre-icons.css'); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     private function problemsFound(): bool | ||
|  |     { | ||
|  |         if (null === $this->checker) { | ||
|  |             $this->checker = new ProblemChecker(); | ||
|  |         } | ||
|  | 
 | ||
|  |         $status = $this->checker->check(__DIR__ . '/classes/Problems'); | ||
|  |         $this->problems = $this->checker->getProblems(); | ||
|  |          | ||
|  |         return $status; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return Environment | ||
|  |      */ | ||
|  |     private function getTwig(): Environment | ||
|  |     { | ||
|  |         $loader = new FilesystemLoader(__DIR__ . '/templates'); | ||
|  |         $twig = new Environment($loader, ['debug' => true]); | ||
|  |         $twig->addExtension(New DebugExtension()); | ||
|  | 
 | ||
|  |         return $twig; | ||
|  |     } | ||
|  | } |