Возможно, мы не поняли друг друга.
Код модуля выполняется столько раз, сколько он присутствует на странице. Для того, чтобы он был вызван, требуется указать, для каких страниц он вызывается. Если он для страницы не указан, он вообще не выполнится. Если он указан, то, независимо от сгенерированного модулем контента (даже, если его вообще не будет), в страницу будет вставлен блок (div) под размещение этого контента. Проблема в том, что даже под пустой блок всё равно сформирован блок для сайдбара, а место под основной контент уменьшено. В результате при полном отсутствии контента модуля в сайдбаре справа (сайдбар у меня справа) остается свободное место, а основной контент его не занимает.
Решение, которое Вы предложили, может только убрать генерируемый контент, но место под него всё равно резервируется. Также, насколько я понимаю, объект, созданный в коде модуля, живет только до окончания выполнения кода модуля или до первого return. Затем этот объект уничтожается. Поэтому он дважды выполниться он может только в пределах одной позиции, например:
protected function _load($position, $style = 'none')
{
self::$modules[$position] = '';
$document = JFactory::getDocument();
$renderer = $document->loadRenderer('module');
$modules = JModuleHelper::getModules($position);
$params = array('style' => $style);
ob_start();
foreach ($modules as $module)
{
echo $renderer->render($module, $params);
}
self::$modules[$position] = ob_get_clean();
return self::$modules[$position];
}
Вызов кода модуля из других мест обычно производится аналогично, но уже не перебором, а каждый модуль отдельно.
Есть ли какой-то способ возвращать true или false, определяющее необходимость вставки модуля куда-либо?