This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.

EOL

This packages is no longer maintained and archived. No replacement by the Joomla Project is planned.

The Renderer Package Build Status

Latest Stable VersionTotal DownloadsLatest Unstable VersionLicense

Deprecated

The joomla/renderer package has been deprecated. No further updates are planned.

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API.

Classes

  • Renderer\MustacheRenderer
  • Renderer\PhpEngineRenderer
  • Renderer\PlatesRenderer
  • Renderer\TwigRenderer

All classes except PlatesRenderer extend the parent rendering engine classes to enable those engines to implement the RendererInterface.

Usage

Renderer\RendererInterface classes can be instantiated in the same manner as their parent implementations, please refer to the vendor documentation for further details.

To assist with using these classes, example service providers are shared in this repository's samples folder, as well as the sample configuration which these providers are dependent upon.

Example Use Case

An example use of the Renderer\RendererInterface is provided here. In this example, our controller class builds a view class based on Joomla\View\ViewInterface and injects the required dependencies.

Sample Controller:

namespaceJoomla\Controller;
useJoomla\Renderer\RendererInterface;
useJoomla\Controller\AbstractController;
useJoomla\DI\ContainerAwareInterface;
useJoomla\DI\ContainerAwareTrait;
useJoomla\View\ViewInterface;
/** * Default controller class for the application * * @since 1.0 */class DefaultController extends AbstractController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/** * The default view for the application * * @var string * @since 1.0 */protected$defaultView = 'dashboard';
/** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */protected$modelState = null;
/** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */publicfunctionexecute()
{
try
{
// Initialize the view object$view = $this->initializeView();
// Render our view.$this->getApplication()->setBody($view->render());
returntrue;
}
catch (\Exception$e)
{
thrownew \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
}
}
/** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeModel()
{
$model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';
// If a model doesn't exist for our view, revert to the default modelif (!class_exists($model))
{
$model = '\\Joomla\\Model\\DefaultModel';
// If there still isn't a class, panic.if (!class_exists($model))
{
thrownew \RuntimeException(sprintf('No model found for view %s', $vName), 500);
}
}
returnnew$model($this->modelState);
}
/** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeRenderer()
{
$type = $this->getContainer()->get('config')->get('template.renderer');
// Set the class name for the renderer's service provider$class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider';
// Sanity checkif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type)));
}
// Add the provider to the DI container$this->getContainer()->registerServiceProvider(new$class);
return$this->getContainer()->get('renderer');
}
/** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */protectedfunctioninitializeView()
{
// Initialize the model object$model = $this->initializeModel();
$view = ucfirst($this->getInput()->getWord('view', $this->defaultView));
$class = '\\Joomla\\View\\' . $view . 'HtmlView';
// Ensure the class exists, fall back to default otherwiseif (!class_exists($class))
{
$class = '\\Joomla\\View\\DefaultHtmlView';
// If we still have nothing, abort missionif (!class_exists($class))
{
thrownew \RuntimeException(sprintf('A view class was not found for the %s view.', $view));
}
}
// HTML views require a renderer object too, fetch it$renderer = $this->initializeRenderer();
// Instantiate the view now/* @type \Joomla\View\AbstractHtmlView $object */$object = new$class($model, $renderer);
// We need to set the layout too$object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index')));
return$object;
}
}

The view class in this example is extended from this sample class which extends \Joomla\View\AbstractView:

namespaceJoomla\View;
useJoomla\Renderer\RendererInterface;
useJoomla\Model\ModelInterface;
useJoomla\View\AbstractView;
/** * Abstract HTML View class * * @since 1.0 */abstractclass AbstractHtmlView extends AbstractView
{
/** * The data array to pass to the renderer engine * * @var array * @since 1.0 */private$data = array();
/** * The name of the layout to render * * @var string * @since 1.0 */private$layout;
/** * The renderer object * * @var RendererInterface * @since 1.0 */private$renderer;
/** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */publicfunction__construct(ModelInterface$model, RendererInterface$renderer)
{
parent::__construct($model);
$this->setRenderer($renderer);
}
/** * Retrieves the data array * * @return array * * @since 1.0 */publicfunctiongetData()
{
return$this->data;
}
/** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */publicfunctiongetLayout()
{
if (is_null($this->layout))
{
thrownew \RuntimeException('The layout name is not set.');
}
return$this->layout;
}
/** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */publicfunctiongetRenderer()
{
return$this->renderer;
}
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */publicfunctionrender()
{
return$this->getRenderer()->render($this->getLayout(), $this->getData());
}
/** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetData(array$data)
{
$this->data = $data;
return$this;
}
/** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetLayout($layout)
{
$this->layout = $layout;
return$this;
}
/** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */publicfunctionsetRenderer(RendererInterface$renderer)
{
$this->renderer = $renderer;
return$this;
}
}

The view class for our view as established in the above sample controller:

namespaceJoomla\View;
useJoomla\Model\DefaultModel;
/** * HTML view class for the Dashboard * * @since 1.0 */class DashboardHtmlView extends AbstractHtmlView
{
/** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */protected$model;
/** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */publicfunctionrender()
{
$this->setData(['data' => $this->model->getData()]);
returnparent::render();
}
}

Installation via Composer

You can simply run the following from the command line:

composer require joomla/renderer "~4.0"

About

Provides a common rendering interface for PHP template engines

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages