Захотелось как-то мне, чтобы в Joomla была возможность внедрять js-код и скрипты внутри тега body, как это можно делать в Zend Framework с помощью inlineScript.

Поэтому сделал свой аналог тега <jdoc:include type=»head» />, который вызывается так: <jdoc:include type=»inline» />

Для этого мне понадобилось:

  1. создать свой класс JDocumentRendererInline, наследованный от JDocumentRenderer
  2. создать singleton класс taInline, в котором будем аккумулировать подключаемые js-скрипты и код
  3. создать плагин, который будет копировать файл с JDocumentRendererInline в нужную папку, если его там нет, и регистрировать в Joomla класс taInline

Создаем проект со следующей структурой:

tainline

  — libraries

    — inline.php (документ для рендеринга)

  — tainline.php (singleton класс)

tainline.php (плагин)

tainline.xml

Код класса JDocumentRendererInline

< ?php defined('JPATH_BASE') or die();

/**
 * JDocument inline renderer
 *
 */
class JDocumentRendererInline extends JDocumentRenderer
{
  /**
   * Renders the document inline and returns the results as a string
   *
   * @access public
   * @param string   $name    (unused)
   * @param array   $params    Associative array of values
   * @return string  The output of the script
   */
  function render($name = null, $params = array(), $content = null)
  {
    if (!class_exists('taInline')) {
      return;
    }
    $inline = taInline::getInstance();
    return $inline->getData();
  }

}

Код singleton класс taInline

< ?php defined('_JEXEC') or die('Restricted access');

class taInline
{
  var $_script = array();
  var $_scripts = array();
  var $_scriptsReady = array();
  // Во что будет обрамлен код, вызываемый в ready
  var $ready_prefix = '$(function(){';
  var $ready_postfix = '});';

  function &getInstance()
  {
    static $instance;

    if (!is_object($instance)) {
      $instance = new taInline();
    }

    return $instance;
  }

  // добавляем js-файлы
  function addScript($url, $type = "text/javascript")
  {
    $this->_script[$url] = $type;
  }

  // добавляем js-код
  function addScriptDeclaration($script)
  {
    $this->_scripts[] = $script;
  }

  // добавляем js-код, который должен сработать по событию ready
  function addScriptDeclarationReady($script)
  {
    $this->_scriptsReady[] = $script;
  }

  // обрабатываем данные для рендеринга
  function getData()
  {
    ob_start();
    foreach ($this->_script as $url => $type) {
      echo '', PHP_EOL;
    }

    if (sizeof($this->_scripts) || sizeof($this->_scriptsReady)) {
      echo '', PHP_EOL;
    }
    return ob_get_clean();
  }
}

Код плагина

< ?php defined('_JEXEC') or die('Restricted access');

jimport('joomla.plugin.plugin');
jimport('joomla.filesystem.file');

class plgSystemTainline extends JPlugin
{

  var $_path;

  function plgSystemTainline(&$subject, $config)
  {
    // путь к каталогу
    $this->_path = dirname(__FILE__) . DS . 'tainline' . DS;
    // регистрируем класс taInline
    JLoader::register('taInline', $this->_path . 'tainline.php');

    $filesource = $this->_path . 'libraries' . DS . 'inline.php';
    $filedest = JPATH_LIBRARIES . DS . 'joomla' . DS . 'document' . DS . 'html' . DS . 'renderer' . DS . 'inline.php';

    // проверяем наличие render-класса inline
    if (!file_exists($filedest)) { // если файла нет, то копируем его
      if (!(JFile::copy($filesource, $filedest))) {
        JError::raiseWarning(1, 'JInstaller::install: ' . JText::sprintf('Failed to copy file to', $filesource, $filedest));
        return false;
      }
    }
  }

}

Текст xml-файла

< ?xml version="1.0" encoding="utf-8"?>

	System - taInline
	<jdoc:include type="inline" />
	
		tainline.php
		tainline
	

 

Для того чтобы воспользоваться созданными плагином и классами, нужно установить плагин в CMS и опубликовать его. После этого в любом месте шаблона прописать jdoc:inline

Пример:

$inline = & taInline::getInstance();

$inline->addScript('/jquery.js');

$inline->addScriptDeclaration('
var s="hello";
');

$inline->addScriptDeclarationReady('
alert(s);
');

Исходники