--=REKLAMA=--

Więcej o modułach w Joomla!

Z Joomla!WikiPL

Zliczanie modułów w pozycji modułów

Metoda countModules może zostać zastosowana w szablonie, aby ustalić, czy w jakiejś pozycji znajdują się moduły. Metody tej używamy zwykle wówczas, gdy chcemy objąć moduły w pewnej pozycji kodem HTML, jeżeli choć jeden moduł zostanie w tej pozycji umieszczony. Zastosowanie tej metody zapobiega wyświetlaniu pustych przestrzeni, umieszczaniu w kodzie zbędnych pustych znaczników oraz w technice nazwanej czasami "ukrywaniem kolumn" lub "składaniem kolumn" [collapsing columns].

Na przykład, poniższy kod umieści w pozycji 'user1' kod HTML tworzący ramkę pozwalającą dowolnie stylizować obramowanie modułu, ale tylko wtedy, jeżeli w tej pozycji zostanie opublikowany co najmniej jeden moduł.

<?php if ($this->countModules( 'user1' )) : ?>
  <div class="user1">
    <jdoc:include type="modules" name="user1" style="rounded" />
  </div>
<?php endif; ?>

Zliczanie modułów w wielu pozycjach modułów

Metoda countModules może zostać użyta, by określić ilość modułów w więcej niż jednej pozycji. Możliwe jest również wykonanie bardziej zaawansowane wyliczeń.

Argumentem funkcji countModules jest zwykle nazwa pojedynczej pozycji modułów. W takim przypadku funkcja zwraca ilość modułów znajdujących się aktualnie w tej pozycji. Można jednak wykonać proste operacje logiczne, porównawcze lub arytmetyczne na dwóch lub większej ilości pozycji modułów.

Na przykład, aby określić całkowitą ilość modułów włączonych w pozycjach user1' oraz 'user2', możesz użyć następującej funkcji:

$this->countModules( 'user1 + user2' );

Chociaż zwykłe operatory arytmetyczne (+. -. *, /) działają zgodnie z oczekiwaniem, to nie są tak przydatne, jak operatory logiczne 'and' oraz 'or'.

Na przykład, aby określić czy w pozycji 'user1' oraz w pozycji 'user2', a więc czy obie pozycje razem mają przynajmniej jeden włączony moduł, możesz użyć instrukcji:

$this->countModules( 'user1 and user2' );

Ostrożnie: Bardzo łatwo jest o pomyłkę podobną jak poniżej:

$this->countModules( 'user1' and 'user2' );

