Last active
June 12, 2022 22:11
-
-
Save juban/1763ee4dbc88547a55ba03b998c069dc to your computer and use it in GitHub Desktop.
CriticalCssController console controller to export a rollup-plugin-critical compatible configuration file to use with Vite.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace modules\console\controllers; | |
use Craft; | |
use craft\console\Controller; | |
use craft\elements\Entry; | |
use craft\helpers\Console; | |
use craft\helpers\FileHelper; | |
use craft\helpers\Json; | |
use craft\web\View; | |
use yii\console\ExitCode; | |
use yii\helpers\ArrayHelper; | |
/** | |
* CriticalCssController class | |
* | |
* @author juban | |
**/ | |
class CriticalCssController extends Controller | |
{ | |
/** | |
* Export a rollup-plugin-critical compatible configuration file to use in Vite. | |
* @param string $siteHandle | |
* @param string $outputFile | |
* @return int | |
* @throws \yii\base\ErrorException | |
* @throws \yii\base\Exception | |
*/ | |
public function actionExportConfiguration(string $siteHandle, string $outputFile = "scan.json"): int | |
{ | |
$site = Craft::$app->sites->getSiteByHandle($siteHandle); | |
if (!$site) { | |
$this->stdout("Error: ", Console::FG_RED); | |
$this->stdout("Invalid site handle: {$siteHandle}\n"); | |
return ExitCode::USAGE; | |
} | |
$this->stdout("Starting scan file generation for site {$site->name}...\n"); | |
$pages = []; | |
Craft::$app->sites->setCurrentSite($site); | |
$sections = Craft::$app->sections->getAllSections(); | |
foreach ($sections as $section) { | |
$siteSettings = ArrayHelper::index($section->siteSettings, 'siteId'); | |
$siteId = (string)$site->id; | |
if (array_key_exists($siteId, $siteSettings) && $siteSettings[$siteId]->hasUrls) { | |
$this->stdout("Adding section {$section->name}: "); | |
$template = $this->_templatePath($siteSettings[$siteId]->template); | |
if($template) { | |
if ($section->type === 'single') { | |
$pages[] = [ | |
'uri' => $siteSettings[$siteId]->uriFormat === '__home__' ? "" : "/" . $siteSettings[$siteId]->uriFormat, | |
'template' => $this->_templatePath($siteSettings[$siteId]->template), | |
]; | |
} else { | |
// Get first entry available entry | |
$entry = Entry::find()->section($section)->one(); | |
if ($entry) { | |
$pages[] = [ | |
'uri' => "/" . $entry->uri, | |
'template' => $this->_templatePath($siteSettings[$siteId]->template), | |
]; | |
} | |
} | |
$this->stdout("OK.\n", Console::FG_GREEN); | |
} | |
else { | |
$this->stdout("Could not find template for {$section->name}.\n", Console::FG_RED); | |
} | |
} | |
} | |
$outputPath = CRAFT_BASE_PATH . '/' . $outputFile; | |
$this->stdout("Writing scan file to {$outputPath}\n"); | |
FileHelper::writeToFile($outputPath, Json::encode($pages)); | |
$this->stdout("Done.\n", Console::FG_GREEN); | |
return ExitCode::OK; | |
} | |
/** | |
* @param $template | |
* @return string | |
*/ | |
private function _templatePath($template): string | |
{ | |
$view = Craft::$app->getView(); | |
// Resolve true template file name | |
$template = $view->resolveTemplate($template, View::TEMPLATE_MODE_SITE); | |
if (!$template) { | |
return false; | |
} | |
// Remove base template path | |
$oldTemplateMode = $view->getTemplateMode(); | |
$view->setTemplateMode(View::TEMPLATE_MODE_SITE); | |
$template = substr($template, strlen($view->getTemplatesPath() . '/'), strlen($template)); | |
$view->setTemplateMode($oldTemplateMode); | |
return pathinfo($template, PATHINFO_DIRNAME) . '/' . pathinfo($template, PATHINFO_FILENAME); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment