Нашел интересное решение. Может кому-то пригодится.
Было два основных вопроса:
1) как "подружить" вспомогательные компоненты с основным.
2) как вывести чекбоксы выбора компонентов и их уникальные настройки.
По первому вопросуЗавел специальную табличку в основном компоненте, где и регистрируем "дружественные" компоненты. Хоть через script.php дочерних компонентов, хоть вручную (сделал специальные вьюшки в админке для управления компонентами).
По второму вопросу(спасибо
Jonathan M. Cameron)
В дочерних компонентах делаем специальную вьюху для вывода настроек (можно добавить контроллер и модель, но это пожеланию)
Во вьюхе делаем функцию
display такого вида:
public function display( $tpl = null )
{
$result = $this->loadTemplate($tpl);
if ($result instanceof Exception)
{
return $result;
}
return true;
}
Обратите внимание, что мы в ней загружаем шаблон, а не вызываем одноименную родительскую функцию.
И еще в этом виде добавляем функцию
getOutput public function getOutput()
{
return $this->_output;
}
После этого в функции получения списка записей (
getItems) делаем такую обработку
if(!empty($items))
{
foreach ($items as $item)
{
$item->notifiers = array();
$eventParams = new JRegistry($item->params);
foreach ($eventParams->get('notifiers') as $component )
{
// get current view
$view = $this->getNotifierView($component);
// set requered data to view
$view->set('myvar', $item->id);
// Get the view to generate the display output from the template
if ( $view->display() === true ) {
// Display or return the results
$output = $view->getOutput();
}
else{
$output = '';
}
$item->notifiers[] = $output;
}
}
}
Так мы получаем все нужные настройки соответствующих компонентов, которые мы сможем сохранить в наш профиль.
Здесь используется функция
getNotifierView(), отвечающая за подключение соответствующего вида:
protected function &getNotifierView($component)
{
if(!array_key_exists($component, $this->notifierViews))
{
$prefix = substr($component, 4);
$className = $prefix .'ViewUserParams';
// include required class
require_once(JPATH_SITE .'/components/'.$component.'/views/userparams/view.html.php');
//JLoader::register($className, JPATH_SITE .'/components/'.$component.'/views/userparams/view.html.php');
if(!class_exists($className, false)){
throw new Exception('There is no required class of notifier view.', 500); // TODO: translate the message
}
$this->notifierViews[$component] = new $className(array('base_path'=> JPATH_SITE .'/components/'.$component));
}
return $this->notifierViews[$component];
}
Как-то так.
Все остальное как обычно. Но если что-то не понятно -- спрашивайте.
Осталось доделать сохранение данных, но это уже мелочи.