Istnieje bardzo duże prawdopodobieństwo, że bez względu na ilość modułów faktycznie włączonych w obu pozycjach zostanie zwrócona wartość FALSE, więc trzeba sprawdzić, co wpisujemy jako argument funkcji countModules. Między każdym elementem napisu musi być dokładnie jedna spacja. Na przykład, napis 'user1+user2' nie zwróci poprawnej wartości, ponieważ znak '+' musi być oddzielony odstępami. Podobnie, jeśli pozostawimy dwie spacje 'user1  +  user2', PHP wyświetli komunikat błędu [Parse error: syntax error, unexpected T_LNUMBER in... : eval()'d code on line 1], ponieważ znak '+' zostanie oddzielony więcej niż jednym znakiem odstępu (co ciekawe - w pierwszym przypadku otrzymamy tylko złudną, nieprawdziwą informację, w drugim - komunikat błędu!).

Przykład: Pozycje modułów user1 i user2 można wyświetlać w tym samym obszarze, ale obszar może nie być wyświetlony w ogóle, jeśli w żadnej z pozycji nie będzie włączonego modułu.

<?php if ($this->countModules( 'user1 or user2' )) : ?>
	<div class="rightcolumn">
		<jdoc:include type="modules" name="user1" style="xhtml" />
		<jdoc:include type="modules" name="user2" style="xhtml" />
	</div>
<?php endif; ?>


Przykład: Pozycje modułów user1 i user2 zostaną umieszczone w bocznym pasku jeden pod drugim w odrębnych ramkach, z separatorem między nimi. Ale jeśli moduł będzie włączony tylko w jednej z tych pozycji, to separator i druga ramka znajdą się w kodzie wynikowym strony niepotrzebnie. Ponadto, jeśli modułu nie będzie ani w pozycji user1, ani w pozycji user2, to polecenie jdoc:include nie zostanie wykonane.

<?php if ($this->countModules( 'user1 or user2' )) : ?>
	<div class="user1user2">
 
		<?php if ($this->countModules( 'user1' )) : ?>
			<jdoc:include type="modules" name="user1" style="xhtml" />
		<?php endif; ?>
 
		<?php if ($this->countModules( 'user1 and user2' )) : ?>
			<div class="greyline"></div>
		<?php endif; ?>
 
		<?php if ($this->countModules( 'user2' )) : ?>
			<jdoc:include type="modules" name="user2" style="xhtml" />
		<?php endif; ?>
 
	</div>
<?php endif; ?>

Zwróć uwagę, że pierwsza instrukcja countModules określa, że jeśli są jakieś moduły, to należy wykonać kolejne instrukcje. Druga instrukcja zakłada, że jeżeli są jakieś moduły w 'user1', należy je umieścić w ramce xhtml. Trzecia instrukcja z kolei ustala, że jeśli zarówno w pozycji user1, jak i w pozycji user2 są jakieś moduły włączone, należy umieścić na stronie element div (z zieloną linią rozdzielającą). Wreszcie czwarta instrukcja powoduje, że jeśli w pozycji 'user2' są włączone jakieś moduły, to zostaną wyświetlone w ramce xhtml.


Ukrywanie kolumn

Dotychczas mamy układ z trzema zawsze widocznymi kolumnami, bez względu na to, czy zawierają jakąkolwiek treść. Z perspektywy szablonu CMS to nie jest zbyt przydatne. Na stronie statycznej rozplanowanie treści nie zmienia się, natomiast w systemie zarządzania treścią, takim jak Joomla!, chcemy dać administratorom możliwość umieszczania treści gdziekolwiek chcą, bez konieczności poprawiania CSS. Administratorzy winni mieć możliwość "wyłączyć" kolumnę automatycznie albo "zwinąć" ją (ukryć), gdy nie ma w niej żadnych treści.

W historii Joomla! było kilka zmian i poprawek silnika szablonów. Cytując z blogu projektantów Joomla!: "Zmiany w systemie szablonów Joomla! 1.5 można podzielić na dwie kategorie. Pierwszą są zmiany sposobów realizacji funkcji (zadań), jakie były możliwe w Joomla! 1.0, na przykład nowe sposoby umieszczania modułów, drugą kategorią są nowo dodane właściwości, jak na przykład parametry.

Zamiast funkcji mosCountModules

Funkcja mosCountModules została zastąpiona przez funkcję $this->countModules, w której dodano obsługę warunków. Pozwala to projektantom łatwo policzyć ilość modułów w wielu pozycjach szablonu tylko za pomocą jednej linii kodu, na przykład $this->countModules('user1 + user2'); która zwraca sumę ilości modułów w pozycjach user1 i user2.

Uwaga

Więcej informacji można znaleźć na forum Joomla!. Oto pseudokod objaśniający stosowanie funkcji $this->countModules:

<?php if($this->countModules('warunek')) : ?>
   zadania do wykonania
<?php else : ?>
   lub zadania do wykonania
<?php endif; ?>

Możliwe są cztery warunki. Jako przykład policzymy ilość modułów na ilustracji 9.7. W pliku index.php możemy wstawić poniższy kod:

left=<?php echo $this->countModules('left');?>
left and right=<?php echo $this->countModules('left and right');?>
left or right=<?php echo $this->countModules('left or right');?>
left + right=<?php echo $this->countModules('left + right');?>
  • countModules('left'). Otrzymamy 4, bo w pozycji 'left są cztery moduły'.
  • countModules('left and right'). Otrzymamy 1, bo i w pozycji left i w pozycji right są moduły.
  • countModules('left or right'). Otrzymamy 1; ponieważ w pozycji left lub w pozycji right jest moduł.
  • countModules('left + right'). Otrzymamy 7, bo w pozycji left mamy 4 moduły, a w pozycji right 3, a więc razem 7.

W tej sytuacji potrzebujemy skorzystać z funkcji, która pozwala nam policzyć moduły znajdujące się w jakimś miejscu. Tak na przykład jeśli żadnej treści nie ma w prawej kolumnie, możemy dostosować wielkość kolumny centralnej, by wypełnić zwolnioną przestrzeń.

Jest kilka sposobów, aby to zrobić. Możemy w części body użyć instrukcji warunkowej, by nie wyświetlać kolumny, a następnie zastosować różne style, zależnie od ilości kolumn. Aby to zrobić najprościej, jak to możliwe, zamieszczamy serię instrukcji warunkowych w części body oraz definiujemy style w arkuszu CSS.

<?php
$contentwidth = "100";
if($this->countModules('left or right') == 1) $contentwidth = "80";
if($this->countModules('left and right') == 1) $contentwidth = "60";
?>

Tak więc, zliczamy:

  • Domyślnie mamy 100% szerokości.
  • Jeśli mamy coś w lewej kolumnie albo coś w prawej kolumnie, ustalamy dla centralnej kolumny 80% szerokości.
  • Jeśli mamy coś i w lewej kolumnie, i w prawej kolumnie, ustalamy dla centralnej kolumny 60% szerokości.

W pliku index.php musimy wprowadzić odpowiednią poprawkę dla elementu div zawierającego treść główną:

<div id="content<?php echo $contentwidth; ?>">

W pliku css zmieniamy style określające rozplanowanie na:

#content60 {float:left;width:60%;overflow:hidden;}
#content80 {float:left;width:80%;overflow:hidden;}
#content100 {float:left;width:100%;overflow:hidden;}

Instrukcje warunkowe PHP muszą znajdować się za linią z łączem do pliku template.css. Wynika to z zasady, że jeśli mamy dwie lub więcej identycznych reguły CSS, to ostatnia nadpisuje wszystkie poprzednie.

Można również importować plik z dodatkowym CSS.

Wskazówka

Kiedy testujesz swoje instrukcje warunkowe, możesz dodać do kodu w pliku index.php linię wyświetlająca szerokość:

Kolumna "content" zajmuje <?php echo $contentwidth; ?>% szerokości.

Ukrywanie kodu modułu

Dobrą praktyką w projektowaniu układów z ukrywanymi kolumnami jest zapobieganie generowaniu przez Joomla! kodu ramek otaczających moduły w przypadku, gdy w pozycji modułu nie zostanie umieszczony żaden moduł. Jeśli tego nie uczynimy, w kodzie źródłowym pojawią się puste elementy <div> albo oznakowanie tabel, zależnie od stylu ramki, jaka miałaby otaczać moduł.

Aby ukryć pusty element <div>, używamy następującej instrukcji:

  <?php if($this->countModules('left')) : ?>
  <div id="sidebar">
    <div class="inside">
      <jdoc:include type="modules" name="left" style="xhtml" />
    </div>
  </div>
  <?php endif; ?>

Zastosowanie tego kodu spowoduje, że jeśli w pozycji left nie zostanie opublikowany żaden moduł Joomla nie wygeneruje również kodu ramki xhml

Jeśli zastosujemy tę technikę dla lewej i prawej kolumny, nasz plik index.php będzie wyglądać jak poniżej. Włączyliśmy jeszcze moduł Ścieżka powrotu (breadcrumbs). Zwróć uwagę, że w Joomla 1.5 ścieżkę powrotu również włączamy inaczej - właśnie jako moduł.

<?php // no direct access defined( '_JEXEC' ) or die( 'Restricted access' ); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" >
<head>
<jdoc:include type="head" />
<link rel="stylesheet" href="templates/system/css/system.css" type="text/css" />
<link rel="stylesheet" href="templates/system/css/general.css" type="text/css" />
<link rel="stylesheet" href="templates/<?php echo $this->template ?>/css/template.css" type="text/css" />
<?php
$contentwidth = "100";
if($this->countModules('left or right') == 1) $contentwidth = "80";
if($this->countModules('left and right') == 1) $contentwidth = "60";
?>
</head>
<body>
<div id="wrap">
  <div id="header">     <div class="inside">         <h1><?php echo $mainframe->getCfg('sitename');?></h1>
      <jdoc:include type="modules" name="top" style="xhtml" />     </div>
  </div>
  <?php if($this->countModules('left')) : ?>
  <div id="sidebar">     <div class="inside">
      <jdoc:include type="modules" name="left" style="xhtml" />     </div>
  </div>
  <?php endif; ?>
<div id="content<?php echo $contentwidth; ?>">     <div class="inside">
      <jdoc:include type="module" name="breadcrumbs" style="none" />
      <jdoc:include type="component" />     </div>
  </div>
<?php if($this->countModules('right')) : ?>
  <div id="sidebar-2">     <div class="inside">
      <jdoc:include type="modules" name="right" style="xhtml" />     </div>
  </div>
  <?php endif; ?>
  <?php if($this->countModules('footer')) : ?>
  <div id="footer">     <div class="inside">
      <jdoc:include type="modules" name="footer" style="xhtml" />     </div>
  </div>
  <?php endif; ?>
<!--end of wrap-->
</body>
</html>

Co jeszcze warto wiedzieć

Takie elementy jak kolumny lub pozycje modułów mogą być ukrywane (lub składane), kiedy nie ma w nich żadnej zawartości. Osiągamy ten cel za pomocą instrukcji warunkowych PHP i połączeniu z odpowiednimi stylami CSS.

Polecałbym nieznacznie zmodyfikowany sposób generowania stopki. W sposobie podanym tutaj korzystamy ze sztywnego wpisu w pliku index.php, co utrudnia wprowadzanie zmian. Aktualnie moduł "footer" wyświetla prawa własności Joomla w panelu administracyjnym i nie jest łatwy w modyfikacji. Wygodniejszym rozwiązaniem jest umieszczenie w miejscu stopki zwykłego modułu (X)HTML, który administrator mógłby łatwo modyfikować. Jeśli chciałbyś stworzyć swoją własną stopkę, możesz zakończyć publikację tego modułu i stworzyć własny moduł HTML w wybranym języku (???? projektowania).

W tym przypadku zastąpilibyśmy

<jdoc:include type="modules" name="footer" style="xhtml" /> 

na

<jdoc:include type="modules" name="bottom" style="xhtml" />

Musisz pamiętać aby dodać pozycję bottom do pliku templateDetails.xml.

Porada

Jako nazw pozycji modułów projektanci szablonów używają różnych znaczących słów: banner, left, right, user1, footer i tak dalej. Ważne, by uzmysłowić sobie, że nazwy te nie odpowiadają jakiemuś konkretnemu miejscu. Rozplanowanie pozycji modułów, jak widzieliśmy, jest kontrolowane przez projektanta szablonu. Przyjęło się, żeby nazwy wskazywały na miejsce, w którym pozycja została umieszczona, ale nie jest to wymagane.


Tworzenie zaokrąglonych narożników

wymaga przeglądu!!!!!!

Tworzenie zaokrąglonych narożników

Wprowadzenie

Stosując (X)HTML i CSS, łatwo umieścić prostokątne obramowanie wokół jakiejś części strony. Zwykle dokonujemy tego, umieszczając kod tej części strony w znacznikach <div>...</div> (lub podobnych), a w kodzie CSS ustalamy reguły dla własności border.

Niestety, niemożliwe jest stworzenie tylko za pomocą (X)HTML i CSS nieprostokątnej ramki. (Nieprostokątnym ramkom odpowiada w tym podręczniku termin zaokrąglone rogi [rounded corners]), po prostu dlatego, że to najpowszechniej spotykane rozwiązanie. Jednakże narożniki nie muszą być zaokrąglone, technikę tę można wykorzystać dla stworzenia przeróżnych kształtów i stylów obramowania.

Aby pokonać ograniczenia właściwości obramowania, możemy skorzystać z jednego lub większej ilości obrazków do nadania ramce kształtu (wyglądu). Jest to bardzo łatwe, gdy znasz rozmiar elementu <div> - po prostu tworzysz obrazek odpowiedniej wielkości, z takimi narożnikami, jakich potrzebujesz, i umieszczasz go jako to elementu <div>. Częściej jednak mamy do czynienia ze zmieniającymi swoje rozmiary elementami strony (szerokość, wysokość albo obie wartości). Dotyczy to szczególnie projektantów szablonów stosowanych w CMS takich jak Joomla!, w których nie wiemy, jaka treść zostanie umieszczona na stronie, a tym samym nie znamy i nie jesteśmy w stanie przewidzieć rozmiarów takich elementów. W tym poradniku skupimy się głównie na tworzeniu zaokrąglonych narożników określanych jako "płynne' ('fluid'), elastyczne, to jest takie, które zmieniają swoją wielkość, i mogą pomieścić różną zawartość.

Teoria

Żeby uniknąć opisywanych powyżej problemów, użyjemy odrębnych obrazków dla każdego z czterech rogów naszego niekanciastego pudełka. Aby zapewnić ciągłość obramowania, obrazki te muszą być wystarczająco duże, by wypełnić nasz pojemnik w maksymalnej możliwej wielkości. Aby mieć pewność, że pudełko będzie zawsze miało odpowiednią wielkość, układamy obrazki na czterech warstwach, przykrywajacych się wzajemnie, tworząc iluzję, że obramowanie naszego pudełka jest jednolite.

Animacja. Zaokrąglone narożniki
Proces jest zilustrowany przez animację pokazaną po prawej stronie. W każdej kolejnej scenie obrazek jest umieszczony na poprzednim.
  1. Po pierwsze, duży obrazek z lewą krawędzią, lewym górnym narożnikiem i górną krawędzią umieszczamy w górnym lewym narożniku naszego pojemnika <div> (na rysunku naszkicowany czerwonym kolorem dla przejrzystości). Obrazek jest większy niż potrzeba dla tego pojemnika, rozciąga się poza jego dolną i prawą granice, tak jak to jest uwidocznione na ilustracji za pomocą przezroczystości, ale co - oczywiście - nie jest widoczne w praktyce.
  2. Następnie wąski poziomy obrazek z dolną krawędzią i dolnym lewym narożnikiem umieszczamy na dole pojemnika <div>, nad pierwszym obrazkiem. Na ilustracji obrazek został wyróżniony ciemniejszą różową barwą. Znów można zauważyć, że obrazek rozciąga się poza prawą krawędź pojemnika.
  3. Po trzecie, wąski pionowy obrazek z prawą krawędzią oraz prawym górnym rogiem został umieszczony w prawy rogu pojemnika, nad drugim obrazkiem.
  4. Na koniec kwadratowy obrazek zawierający jedynie prawy dolny narożnik został umieszczony w prawym dolnym rogu pojemnika.

Przejdźmy do praktyki - tworzenie obrazków

Aby stworzyć potrzebne obrazki, użyjemy otwartego programu do grafiki wektorowej Inkscape. W przeciwieństwie do edytorów grafiki rastrowej (jak GIMP), które zajmują się indywidualnymi pikselami (punktami), programy wektorowe operują kształtami geometrycznymi. To czyni łatwym stworzenie kształtu z zaokrąglonymi rogami, dokładnie takimi, jak chcemy.

Skorzystamy z Inkscape, aby stworzyć prostokąt z zaokrąglonymi rogami, z różowym pierwszym planem oraz białym tłem i cieniem rzucanym w prawym dolnym rogu. To ten sam kształt, który pokazany jest na animacji powyżej.


  1. Tworzenie nowego obrazka w Inkscape
    Aby rozpocząć, musimy zdecydować się na jakiś maksymalny rozmiar naszego pudełka. Rozmiar ten wyznaczy wielkość obrazka. Im większy obraz, tym większy będzie plik, i tym wolniej będzie wczytywana strona internetowa. Nie ma więc najmniejszego powodu, by tworzyć obraz większy niż trzeba. Dla celów naszego przykładu użyjemy rozmiaru maksymalnego szerokości 800px oraz wysokości 600px. Dlatego tworzymy w Inkscape nowy dokument z takimi wymiarami. Aby ustalić wymiary dokumentu wybierz z menu opcje Plik - > Właściwości dokumentu [File > Document properties] i wpisz w oknie dialogowym poprawne wartości. Zmień również nazwą domyślną warstwy (przejdź do Warstwy > Zmień nazwę warstwy [Layer > Rename layer...] na "Zaokrąglony prostokąt".
  2. Rysowanie prostokąta z zaokrąglonymi narożami
    Zostawimy 5px marginesu wokół obrazka. Dodatkowo będziemy nam potrzebne 5px szerokości na cień za prawą i dolną krawędzią zaokrąglonego prostokąta. Dlatego rysujemy prostokąt z zaokrąglonymi narożami szeroki na 785px i wysoki na 585px. Dla naroży ustalimy 5px promienia. Aby to zrobić, wybieramy z przybornika po lewej stronie narzędzie Prostokąt, naciśnij lewy przycisk myszy i przeciągając po skosie obszaru roboczego narysuj prostokąt. Wielkość rysowanego prostokąta nie ma znaczenia. Następnie przejdź do górnego paska narzędzi i wpisz w polach tekstowych wymiary: Szer: 783.00px, Wys: 583.00px, Rx: 5.000px, Ry: 5.000px. Skąd różnica w wielkościach. Te wymiary nie obejmują obramowania. Gdy dodamy obramowanie grubości 1px szerokość i wysokość zwiększy się o 2 px.
  3. Ustalenie koloru wypełnienia
    Ustalenie szerokości obramowania
    Następnie musimy ustalić grubość obramowania i ustalić kolor naszego prostokąta. Zaznacz prostokąt, jeśli nie jest zaznaczony. Wybierz z menu polecenie Obiekt > Wypełnienie i kontur [Object > Fill and Stroke] albo naciśnij klawisze Shift + Ctrl + F, aby wywołać okno dialogowe Wypełnienie i kontur [Fill and Stroke]. Na karcie Wypełnienie [Fill] wybierz kolor tła. Będziemy używali szesnastkowego koloru #ffd7eb, więc w polu tekstowym RGBA wpisz 'ffd7ebff' (końcowa wartość ff ustawia stopień przezroczystości alfa - w naszym przypadku nieprzezroczyste). Na karcie Kontur [Stroke paint] ustalimy kolor obramowania. W naszym przypadku chcemy czarne nieprzezroczyste krawędzie, więc wpiszmy w polu tekstowym RGBA '000000ff'. Na karcie Styl konturu ustalimy grubość krawędzi - wpisz w polu Szerokość 2px.
  4. Ustalenie położenia prostokąta
    W kolejnym kroku korygujemy położenie naszego prostokąta. Miarka Inkscape umieszcza prostokąt w dolnym lewym roku, zatem musimy ustalić jego współrzędne na x = 5 i y = 10. Wybierz z przybornika po lewej stronie narzędzie Wskaźnik, kliknij gdziekolwiek na prostokąt, a następnie w polach tekstowych pod górnym paskiem narzędziowym wpisz odpowiednie wartości.
  5. Ukrycie aktywnej warstwy
    Stworzenie nowej warstwy
    Następnie potrzebujemy stworzyć nową warstwę, na której znajdzie się cień rzucany przez prostokąt. Najpierw ukryjemy bieżącą warstwę ("Zaokrąglony prostokąt"), klikając na ikonę oka na dolnej krawędzi obszaru roboczego (Przełącz widzialność aktywnej warstwy). Następnie wybierz z górnego menu opcję Warstwa > Nowa warstwa [Layer > Add Layer...] i utwórz nową warstwę nazwaną "Cień" poniżej aktywnej warstwy. Teraz możemy stworzyć na tej warstwie nowy zaokrąglony prostokąt. Stwórz go, nadając mu 785px szerokości, 585px wysokości, z promieniami naroży wielkości 5px. Ustal współrzędne x = 10 i y = 5. W oknie dialogowym Wypełnienie i kontur ustal kolor wypełnienia w polu RGBA na '00000081' oraz rozmycie na '0,6'. Na karcie Kontur zaznacz ikonę Brak koloru [no paint]. W wyniku tych ustawień otrzymamy szary prostokąt z zaokrąglonymi narożami, częściowo przezroczystymi i nieznacznie rozmazanymi brzegami.
  6. Skończony obrazek!
    Na końcu odkryj warstwę "Zaokrąglony prostokąt", wybierając ją z listy rozwijanej na dole ekranu i klikając lewym przyciskiem ikonę oczka (Przełącz widzialność aktywnej warstwy). Gratulacje - możesz zobaczyć, jak wygląda twoje zaokrąglone pudełko. Możesz zapisać w tym momencie swój obraz w formacie Inkscape jako plik .svg, aby go później łatwo modyfikować.
  7. Teraz musimy stworzyć potrzebne nam cztery odrębne obrazki i zapisać je w formacie sieciowym. W Inkscape jest to bardzo łatwe - po prostu wybierz w menu pozycję Plik > Eksportuj jako bitmapę [File > Export Bitmap...] i naciśnij w oknie dialogowym przycisk Rozmiar użytkownika [Custom]. Możemy wyeksportować stosowne części naszego obrazka przez wprowadzenie współrzędnych w polach x0/y0 oraz x1/y1. Pamiętaj, że wszystkie współrzędne są mierzone od lewego dolnego narożnika dokumentu. Najlepszym miejscem do przecięcia obrazka są linie tuż przed krzywą zaokrąglonych naroży na dolnym i prawym brzegu. Przykładowo, by stworzyć:
    • duży górny obrazek z lewym narożnikiem i górną krawędzią, wpisz x0=0, y0=15, x1=785, y1=600.
    • wąski poziomy obrazek z dolną krawędzią i dolnym lewym narożnikiem, wpisz x0=0, y0=0, x1=785, y1=15
    • wąski pionowy obrazek z prawą krawędzią oraz prawym górnym rogiem, wpisz x0=785, y0=0, x1=800, y1=600
    • kwadratowy obrazek zawierający prawy dolny narożnik, wpisz x0=785, y0=0, x1=800, y1=15

Przejdźmy do praktyki - Edycja twojego szablonu

Aby zaimplementować zaokrąglone naroża w module, skorzystamy z ramki modułu 'rounded', włączając go do instrukcji <jdoc />:

<jdoc:include type="modules" name="POSITION" style="rounded" />

W efekcie tej instrukcji w dokumencie HTML strony otrzymamy następujący kod:

<div class="module_menu">
  <div>
    <div>
      <div>
        <h3>Menu witryny</h3>
        <ul class="menu">
          <li><!-- różne pozycje menu --></li>
        </ul>
      </div>
    </div>
  </div>
</div>

Cztery zagnieżdżone elementy <div> tworzą warstwy potrzebne dla naszych czterech obrazków. Możemy użyć nazwy klasy zewnętrznego elementu <div>, aby zagwarantować, że zajmujemy się właściwym elementem <div>, a następnie skorzystać z selektorów kontekstowych, by umieścić na każdej warstwie odpowiedni obraz.

Najlepiej uczynić to korzystając z zewnętrznego arkusza stylów, w którym umieszc zamy poniższe reguły:

div.module_menu {
  background: url(../images/rounded_topleft.png) 0 0 no-repeat;
  padding: 0;
}
 
div.module_menu div {
  background: url(../images/rounded_bottomleft.png) 0 100% no-repeat;
  margin: 0;
  border: 0;
}
 
div.module_menu div div{
  background: url(../images/rounded_topright.png) 100% 0 no-repeat;
}
 
div.module_menu div div div {
  background: url(../images/rounded_bottomright.png) 100% 100% no-repeat;
}

Dopełnienie, marginesy i obramowanie są niezbędne, by zapewnić, że każdy element <div> dokładnie wypełnia powyższe. URL obrazka jest określone odpowiednio do położenia pliku css.

Jest tylko drobniejszy problem, by być świadomy z (There is just one more slight problem to be aware of): CSS rules are not exhausted, they are only overridden. W efekcie, jeśli treść modułu zawierać będzie element <div>, to powyższe reguły odnosić się będą również do tego elementu <div> (ponieważ znajduje się on wewnątrz elementu <div> wewnątrz elementu <div class="module_menu"> - bez względu na fakt there was an intervening <div>). Aby rozwiązać ten problem, potrzebujemy bardziej szczegółowej reguły:

div.module_menu div div div div{
  background: none;
}

I to jest to - radość kodowania!

Zobacz też

Roger Johannson: Zaokrąglone rogi z wykorzystaniem JavaScript


Co to jest ramka modułu?

Co to jest ramka modułu?

Ramki modułów [Module chrome] zapewniają projektantom pewien wpływ na wynikowy kod modułów wyświetlanych w ich szablonach. Zasadniczo, ramka składa się z niewielkiej ilości predefiniowanego kodu HTML, w którym osadzana jest treść generowana przez moduł i który może być stylizowany za pomocą CSS. Ramka modułu jest zwykle wykorzystywana do otaczania modułów obramowaniem, szczególnie z zaokrąglonymi rogami, ale możliwości wykorzystania ramek modułu są większe.


Ramka modułu jest ustalana przez atrybut 'style' umieszczony w instrukcji wywołującej moduł. Na przykład, następująca instrukcja umieszczona w pliku index.php szablonu wstawia moduły do pozycji 'user1' i ustala modułowi ramkę 'wlasna':

<jdoc:include type="modules" name="user1" style="wlasna" />

Można sprawdzić, że ta sama ramka modułu odnosi się do wszystkich modułów w jednej pozycji. Inaczej mówiąc - jeśli chcesz mieć dwa moduły w kolumnie, a równocześnie chcesz, aby różniły się ramką, musisz je umieścić w dwóch różnych pozycjach (np. 'user1' i 'user2').

Standardowy pakiet instalacyjny Joomla! 1.5 zawiera sześć domyślnych stylów ramek modułu. Ale elastyczność systemu szablonów powoduje, że nie jesteś ograniczony do tych sześciu stylów - łatwo możesz stworzyć więcej nowych stylów, jakie chcesz.

Zestawienie standardowych ramek modułu w Joomla! 1.5
Styl Wyjście (wynik) Wygląd
rounded (-3)
(domyślny dla menu w milkyway)
<div class="module_menu">
  <div>
    <div>
      <div>
        <h3>Menu witryny</h3>
        <ul class="menu">
          <li><!-- różne pozycje menu --></li>
        </ul>
      </div>
    </div>
  </div>
</div>

Module chrome rounded.png

none (-1)
<ul class="menu">
  <li><!-- różne pozycje menu --></li>
</ul>

Module chrome none.png

table (0)
<table cellpadding="0" cellspacing="0" class="moduletable_menu">
  <tr>
    <th valign="top">Menu witryny</th>
  </tr>
  <tr>
    <td>
      <ul class="menu">
        <li><!-- różne pozycje menu --></li>
      </ul>
    </td>
  </tr>
</table>

Module chrome table.png

horz (1)
<table cellspacing="1" cellpadding="0" border="0" width="100%">
  <tr>
    <td valign="top">
      <table cellpadding="0" cellspacing="0" class="moduletable_menu">
        <tr>
          <th valign="top">Menu witryny</th>
        </tr>
        <tr>
          <td>
            <ul class="menu">
              <li><!-- różne pozycje menu --></li>
            </ul>
          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>

Module chrome horz.png

xhtml (-2)
<div class="moduletable_menu">
  <h3>Menu witryny</h3>
  <ul class="menu">
    <li><!-- różne pozycje menu --></li>
  </ul>
</div>

Module chrome xhtml.png

outline
<div class="mod-preview">
  <div class="mod-preview-info">left[outline]</div>
  <div class="mod-preview-wrapper">
    <ul class="menu">
      <li><!-- różne pozycje menu --></li>
    </ul>
  </div>
</div>

Module chrome outline.png

Zauważ, że ramka modułu nie zmienia wszystkich szczegółów wyglądu - ten zależy od CSS zastosowanych w szablonie. Na przykład ramki 'none' oraz 'horz' wyglądają bardzo podobnie, chociaż wyświetlający je wynikowy kod HTML jest zupełnie inny.

Własna ramka modułu

Stosowanie własnych ramek modułu

Aby zdefiniować własną ramkę modułu w swoim szablonie, musisz w katalogu swojego szablonu stworzyć plik nazwany modules.php. Na przykład może to być sciezka_do_Joomla/templates/nazwa_szablonu/html/modules.php.

W pliku tym definiujesz funkcję nazwaną modChrome_STYLE, gdzie 'STYLE' to nazwa twojej własnej ramki modułu. Funkcja będzie posiadać trzy argumenty $module, &$params, oraz &$attribs, jak widać:

<?php 
  function modChrome_STYLE( $module, &$params, &$attribs ) 
  {
    /* tutaj kod PHP generujący  wynikowy kod HTML modułu*/
  }
?>

Wewnątrz tej funkcji można zastosować każdą z dostępnych własności modułów (np. pola z tabeli jos_modules w bazie danych Joomla! na twoim serwerze) dla tego modułu, ale przede wszystkim będziesz potrzebować $module->content, $module->showtitle oraz $module->title. $module->showtitle jest zmienną typu Boolean, tak więc może być ustawiona true (gdy tytuł modułu będzie wyświetlany) albo false (kiedy nie będzie wyświetlany), $module->content oraz $module->title zwrócą główną treść modułu i odpowiednio tytuł modułu.

Ta funkcja jest zwykłą funkcją PHP i korzystamy w niej ze zwykłego kodu PHP. Jeden elementarny przykład może użyć instrukcji if do sprawdzenia wartości $module->showtitle oraz umieszczenie bądź nie - zależnie od wyniku - tytułu

<?php
  if ($module->showtitle) 
  {
    echo '<h2>' .$module->title .'</h2>';
  }
?>

Dostęp do parametrów modułu uzyskiwany jest za pomocą obiektu $params. Na przykład, możliwe jest, aby przypisać Przyrostek klas modułu w edytorze własności modułu na zapleczu Twojej witryny Joomla!; to wartość ta jest przechowywana w parametrach modułu jako moduleclass_sfx. Aby stworzyć <div> z klasą określoną przez przyrostek klasy modułu, możesz użyć:

<div class="<?php echo $params->get( 'moduleclass_sfx' ); ?>">
  <!-- div contents -->
</div>


CSS standardowych ramek modułu

Wynikowy kod modułów może być modyfikowany (rozszerzany) przez dodanie w instrukcji <jdoc:include /> atrybutu stylu, style="nazwa_stylu", gdzie nazwa_stylu odpowiada nazwie ramki, z jakiej chcemy skorzystać.

Jeśli chcesz uzyskać więcej informacji, zobacz Instrukcje jdoc oraz Co to jest ramka modułu?

Typy ramek

  • None
Umieszcza czysty kod modułu - bez elementów pozycjonujących.
Styl domyślny, gdy instrukcja <jdoc:include /> nie zawiera atrybutu style
Nie ma żadnych stylów CSS.
Tytuł modułu, bez względu na ustawienie w edytorze modułu, nie jest umieszczany w kodzie wynikowym.
  • Table
Umieszcza moduły w jednokolumnowej tabeli, w układzie pionowym, jeden pod drugim, w kolejnych wierszach tabelki.
Element <table> został oznaczony klasą .moduletable, nie ma określenia szerokości elementu <table>.
Tytuł modułu jest osadzony w znacznikach <th>, jeśli jest włączony w edytorze modułu.
  • Horz
Umieszcza każdy moduł w tabeli wewnątrz tabeli dla wszystkich modułów w pozycji.
Klasa .moduletable została przypisana do elementu <table>, obejmującego treść pojedynczego modułu
Kod wynikowy jest taki sam, jak w profilu "Table", ale umieszczony jest w tabeli obejmującej z szerokością ustaloną na 100%.
  • XHTML
Obejmuje treść modułu znacznikami <div> i </div>.
.moduletable zastosowana jest dla <div>, który obejmuje treść modułu.
Tytuł modułu jest objęty znacznikiem <h3>, jeśli jest włączony.
  • Rounded
klasa .module zastosowana jest dla zewnętrznego elementu <div>.
Treść modułu jest osadzona w czterech elementach (warstwach) <div>, umożliwiających obsługę zaokrąglonych narożników.
Tytuł modułu jest objęty znacznikiem <h3>, jeśli jest włączony.
  • Outline
Umieszcza moduł w obramowaniu.
Służy tylko do prezentacji pozycji modułów
Klasa .mod-preview zastosowana jest dla zewnętrznego elementu <div>.
Klasa .mod-preview-info
Klasa .mod-preview-wrapper zastosowana jest dla wewnętrznego elementu <div>, który obejmuje treść modułu

Zobacz


Dziękujemy za wkład

» Stefan Wajda [zwiastun],