Skip to content

Instantly share code, notes, and snippets.

@juban
Last active June 12, 2022 22:11
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juban/1763ee4dbc88547a55ba03b998c069dc to your computer and use it in GitHub Desktop.
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.
<?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