/** * Inject the developer tools in designer mode. * * @see \Contao\Controller::replaceDynamicScriptTags * * @param string $buffer * * @return string */ public function injectDeveloperTools($buffer) { $page = $this->pageProvider->getPage(); if ($page) { $renderMode = $this->renderModeDeterminer->determineMode(); if (RenderMode::DESIGN == $renderMode) { $buffer = $this->developerTool->inject($buffer); } } return $buffer; }
public function renderDesignerModeInlineHtml(RenderAssetHtmlEvent $event, $eventName, EventDispatcherInterface $eventDispatcher) { if (!$event->getHtml() && $event->isDesignerMode()) { $asset = $event->getAsset(); if ($asset instanceof ExtendedAssetInterface && $asset->isInline()) { $page = $this->pageProvider->getPage(); $html = ''; // html mode $xhtml = $page->outputFormat == 'xhtml'; // retrieve page path $targetPath = \Environment::get('requestUri'); // remove query string $targetPath = preg_replace('~\\?\\.*~', '', $targetPath); // remove leading / $targetPath = ltrim($targetPath, '/'); // overwrite the target path $asset->setTargetPath($targetPath); // load and dump the collection $asset->load($event->getDefaultFilters()); $js = $asset->dump($event->getDefaultFilters()); // generate html $scriptHtml = '<script'; if ($xhtml) { $scriptHtml .= ' type="text/javascript"'; } $scriptHtml .= '>'; $scriptHtml .= $js; $scriptHtml .= '</script>'; // wrap cc around if ($asset instanceof ExtendedAssetInterface && $asset->getConditionalComment()) { $scriptHtml = ThemePlusUtils::wrapCc($scriptHtml, $asset->getConditionalComment()); } // add debug information $html .= $this->developerTool->getDebugComment($asset); $html .= $scriptHtml . PHP_EOL; $event->setHtml($html); } } }
public function renderDesignerModeHtml(RenderAssetHtmlEvent $event, $eventName, EventDispatcherInterface $eventDispatcher) { if (!$event->getHtml() && $event->isDesignerMode()) { $asset = $event->getAsset(); if (!$asset instanceof ExtendedAssetInterface || !$asset->isInline()) { $page = $this->pageProvider->getPage(); $html = ''; // html mode $xhtml = $page->outputFormat == 'xhtml'; $tagEnding = $xhtml ? ' />' : '>'; // session id $id = substr(md5($asset->getSourceRoot() . '/' . $asset->getSourcePath()), 0, 8); // get the session object $session = unserialize($_SESSION['THEME_PLUS_ASSETS'][$id]); if (!$session || $asset->getLastModified() > $session->asset->getLastModified()) { $session = new \stdClass(); $session->page = $page->id; $session->asset = $asset; $_SESSION['THEME_PLUS_ASSETS'][$id] = serialize($session); } $realAssets = $asset; while ($realAssets instanceof DelegatorAssetInterface) { $realAssets = $realAssets->getAsset(); } if ($realAssets instanceof FileAsset) { $name = basename($realAssets->getSourcePath()); } else { if ($realAssets instanceof HttpAsset) { $class = new \ReflectionClass($realAssets); $property = $class->getProperty('sourceUrl'); $property->setAccessible(true); $url = $property->getValue($realAssets); $name = 'url_' . basename(parse_url($url, PHP_URL_PATH)); } else { $name = 'asset_' . $id; } } // generate the proxy url $url = sprintf('assets/theme-plus/proxy.php/css/%s/%s', $id, $name); // overwrite the target path $asset->setTargetPath($url); // remember asset for debug tool $this->developerTool->registerFile($id, (object) ['asset' => $realAssets, 'type' => 'css', 'url' => $url]); // generate html $linkHtml = '<link'; $linkHtml .= sprintf(' id="%s"', $id); $linkHtml .= sprintf(' href="%s"', $url); if ($xhtml) { $linkHtml .= ' type="text/css"'; } $linkHtml .= ' rel="stylesheet"'; if ($asset instanceof ExtendedAssetInterface && $asset->getMediaQuery()) { $linkHtml .= sprintf(' media="%s"', $asset->getMediaQuery()); } $linkHtml .= $tagEnding; // wrap cc around if ($asset instanceof ExtendedAssetInterface && $asset->getConditionalComment()) { $linkHtml = ThemePlusUtils::wrapCc($linkHtml, $asset->getConditionalComment()); } // add debug information $html .= $this->developerTool->getDebugComment($asset); $html .= $linkHtml . PHP_EOL; $event->setHtml($html); } } }
private function generateCache(GeneratePreCompiledAssetsCacheEvent $event, EventDispatcherInterface $eventDispatcher, $organizeEventName, $renderEventName) { if ($event->getCacheCode()) { return; } $date = date('r'); $page = $event->getPage(); $layout = $event->getLayout(); $defaultFilters = $event->getDefaultFilters(); $collections = $event->getCollections(); $result = <<<PHP /** * Assets cache * * created at: {$date} * page id: {$page->id} * layout id: {$layout->id} */ PHP; // store all collections foreach ($collections as $collection) { $organizeEvent = new OrganizeAssetsEvent(RenderMode::LIVE, $page, $layout, $collection, $defaultFilters); $eventDispatcher->dispatch($organizeEventName, $organizeEvent); $assets = $organizeEvent->getOrganizedAssets()->all(); $debug = ''; $html = ''; foreach ($assets as $asset) { $renderEvent = new RenderAssetHtmlEvent(RenderMode::LIVE, $page, $layout, $asset, $defaultFilters); $eventDispatcher->dispatch($renderEventName, $renderEvent); $debug .= $this->developerTool->getAssetDebugString($asset) . PHP_EOL . PHP_EOL; $html .= $renderEvent->getHtml(); } if ($html) { $expression = $this->compiler->compile($collection->getFilterRules()); $debug = rtrim($debug); $debug = explode(PHP_EOL, $debug); $debug = implode(PHP_EOL . ' * ', $debug); $debug = <<<PHP /* * Debug information: * * {$debug} */ PHP; $html = var_export($html, true); $result .= <<<PHP if ({$expression}) { {$debug} return {$html}; } PHP; } } $result .= <<<PHP return null; PHP; $event->setCacheCode($result); }