Добрый день,
Есть компонент (jshopping) и есть плагин (Widgetkit от Yootheme). Плагин должен вызываться на onContentPrepare.
Пытаюсь впилить один в другой, но пока безуспешно. Активно вставляют палки в колёса ужасное знание php и плохое представление о внутренней архитектуре Joomla.
Собственно что удалось сделать:
удалось догадаться, что за вывод статьи о категории (именно туда мне необходимо впилить этот несчастный плагин) отвечает супер короткий components/com_jshopping/views/category/view.html.php
удалось найти файл, в котором этот плагин уже впилен ( components/com_content/views/article/view.html.php )
удалось понять как оно приблизительно работает на уровне:
- грузятся какие-то переменные (содержимое статьи, параметры всякие и прочие имена пользователей)
- в какие-то переменные записывается результаты обработки текста плагинами
- магия
- и сразу же выводится готовый результат.
Магия заключается в том, что совершенно неочевидно (вполне вероятно, из-за палок в колёсах)
// it;s part of components/com_content/views/article/view.html.php
JPluginHelper::importPlugin('content');
$results = $dispatcher->trigger('onContentPrepare', array ('com_content.article', &$item, &$this->params, $offset));
$item->event = new stdClass();
$results = $dispatcher->trigger('onContentAfterTitle', array('com_content.article', &$item, &$this->params, $offset));
$item->event->afterDisplayTitle = trim(implode("\n", $results));
$results = $dispatcher->trigger('onContentBeforeDisplay', array('com_content.article', &$item, &$this->params, $offset));
$item->event->beforeDisplayContent = trim(implode("\n", $results));
$results = $dispatcher->trigger('onContentAfterDisplay', array('com_content.article', &$item, &$this->params, $offset));
$item->event->afterDisplayContent = trim(implode("\n", $results));
// Increment the hit counter of the article.
if (!$this->params->get('intro_only') && $offset == 0) {
$model = $this->getModel();
$model->hit();
}
//Escape strings for HTML output
$this->pageclass_sfx = htmlspecialchars($this->item->params->get('pageclass_sfx'));
$this->_prepareDocument();
parent::display($tpl);
все изменения оказываются в $tpl, который, собственно, и выводится.
Что я натворил в jshopping:
было:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
class JshoppingViewCategory extends JView
{
protected $item;
function display($tpl = null){
parent::display($tpl);
}
}
?>
стало:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
class JshoppingViewCategory extends JView
{
protected $item;
function display($tpl = null){
$app = JFactory::getApplication();
$dispatcher = JDispatcher::getInstance();
$this->item = $this->get('Item');
$item = &$this->item;
JPluginHelper::importPlugin('content');
$results = $dispatcher->trigger('onContentPrepare', array ('com_content.article', &$item, '', 0));
parent::display($tpl);
}
}
?>
собственно мне не понятно. как результат обработки плагина впихнуть в $tpl. если я вообще в правильном направлении копаю.
зы в логах ошибка:
[Fri Mar 09 03:42:50 2012] [error] [client 8.8.8.8] PHP Warning: Parameter 2 to plgContentWidgetkit_Content::onContentPrepare() expected to be a reference, value given in /home/user/www/site/libraries/joomla/event/event.php on line 71
спасибо за потраченное время на чтение поста. и за возможную подсказку.