Как отобразить модуль в области компонентов

13

Мне часто нужно создать пункт меню, который отображает модуль в области компонентов, без какого-либо другого содержимого.

Чтобы решить эту проблему, нужно создать новую статью и добавлять ее только {loadposition mymodule}в содержание статьи. Затем я создаю пункт меню Single Article для статьи. Это хорошо для одного модуля, но что если у меня есть 20 различных модулей, которые я хочу отображать таким образом? Мне нужно было бы создать 20 модулей, 20 (почти пустых) статей и 20 пунктов меню.

Существуют ли другие способы отображения модуля (и ничего больше) в области компонентов шаблона? Трюки? Хаки? Идеи?

johanpw
источник
Вы можете найти это полезным в Joomla! 3 использовать кнопку редактора, которая создает модуль для вас. Это сделало бы это быстрым и менее подверженным ошибкам.
Йон

Ответы:

10

Я сделал это, создав позицию модуля в одном месте с компонентом и проверив, присутствует ли модуль в этой позиции, затем отобразите его, в противном случае перейдите к компоненту:

Пример кода:

<main id="content" role="main" class="main">
 <?php 
 if ($this->countModules('myposition')) 
   { ?>
     <jdoc:include type="modules" name="myposition" style="xhtml" />
 <?php } 
  else 
  { ?>
     <jdoc:include type="component" /> 
  <?php } ?>
</main>

Затем, когда я хочу отобразить модуль вместо компонента на странице, я создаю модуль, назначив его этому пункту меню, и все готово.

Небольшое примечание:

Для удобства и большей ясности, я предлагаю назвать эту позицию модуля как-то «content-module», «main-module» или «compomodule». Все, что будет напоминать, что любой модуль, расположенный там, заменит выход компонента.

Ф.Фрюин
источник
1
Это идеальное решение. Многие коммерческие шаблоны имеют параметр переключателя в своей конфигурации на стороне администратора, но если вы не используете один из этих коммерческих шаблонов ... это самый эффективный и элегантный ответ.
Тони Мари
1
Мне нравится эта идея, она проста и эффективна, и ее легко реализовать в существующих шаблонах. Отлично.
Johanpw
9

Чтобы усилить приведенные ответы здесь:

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

echo JHtml::_('content.prepare', '{loadposition yourmodulposition}');

в файл просмотра.

Вторая строка с коротким тегом позиции загрузки может быть заменена на переменную, которая содержит больше HTML, если вам это нужно. Вам не нужно писать эту строку для каждой новой позиции модуля:

$outputModules = '<strong>Some Html</strong>'
                 .'{loadposition yourmodulposition1}'
                 .'{loadposition yourmodulposition2}';


echo JHtml::_('content.prepare', $outputModules);

(Я знаю, что это не прямой ответ на вопрос авторов.)

Деннис Хайден
источник
2

Вот простое и рабочее решение. Я попытался с JDOC: включить, но это не сработало.

    $ document = JFactory :: getDocument ();
    $ renderer = $ document-> loadRenderer ('modules');
    $ position = 'custompositionname';
    $ options = array ('style' => 'raw');
    echo $ renderer-> render ($ position, $ options, null); 
user2589739
источник
Пожалуйста, объясните далее, как вышеуказанный код может быть использован для достижения желаемого результата, как описано в вопросе.
FFrewin
В резервной копии создайте новый модуль, установите его положение (скажем, имя_позиции) и опубликуйте его. В интерфейсе добавьте приведенный выше код, и он будет работать без проблем.
user2589739
0

Мне пришлось сделать то же самое на моем сайте для демонстраций расширений и кнопок загрузки, однако, честно говоря, я думаю, что держать вещи отдельно в некотором смысле лучше, так как ими легче управлять. Мало того, что я почти уверен, что нет способа достичь того, что вы ищете, с помощью настоящей CMS, только жесткий код (не говорите больше).

Лоддер
источник
0

Во-первых, в соответствии с вашим вопросом вы уже создаете 20 модулей и 20 пунктов меню, так что на самом деле единственное, что вам нужно сделать, это создать однострочный элемент контента для каждого модуля. Если это действительно так обременительно, продолжайте с идеей @FFrewin. Это немного глупо, но это сработает.

Лично я бы пошел с материалами контента. Фактически, я сделал это, когда создавал систему с всплывающими диалоговыми окнами, которые я также хотел, чтобы работа была включена без js. Я поместил содержимое диалога в модуль custom_html, установил модуль, который должен быть обнаружен, и разместил его при нажатии на ссылку. А потом я также указал ссылку на элемент контента, включая модуль, как вы описали. Если js был включен, ссылка не была пройдена, и было открыто диалоговое окно. Если js был отключен, ссылка переходила, и содержимое диалога отображалось как содержимое. И контент был в одном месте, поэтому я не поддерживал две отдельные копии контента.

Арлен
источник
0

Создать пустую статью.

Создать пункт меню, выбирая статью, которую вы создали.

Создать модуль в неиспользуемом положении, установить назначение меню только на выбранных страницах, выбрать только пункт меню сверху.

Так как это было наверху, я хотел бы дать свой ответ, это то, что я делаю.

Mythic
источник