Может ли модуль Joomla «знать», в каком положении он находится? - PullRequest
3 голосов
/ 04 октября 2011

Я довольно новичок в Joomla (я был большим парнем в Wordpress), и у меня есть вопрос о позициях модуля.

Может ли модуль знать, в каком положении он находится. Например, я могу сделать что-то вроде этого:

if(modulePosition =='left'){
    Do this...
}else{
    Do that...
}

Это кажется достаточно простым, но я искал несколько часов и не могу найтивсе, что поможет мне в этом.Я знаю, что есть функция countModules, но, насколько я могу судить, она просто проверяет, активен ли модуль.

Спасибо за вашу помощь!

Ответы [ 5 ]

9 голосов
/ 05 октября 2011

Я нашел ответ! В основном благодаря @Hanny. Его идея использовать ID модулей заставила меня погуглить, и я наткнулся на ответ. Для тех, кто ищет что-то подобное, вот оно.

Вы используете глобальную переменную $ module (кто бы мог подумать, верно?)

Итак, мой код теперь выглядит так:

$class = '';
if($module->position == 'position1'){
     $class = 'class1';
}
and so on...

Довольно просто, да?

Чтобы узнать, что еще можно сделать с глобальной переменной $ module, просто вставьте это в свой код и посмотрите, какую информацию вы можете использовать:

echo(print_r($module));

Спасибо за вашу помощь!

1 голос
/ 25 сентября 2014

Я пытался прокомментировать решение Джона, но у меня недостаточно точек повторения - я хотел добавить, что не имеет значения, как вы называете позицию модуля в вашем шаблоне, с учетом названия позиции, из которой вы получаете ответ $ module-> position всегда в нижнем регистре независимо от того, как вы назвали позицию в шаблоне ... т.е. в вашем шаблоне xml где-то у вас может быть позиция topBar, которая будет именоваться 'topbar', а не 'topBar', когда вы попытаетесь проверить ее с помощью

if($module->position == 'topBar') //always false... use instead
if($module->position == 'topbar') //what you need to use
1 голос
/ 04 октября 2011

Короткий ответ «да», вы назначите модулю позицию на основе вашего шаблона. Когда он появляется, вы можете иметь такие же условия для этой позиции (разные шаблоны имеют разные соглашения об именах для позиций, поэтому убедитесь, что вы знаете, какие они есть, прежде чем кодировать).

Например, некоторые используют «Position12», другие могут использовать «leftcol» и т. Д. Вы просто должны проверить файлы шаблонов, чтобы увидеть (вы можете проверить .xml файл в каталоге шаблонов, чтобы увидеть позиции, перечисленные в шаблон или обратитесь к файлу index.php, чтобы найти файл jdoc).

По моему опыту, единственный раз, когда вам действительно понадобится подобный код, находится в файлах основного макета шаблона (например, если у вас разные ширины столбцов в зависимости от присутствия модулей или нет), в противном случае на самом деле не будет времени, когда вы «можете или не можете» показывать модуль - потому что вы будете явно указывать им, где находиться и когда на заднем плане.

0 голосов
/ 21 апреля 2013

Экземпляр модуля назначается одной позиции, и он сохраняется в базе данных, и обычно вы определяете позицию в шаблоне. Экземпляр модуля может быть назначен только одной позиции. Так что, хотя это интересный вопрос, он не совсем практический.

Исключениями являются следующие: loadposition ... вы можете захотеть узнать, загружается ли модуль с помощью плагина, потому что это потенциально поместит его где-то помимо стилизованной области для позиции. Хотя я бы рекомендовал всегда делать новый экземпляр именно для этого, чтобы у вас было больше контроля.

loadmodule ... модуль загружается по имени с помощью плагина. В этом случае вам, вероятно, лучше создать новый экземпляр модуля и стилизовать его. Кроме того, я бы в любом случае поместил его в span или div, в зависимости от того, что это такое.

jdocinclude: module ... загрузка модуля непосредственно в шаблон. Опять же, если вы делаете это, я бы обернул его в span или div. В этом случае вам также разрешено включать строку встроенных стилей, если вам это нравится.

Отображение модуля в строку и повторение его, опять же, это в основном очень индивидуальное решение, и вы захотите установить стили и параметры.

0 голосов
/ 05 октября 2011

Я собираюсь не согласиться с Хэнни .Я думаю, что ответ - нет, не так, как вы описали.

Шаблон знает, когда он достиг позиции модуля, и получает список модулей, назначенных на эту позицию, а затем вызывает их рендеринг.Но эта информация не передается.Он не хранится ни в JApplication, ни в JDocument и т. Д. (Например, ничего не хранится в том месте, где в шаблоне выполняется рендеринг или что-то в этом роде).

Есть несколько хакерских способов получить почти то, что вы хотите.Если вы знаете позиции шаблона, по которым нужно искать (к сожалению, нет простого способа получить это из шаблона - в противном случае вы можете проанализировать файл .XML вашего шаблона для <position> элементов ...), тогда вы можете сделать что-то вроде:

<?php

$positions = array('left', 'right', 'top', 'bottom')

$found_in = false;

foreach ($positions as $cur_position)
{
    $module_positions = JModuleHelper::getModules($cur_position);
    foreach ($module_positions as $cur_module_in_pos)
    {
        if ($cur_module_in_pos->module == 'mod_MYMODULE')
        {
            $found_in = $cur_position;
        }
    }
}

if ($found_in)
...

Конечно, это не работает, если ваш модуль включен на страницу несколько раз, но, возможно, вы можете сделать такое предположение?

В противном случае это будетвзлом ядра - вы можете использовать вызов JDispatcher::trigger() до того, как шаблон вызовет модуль, установить некоторую переменную и т. д. К сожалению, в ядре нет такого события для запуска (pre_module_render или что-то в этом роде).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...