Jak wyświetlić moduł w obszarze komponentu

13

Często muszę utworzyć element menu, który wyświetla moduł w obszarze komponentu, bez żadnej innej zawartości.

Rozwiązuję ten problem, tworząc nowy artykuł i dodając tylko {loadposition mymodule}w treści artykułu. Następnie tworzę pozycję menu Pojedynczy artykuł dla tego artykułu. Jest to w porządku dla pojedynczego modułu, ale co, jeśli mam 20 różnych modułów, które chcę wyświetlić w ten sposób? Musiałbym stworzyć 20 modułów, 20 (prawie pustych) artykułów i 20 pozycji menu.

Czy istnieją inne sposoby wyświetlania modułu (i nic więcej) w obszarze komponentu szablonu? Wydziwianie? Hacki? Pomysły?

johanpw
źródło
Może się przydać w Joomla! 3, aby użyć przycisku edytora, który tworzy moduł dla Ciebie. Dzięki temu byłoby to szybsze i mniej podatne na błędy.
Eoin

Odpowiedzi:

10

Zrobiłem to, tworząc pozycję modułu w tym samym miejscu co komponent i sprawdzając, czy moduł jest obecny w tej pozycji, a następnie wyświetl go, w przeciwnym razie przejdź do komponentu:

Przykładowy kod:

<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>

Następnie, gdy chcę wyświetlić moduł zamiast komponentu na stronie, tworzę moduł, przypisuję go do tego elementu menu i gotowe.

Mała uwaga boczna:

Dla wygody i większej przejrzystości sugeruję nazwać tę pozycję modułu czymś w rodzaju „moduł treści”, „moduł główny” lub „moduł”. Wszystko, co przypomni, że dowolny moduł tam umieszczony, zastąpi wyjście komponentu.

FFrewin
źródło
1
To idealne rozwiązanie. Wiele komercyjnych szablonów ma przełącznik parametrów w konfiguracji po stronie administratora, ale jeśli nie używasz jednego z tych komercyjnych szablonów ... jest to najbardziej wydajna i elegancka odpowiedź.
Toni Marie,
1
Podoba mi się ten pomysł, jest prosty i skuteczny oraz łatwy do wdrożenia w istniejących szablonach. Doskonały.
johanpw
9

Aby poprawić podane tutaj odpowiedzi:

Aby uwzględnić pozycję modułu w widoku komponentu i załadować tam moduły, wystarczy dodać

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

do pliku widoku.

Drugi ciąg z krótkim znacznikiem pozycji ładowania można w razie potrzeby zastąpić var, który zawiera więcej html. Nie musisz pisać tej linii dla każdej nowej pozycji modułu:

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


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

(Wiem, że nie jest to bezpośrednia odpowiedź na pytanie autora).

Dennis Heiden
źródło
2

Oto proste i działające rozwiązanie. Próbowałem z jdoc: dołącz, ale to nie działało.

    $ document = JFactory :: getDocument ();
    $ renderer = $ document-> loadRenderer ('moduły');
    $ position = 'custompositionname';
    $ options = array ('style' => 'raw');
    echo $ renderer-> render ($ position, $ options, null); 
użytkownik2589739
źródło
Proszę wyjaśnić dalej, w jaki sposób powyższy kod można wykorzystać do osiągnięcia pożądanego rezultatu, jak opisano w pytaniu.
FFrewin
W kopii zapasowej utwórz nowy moduł i ustaw jego pozycję (powiedz custompositionname) i opublikuj go. W interfejsie dodaj powyższy kod i będzie działał bez żadnych problemów.
user2589739
0

Musiałem zrobić to samo na mojej stronie, aby wyświetlić dema rozszerzeń i przyciski pobierania, jednak, szczerze mówiąc, myślę, że oddzielenie rzeczy jest pod pewnymi względami lepsze, ponieważ łatwiej jest nimi zarządzać. Nie tylko jestem pewien, że nie ma sposobu, aby osiągnąć to, czego szukasz za pomocą rzeczywistego CMS, tylko kod stały (nie mów więcej).

Lodder
źródło
0

Po pierwsze, zgodnie z twoim pytaniem tworzysz już 20 modułów i 20 pozycji menu, więc naprawdę jedyną dodatkową rzeczą, którą musisz zrobić, to utworzyć element treści w jednym wierszu dla każdego modułu. Jeśli to naprawdę bardzo uciążliwe, skorzystaj z pomysłu @ FFrewin. Jest trochę zuchwały, ale zadziała.

Osobiście wybrałbym elementy treści. W rzeczywistości zrobiłem to, gdy budowałem system z wyskakującymi oknami dialogowymi, w których chciałem również pracować bez włączonej JS. Umieściłem zawartość okna dialogowego w module custom_html, ustawiłem moduł do ujawnienia i ustawiłem po kliknięciu łącza. Następnie wskazałem również link na element treści, w tym moduł, jak opisałeś. Jeśli js było włączone, łącze nie było śledzone i pojawiło się okno dialogowe. Jeśli js było wyłączone, link był śledzony, a zawartość okna dialogowego była wyświetlana jako treść. A zawartość była w jednym miejscu, więc nie utrzymywałem dwóch osobnych kopii zawartości.

Arlen
źródło
0

Utwórz pusty artykuł.

Utwórz element menu, wybierając utworzony artykuł.

Utwórz moduł w nieużywanej pozycji, ustaw przypisanie menu tylko na wybrane strony, wybierz tylko pozycję menu od góry.

Ponieważ było to na szczycie, zapewniłem, że udzielę odpowiedzi, właśnie to robię.

Mityczny
źródło