2017 © Pedro Peláez
 

joomla-package renderer

Joomla Renderer Package

image

babdev/renderer

Joomla Renderer Package

  • Sunday, May 3, 2015
  • by mbabker
  • Repository
  • 0 Watchers
  • 0 Stars
  • 157 Installations
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

The Renderer Package Build Status

Latest Stable Version Total Downloads Latest Unstable Version License, (*1)

Interfaces

Renderer\RendererInterface

Renderer\RendererInterface is an interface to provide a common rendering API., (*2)

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., (*3)

Usage

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

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., (*5)

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., (*6)

Sample Controller:, (*7)

namespace Joomla\Controller;

use Joomla\Renderer\RendererInterface;

use Joomla\Controller\AbstractController;
use Joomla\DI\ContainerAwareInterface;
use Joomla\DI\ContainerAwareTrait;
use Joomla\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
     */
    public function execute()
    {
        try
        {
            // Initialize the view object
            $view = $this->initializeView();

            // Render our view.
            $this->getApplication()->setBody($view->render());

            return true;
        }
        catch (\Exception $e)
        {
            throw new \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode());
        }
    }

    /**
     * Method to initialize the model object
     *
     * @return  \Joomla\Model\ModelInterface
     *
     * @since   1.0
     * @throws  \RuntimeException
     */
    protected function initializeModel()
    {
        $model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model';

        // If a model doesn't exist for our view, revert to the default model
        if (!class_exists($model))
        {
            $model = '\\Joomla\\Model\\DefaultModel';

            // If there still isn't a class, panic.
            if (!class_exists($model))
            {
                throw new \RuntimeException(sprintf('No model found for view %s', $vName), 500);
            }
        }

        return new $model($this->modelState);
    }

    /**
     * Method to initialize the renderer object
     *
     * @return  RendererInterface  Renderer object
     *
     * @since   1.0
     * @throws  \RuntimeException
     */
    protected function initializeRenderer()
    {
        $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 check
        if (!class_exists($class))
        {
            throw new \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
     */
    protected function initializeView()
    {
        // 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 otherwise
        if (!class_exists($class))
        {
            $class = '\\Joomla\\View\\DefaultHtmlView';

            // If we still have nothing, abort mission
            if (!class_exists($class))
            {
                throw new \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:, (*8)

namespace Joomla\View;

use Joomla\Renderer\RendererInterface;

use Joomla\Model\ModelInterface;
use Joomla\View\AbstractView;

/**
 * Abstract HTML View class
 *
 * @since  1.0
 */
abstract class 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
     */
    public function __construct(ModelInterface $model, RendererInterface $renderer)
    {
        parent::__construct($model);

        $this->setRenderer($renderer);
    }

    /**
     * Retrieves the data array
     *
     * @return  array
     *
     * @since   1.0
     */
    public function getData()
    {
        return $this->data;
    }

    /**
     * Retrieves the layout name
     *
     * @return  string
     *
     * @since   1.0
     * @throws  \RuntimeException
     */
    public function getLayout()
    {
        if (is_null($this->layout))
        {
            throw new \RuntimeException('The layout name is not set.');
        }

        return $this->layout;
    }

    /**
     * Retrieves the renderer object
     *
     * @return  RendererInterface
     *
     * @since   1.0
     */
    public function getRenderer()
    {
        return $this->renderer;
    }

    /**
     * Method to render the view.
     *
     * @return  string  The rendered view.
     *
     * @since   1.0
     * @throws  \RuntimeException
     */
    public function render()
    {
        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
     */
    public function setData(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
     */
    public function setLayout($layout)
    {
        $this->layout = $layout;

        return $this;
    }

    /**
     * Sets the renderer object
     *
     * @param   RendererInterface  $renderer  The renderer object.
     *
     * @return  $this  Method allows chaining
     *
     * @since   1.0
     */
    public function setRenderer(RendererInterface $renderer)
    {
        $this->renderer = $renderer;

        return $this;
    }
}

The view class for our view as established in the above sample controller:, (*9)

namespace Joomla\View;

use Joomla\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
     */
    public function render()
    {
        $this->setData(['data' => $this->model->getData()]);

        return parent::render();
    }
}

Installation via Composer

You can simply run the following from the command line:, (*10)

composer require joomla/renderer "~2.0"

The Versions

03/05 2015

dev-master

9999999-dev https://github.com/joomla-framework/renderer

Joomla Renderer Package

  Sources   Download

LGPL-2.1+

The Requires

  • php >=5.3.10

 

The Development Requires

framework renderer joomla