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;
}
}
?>
Wrażliwość wyszukiwarki Google na skopiowaną zawartość niedawno sami boleśnie odczuliśmy.
Jakiś czas temu elementy zawartości z naszej strony design-joomla.eu zostały skopiowane przez "konkurencję". Niestety algorytm Google uznał, że to złodziejowi należą się prawa do naszego tekstu a nas ukarał dramatycznym spadkiem pozycji.
Niestety jak narazie nierozwiązany. Wtyczka flashowa w wersji 10 powoduje problem z jednoczesnym uploadowaniem wielu plików. Problem leży po stronie flasha i na dzień dzisiejszy mamy tylko dwa wyjścia
Od wersji 1.5.8 flash uploader jest domyślnie wyłączony w konfiguracji.
Każdy, kto używa wbudowanego w Joomla 1.5 systemu do generowania przyjaznych URL-i z pewnością zirytowany jest faktem, że generowane adresy mają "powycinane" polskie znaki. Wystarczyło by zamieniać je na znaczki bez ogonków tak jak robią to zewnętrzne systemy np. ArtioJoomSEF.
Nic prostszego. Przygotowaliśmy odpowiednie rozwiązanie.
Często jest potrzeba odróżnienia strony startowej w Joomli 1.5 od podstron, z uwagi na wymagania projektu. Na przykład musimy wyłączyć obszar contentowy dla frontpage.
Joomla 1.5 oferuje prosty warunek, który można wstawić w pliku index.php umożliwiający to rozwiązanie. Przykład:
if(JRequest::getVar('view') == 'frontpage') { FRONTPAGE else { NOT FRONTPAGE }
Na serwerach wirtualnych home.pl występują problemy z generowaniem plików PDF z artykułów, które zawierają pliki graficzne. Błąd dotyczy adresu plików. Aby to rozwiązać wystarczy otworzyć plik tcpdf.php.
W najnowszej wersji Joomli 1.5.9 użytkownik po zalogowaniu jest przekierowywany na stronę z komunikatem "Witaj w gronie zarejestrowanych użytkowników...". Niektórym może to nie odpowiadać i chcieliby aby użytkownik był przekierowywany na stronę główną jak działo się to dotychczas.
Wystarczy otworzyć plik components/com_user/controller.php. Następnie w linii 150 zamienić
$return = 'index.php?option=com_user'; na $return = 'index.php';
Optymalizacja witryny to jeden z ważniejszych czynników, który ma wpływ na jej pozycję w wyszukiwarkach. Poza poprawnym sematycznie kodem szablonu istotny jest też dobór odpowiednich słów kluczowych i ich użycie w tagach i treści witryny.
Użytkownicy systemu CMS Joomla mogli do tej pory czuć się nieco poirytowani brakiem łatwej mozliwości zmiany tagów tutułowych dla poszczególnych podstron.
Bezpieczeństwo przede wszystkim. Nie wyobrażam sobie aby szanujący się webmaster nie wykonywał kopii zapasowych swojego serwisu.
Polecam wyszystkim administratorom Joomla doskonały komponent JoomlaPack autorstwa Nicholasa K. Dionysopoulosa
Wszyscy wiemy, że nowa Joomla 1.5 korzysta z kodowania znaków UTF-8. Jest to bardzo dobre posunięcie ze strony twórców CMS Joomla ze względu na kompatybilonść z różnymi kontami hostingowymi. Bardzo ułatwia też pracę nam, czyli developerom. Niestety nie wszyscy pamiętają aby poprawnie konwertować ciągi znaków.
Strony błedów w Joomla 1.5 nie wygladają zbyt ciekawie. Chcąc zatrzymać użytkownika w serwisie można pokazać mu dowolny artykuł w Joomla bez uciekania się edycji plików .htacess na serwerze. Wszystko możemy załatwić z poziomu templatki
W komponencie forum Fireboard 1.0.4 istnieje błąd związany z nieprawidłowym liczeniem ilości postów w danej kategorii.
Rozwiązaniem jest wklejenie poniższego kodu poczynając od linii 539 w pliku /components/com_fireboard/template/default/listcat.php :
W ostatnich dniach zanotowaliśmy prawie czterokrotny wzrost ogladalności witryny design-joomla.eu. A wszystko dzięki jednej małej wtyczce ...
Jak wyświetlić element zawartości niezalogowanemu użytkownikowi, w taki sposób aby zalogowany już jej nie widział?
Na tak postawione pytanie częstą experci na forach internetowych piszą: "nie da się" "nie ma takiej opcji" Otóż okazuje się że jest rozwiązanie i to całkiem proste.
Niestety nie wszystko w CMS Joomla jest idealne. Model MVC to kapitalne posunięcie. Ale część elementów "siedzi" jeszcze głęboko w kodzie i nie mozna łatwo zapanowac nad ich wyglądem. Choćby paginacja.