Coraz głośniej już o Joomla 1.6. Deweloperzy odkrywają rąbka tajemnicy a nowe możliwości możemy poznać w wersji preAlfa.
Najważniejsze udogodnienia to możliwość dokładania dowolnych pół w formularzu kontaktowym, wbudowany system captcha, menadżer aktualizacji (coś dla leniwych) a co najważniejsze menadżer użytkowników i kontroli dostępu.
W Joomla! istnieje możliwość wydrukowania treści artykułu bez otaczających go modułów i całego szablonu strony przez kliknięcie ikony 'drukuj' znajdującej się obok tytułu danego artykułu. Jednak w jaki sposób zdefiniować style dla tego sposobu drukowania?
Niestety ostatnio coraz częściej spotykamy strony zainfekowane wirusami. Jeśli problem dotyczy małego serwisu nie jest kłopotem wyedytować kilka plików i zobaczyć czy wirus nie dolepił jakiegoś iframe. Ale co zrobić jeśli nasz serwis zbudowany jest na takim systemie jak Joomla z tysiącami plików?
Kiedy w szablonie Joomla! istnieje potrzeba wyróżnienia pewnych modułów należących do jednej pozycji, tak aby możliwe było oddzielne ostylowanie np. pierwszego i/lub ostatniego modułu, często posiłkujemy się różnymi skomplikowanymi lub po prostu nieczytelnymi sztuczkami czy nawet JavaScript'em. Stosowanie znacznika <jdoc:include type="..." />, który "wypluwa" wszystkie moduły z danej pozycji w jedno miejsce nie daje bowiem zbyt dużego pola manewru...
Poniżej prezentuję alternatywę dla znacznika <jdoc:include type="..." />, dzięki której możemy osiągnąć rewelacyjne efekty. Za przykład posłuży mi pozycja footer, w której renderowane będą kolejne moduły. Pierwszy i ostatni moduł oznaczony zostanie dodatkową klasą - odpowiednio footer-in-first i footer-in-last.
Najpierw zaprezentuję niezbędne funkcje klasy, a następnie przykłady z nimi związane.
Zaczynamy od dołączenia klasy JModuleHelper związaną z renderowaniem modułów
jimport( 'joomla.application.module.helper' );
Funkcja pobierająca wszystkie moduły z pozycji footer:
$footerModules = JModuleHelper::getModules( 'footer' );
Atrybuty stylu takie jak raw, xhtml, rounded, etc. określamy w tablicy:
$footerAttribs['style'] = 'raw';
Renderowanie modułów w pętli:
for ($i = 0; $i < count($footerModules); $i++) {
echo JModuleHelper::renderModule($footerModules[$i],$footerAttribs);
}
Kod renderujący moduły z pozycji footer:
<?php
// Załączamy klasę JModuleHelper
jimport( 'joomla.application.module.helper' );
?>
<!-- ... kod szablonu ... -->
<div id="footer">
<?php
$footerModules = JModuleHelper::getModules( 'footer' );
$footerAttribs['style'] = 'xhtml';
for ($i = 0; $i < count($footerModules); $i++) {
$footerClass = '';
if ($i == 0 ) $footerClass .= ' footer-in-first';
if ($i == count($footerModules)-1 ) $footerClass .= ' footer-in-last';
?>
<div class="footer-in<?php echo $footerClass; ?>">
<?php echo JModuleHelper::renderModule($footerModules[$i], $footerAttribs); ?>
</div>
<?php
}
?>
</div>
Efekt:
<div id="footer">
<div class="footer-in footer-in-first">...</div>
<div class="footer-in">...</div>
<div class="footer-in">...</div>
<div class="footer-in footer-in-last">...</div>
</div>
Innym pomysłem na wykorzystanie klasy JModuleHelper może być nadanie elementom div, klasy odpowiadającej typowi modułu, np.
<?php
// Załączamy klasę JModuleHelper
jimport( 'joomla.application.module.helper' );
?>
<!-- ... kod szablonu ... -->
<div id="footer">
<?php
$footerModules = JModuleHelper::getModules( 'footer' );
$footerAttribs['style'] = 'xhtml';
for ($i = 0; $i < count($footerModules); $i++) { ?>
<div class="footer-in <?php echo $footerModules[$i]->module; ?>"> <?php
echo JModuleHelper::renderModule($footerModules[$i], $footerAttribs); ?>
</div><?php
}
?>
</div>
Efekt:
<div id="footer">
<div class="footer-in mod_mainmenu">...</div>
<div class="footer-in mod_djcategories">...</div>
<div class="footer-in mod_banners">...</div>
<div class="footer-in mod_login">...</div>
</div>
Klasa DJModuleHelper pozwalająca na wyświetlenie modułów ze wskazanej pozycji i w wybranym stylu. Dzięki niej moduły opakowane będą elementem div, którego klasa składać się będzie z nazwy pozycji oraz słowa scheme_x (gdzie x oznacza liczbę wszystkich modułów, np. <div class="left scheme_4">...</div>). Każdemu modułowi (zawartemu w tym kontenerze) nadana zostanie klasa oznaczająca:
Poniższy kod zapisujemy w katalogu z szablonem, np. w pliku.
templates/nazwa_szablonu/php/djmodulehelper.php
Następnie importujemy go do szablonu
<?php include_once (JPATH_ROOT."/templates/".$this->template.'/php/djmodulehelper.php'); ?>
W miejscu wyświetlania modułów, tam gdzie zwykliśmy używać <jdoc:inlude type="pozycja" style="styl" /> wpisujemy
<?php DJModuleHelper::renderModules( 'pozycja' , 'styl'); ?>
Pierwszym argumentem funkcji jest nazwa pozycji, żas drugim powinnna być jedna z następujących wartości
[none|rounded|xhtml|table|horz]
Zawartość pliku djmodulehelper.php
<?php
defined('_JEXEC') or die ('Restricted access!!!');
/*
* Użycie w szablonie:
* echo DJModuleHelper::renderModules('nazwa_pozycji','[none|rounded|xhtml|table|horz]');
* np.: echo DJModuleHelper::renderModules('footer','none');
*/
jimport( 'joomla.application.module.helper' );
class DJModuleHelper extends JModuleHelper {
function renderModules($position, $chrome = 'none') {
if (!position) return false;
$html = '';
if ($modules = parent::getModules( $position )) {
$attribs['style'] = $chrome;
/* wszystkie moduły są opakowane w kontener
* nazwa_pozycji scheme_x
* gdzie x oznacza liczbę modułów */
$html .= '<div class="'.$position.' scheme_'.count($modules).'">';
for ($i = 0, $k = 0; $i < count($modules); $i++) {
// nazwa_pozycji-in
$className = $position.'-in';
// nazwa modułu
$className .= ' '.$modules[$i]->module;
// parzystość modułu
$className .= ($k) ? ' even' : ' odd';
// wyświetlanie tytułu w module
$className .= ($modules[$i]->showtitle) ? ' showtitle' : ' notitle';
// jeśli moduł jest pierwszy dodajemy nazwa_pozycji-in-first
if ($i == 0 ) $className .= ' '.$position.'-in-first';
// jeśli moduł jest ostatni dodajemy nazwa_pozycji-in-last
if ($i == count($modules)-1 ) $className .= ' '.$position.'-in-last';
$html .= '<div class="'.$className.'">';
$html .= parent::renderModule($modules[$i], $attribs);
$html .= '</div>';
$k = 1 - $k;
}
$html .= '</div>';
}
return $html;
}
}
?>