--=REKLAMA=--

Szablony - zaawansowana problematyka

Z Joomla!WikiPL

(Przekierowano z Poradnik:Szablony - zaawansowana problematyka)
Ikona przetlumacz.png
 Uwaga o zawartości

Ta strona wymaga przetłumaczenia lub jest w trakcie tłumaczenia! Pomoc jest mile widziana. Ostatnio edytowane przez Zwiastun (dyskusja. Data edycji: Wed, 15 Apr 2009 12:32:34 +0000

How are templates executed?

Templates are executed in a 2-phase process that makes full use of the PHP parser to provide considerable flexibility and performance to the template designer. Templates are executed in the context of the document object so that the $this object is always the instantiation of the JDocument class.

Before template execution begins, the component and modules will have been executed and their output buffered for later use.

Template execution then proceeds as follows:-

  • template parameters (if any) are loaded
  • template language (if any) is loaded
  • if legacy mode is on then the configuration variables are copied as globals
  • the template file (index.php) is loaded and executed (by PHP). The output is buffered. This is phase 1 of the 2-phase process. Everything between <?php and ?> tags is executed as PHP code. Everything outside of these tags is output but otherwise ignored. As the output is being buffered, nothing is sent to the client web browser at this stage.
  • a favicon.ico file is looked for, first in the Joomla! root directory, then in the template root directory. The latter will override the former if found.
  • the output that was buffered in phase 1 is now parsed for <jdoc:include> elements. For each jdoc element found, the appropriate renderer class is loaded and its render method is called. The output from the render method replaces the <jdoc:include> element itself in the output buffer.
  • Certain template-specific HTTP headers are added to the list of headers to be output.
  • Control is then passed back to the JApplication object which will handle the rest of the process of getting the now rendered web page back to the client web browser.


Strony błędów systemowych

Gdy Joomla! wyświetla komunikaty błędów, używa specjalnych szablonów. Szablony te umieszczone są w katalogu .../templates/system/. Ich nazwy pochodzą od kodu błędu. Dostępne są poniższe szablony:

  • templates/system/403.php (Status code: 403 Forbidden)
  • templates/system/404.php (Status code: 404 Not Found)
  • templates/system/500.php (Status code: 500 Internal Server Error)

Dodatkowo dostępne są również strony:

  • templates/system/offline.php stosowany do przetwarzania komunikatu "Witryna jest wyłączona".
  • templates/system/component.php (stosowane do wyświetlania treści w oknach wyskakujących - Powiadom znajomego, Drukuj) <- to nie są strony błędów!

Uwaga: Na tych stronach elementy jdoc:include nie są przetwarzane.

Kody stanu zdefiniowane są jako część protokołu HTTM w RFC2616. Więcej informacji znajdziesz na stronie http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Na stronach błędów stosowane są poniższe klasy CSS:

  • errorboxheader
  • errorboxbody
  • techinfo


© Ten materiał jest dokładnym albo swobodnym tłumaczeniem artykułu http://docs.joomla.org/System_error_pages udostępnionego na licencji JEDL na witrynie: Joomla! Official Documentation Wiki


Gdy podasz niepoprawny adres internetowy

Gdy wpiszesz w przeglądarce internetowej błędny adres, możesz spotkać się z jedną z trzech sytuacji:

  • komunikatem przeglądarki, że Nie odnaleziono serwera, gdy podasz adres, którego nie ma w systemie nazw domenowych (DNS)
  • komunikatem przeglądarki, że Nie znaleziono strony (Not found), gdy podasz poprawny adres serwera i niepoprawny adres pliku, a serwer nie obsługuje błędu 404
  • wyświetleniem strony dopracowanej pod względem estetycznym z komunikatem, że żądana strona nie istnieje, w przypadku, gdy serwer obsługuje błąd 404.

Własne strony błędów

Joomla! używa pliku templates/system/error.php do obsługi kilku błędów protokołu HTTP, w tym:

  • 403 - dostęp zabroniony ["403 Forbidden"],
  • 404 - strony nie znaleziono ["404 Not Found"], oraz
  • 500 - wewnętrzny błąd serwera ["500 Internal Server"]

Jeśli chcesz, możesz je wystylizować stosownie do swoich potrzeb.

Ważne, aby zrozumieć, że plik error.php jest plikiem niezależnym od Joomla!, a to oznacza, że na stronach generowanych przez ten plik nie działają dodatki, że nie można włączać do tego pliku modułów, ani też używać dyrektywy <jdoc:include>.

Zastąpienie systemowego pliku błędów

Aby zastąpić systemowe strony błędów, skopiuj plik templates/system/error.php do katalogu templates/<nazwa_twojego_szablonu>

Gdy Joomla! znajdzie plik w katalogu stosowanego szablonu, użyje go zamiast pliku systemowego.

Możesz sformatować tę stronę tak jak chcesz, dopasowując ją do swojego szablonu.

Zastąpienie stylizacji systemowej

Jeśli chcesz zmienić formatowanie strony błędu, skopiuj plik templates/system/css/error.css do katalogu templates/<nazwa_twojego_szablonu>/css.

Następnie uaktualnij ścieżkę do pliku templates/<template-name>/error.php, modyfikując odpowiednio następującą linię:

<link rel="stylesheet" href="<?php echo $this->baseurl; ?>/templates/system/css/error.css" type="text/css" />

Potem po prostu ustal definicje stylów w pliku error.css, tak, jak chcesz.

Dostosowanie komunikatów o błędach

Możesz zastosować warunek logiczny, powodując reakcję zależną od określonego kodu błędu.

Poniżej znajduje się przykład wyświetlenia komunikatu w przypadku błędu 404:

<?php if ($this->error->code = '404') { ?>
	<div id="errorboxheader">Strona nie istnieje</div>
		<div id="errorboxbody"><p>Przykro nam! Taka strona nie istnieje.</p>
		</div>
	</div>
<?php } ?>

Kod stanu HTTP

Gdy do serwera zostanie wysłane żądanie odesłania strony Twojej witryny, serwer wysyła do przeglądarki odpowiedź zawierającą kod stanu HTTP – informację o rezultacie przetwarzania.

Jednym z problemów Joomla! jest zwracanie strony opatrzonej nagłówkiem poprawnej odpowiedzi – 200 Serwer pomyślnie przetworzył żądanie [200 – the server successfully returned the page] zamist strony błędu 404. Może to powodować problemy z wyszukiwarkami, ponieważ strony, które fizycznie nie istnieją, można znaleźć w wynikach wyszukiwania. Zwykle, gdy strona nie istnieje, oczekiwany jest komunikat błędu 404. Jeśli chcesz, aby Joomla! zwracał kod błędu 404, zmodyfikuj standardowe zachowanie Joomla!. Wystarczy w głównym pliku szablonu przed deklaracją <!DOCTYPE> wstawić poniższy kod:

<?php 
if ($this->error->code = '404') {
	header("HTTP/1.0 404 Not Found");
} ?>

Korzystanie z nagłówka i stopki szablonu na standardowych stronach błędu

Jeśli chcesz zobaczyć stronę błędu w układzie szablonu bez przekierowywania do adresu URL strony błędu albo powielania kodu HTML w szablonie strony błedu, skorzystaj z poniższego sposobu. Najpierw umieść następujący kod w pliku templates/<template-name>/error.php:

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
 
include dirname(__FILE__) . "/index.php";
?>

Następnie dokonaj poprawek w templates/<nazwa-szablonu>/index.php:: 1. Znajdź w index.php następujący kod:

<jdoc:include type="head" />

i wymień go na poniższy:

<?php if (!$this->error->code) : ?>
<jdoc:include type="head" />
<?php else : ?> 
<title><?php echo $this->error->code ?> - <?php echo $this->title; ?></title>
<?php endif; ?>

2. Znajdź w index.php następujący kod:

<jdoc:include type="component" />

i wymień go na poniższy:

<?php if ($this->error->code) : /* sprawdz, czy to jest strona bledu, jesli tak, wyswietl komunikat bledu */ ?>
<p><strong><?php echo $this->error->code ?> - <?php echo $this->error->message ?></strong></p>
 
<p><strong><?php echo JText::_('You may not be able to visit this page because of:'); ?></strong></p>
<ol>
<li><?php echo JText::_('An out-of-date bookmark/favourite'); ?></li>
<li><?php echo JText::_('A search engine that has an out-of-date listing for this site'); ?></li>
<li><?php echo JText::_('A mis-typed address'); ?></li>
<li><?php echo JText::_('You have no access to this page'); ?></li>
<li><?php echo JText::_('The requested resource was not found'); ?></li>
<li><?php echo JText::_('An error has occurred while processing your request.'); ?></li>
</ol>
<p><strong><?php echo JText::_('Please try one of the following pages:'); ?></strong></p>
<ul>
<li><a href="<?php echo $this->baseurl; ?>/index.php" title="<?php echo JText::_('Go to the home page'); ?>"><?php echo JText::_('Home Page'); ?></a></li>
</ul>
<p><?php echo JText::_('If difficulties persist, please contact the system administrator of this site.'); ?></p>  
<?php else : ?>  
<jdoc:include type="component" />
<?php endif; ?>

Teraz szablon strony będzie zastosowany również do stron błędów. Uwaga: Moduły zawarte w szablonie nie będą widoczne na stronach błędów wygenerowanych tą metodą (ale będą działać na innych stronach).

Zobacz też

Więcej informacji o kodach stanów HTTP:

© Ten materiał jest dokładnym albo swobodnym tłumaczeniem artykułu http://docs.joomla.org/Custom_error_pages Custom error pages udostępnionego na licencji JEDL na witrynie: Joomla! Official Documentation Wiki


Dodawanie kodu JavaScript

Aby do dokumentu dodać kod JavaScript, trzeba najpierw pozyskać obiekt dokumentu. Aby tego dokonać, należy użyć poniższego kodu:

$dokument =& JFactory::getDocument();

a następnie wykonać metodę JDocument::addScript().

Na przykład:

Aby korzystać z biblioteki javascript /media/system/js/przyklad.js w swoim szablonie lub innym miejscu, należy napisać:

<?php
$dokument = &JFactory::getDocument();
$dokument->addScript( 'media/system/js/przyklad.js' );
?>

Jeśli skrypt dodajemy w pliku index.php szablonu, tzn np. /templates/nasz_szablon/index.php, możemy napisać po prostu:

<?php
$this->addScript( 'media/system/js/przyklad.js' );
?>

Objaśnienie

Dzięki zastosowaniu powyższego kodu, w wynikowej stronie HTML między znacznikami <head> ... </head> zostanie umieszczony znacznik <script> wskazujący dokument z kodem JavaScript:

<script type="text/javascript" src="/media/system/js/sample.js"></script>

Dodanie bezpośrednie kodu JavaScript

Możemy również umieścić kod Javascript bezpośrednio w znaczniku <script> wewnątrz znacznika <head> HTML. Zrobimy to za pomocą metody JDocument::addScriptDeclaration()

// definicja kodu JavaScript
$skrypt = "alert('Jakiś komunikat')";
// dodanie kodu do dokumentu
$dokument -> addScriptDeclaration($skrypt);

Informacja dodatkowa

Metody JDocument::addScript() oraz JDocument::addScriptDeclaration() mogą przyjąć również drugi opcjonalny parametr. Parametr ten określi nam typ MIME skryptu, który chcemy dodać do dokumentu. Standardowym typem jest text/javascript. Możemy także zadeklarować, czyli dodać do naszego dokumentu pliki w innych językach skryptowych, np. tcl (text/tcl) oraz VBScript (text/vbscript).

Przykład:
$dokument->addScript('http://przyklad.com/scrypt.vb','text/vbscript');



Different web browsers sometimes show differences in the way that they render a page. For this reason you may wish to find out which particular browser a visitor is using, in order to use some browser-specific CSS.

The following javascript defines a simple browser detection object, by decoding the navigator.userAgent string

/************************************/
function browserDetect()
{
  var browserNames=new Array("Opera", "MSIE","Netscape","Firefox");
  this.name="NK";
  this.mainVersion="NK";
  this.minorVersion="NK";
 
  for (var i=0; i< browserNames.length; i++)
  {
   var pattern='('+browserNames[i]+')'+'.([0-9]+)\.([0-9]+)';    
   var myRegExp=new RegExp(pattern);
   if (myRegExp.test(navigator.userAgent))
    {
      var results=myRegExp.exec(navigator.userAgent);
      this.name=results[1];
      this.mainVersion=results[2];
      this.minorVersion=results[3];
      break;
    }
  }
}
/*****************************/

In order to use this in a script, you then create an instance of this object:-

var browser = new browserDetect();

The property browser.name will then give you then name of the browser (MSIE, Opera, Netscape or Firefox), browser.mainVersion will give you the main version number, browser.minorVersion will give you the minor version number.

However you should be aware that this is not-foolproof, and it is generally better (in this writer's opinion) to avoid writing browser-specific code as far as possible.


Zobacz


You can define different CSS style sheets depending upon the device the user is browsing your site with

The recognised media types are:

  • all - Suitable for all devices.
  • aural - For speech synthesizers.
  • braille - Intended for braille tactile feedback devices.
  • embossed -Intended for paged braille printers.
  • handheld - Intended for handheld devices.
  • print - Used for formatting printed pages.
  • projection - Intended for projected presentations, for example projectors or print to transparencies.
  • screen - Intended primarily for color computer screens.
  • tty - Intended for media using a fixed-pitch character grid, such as teletypes, terminals, or portable devices with limited display capabilities. Authors should not use pixel units with the "tty" media type.
  • tv - Intended for television-type devices (low resolution, color, limited-scrollability screens, sound available).

You can assign a media type to a CSS declaration with the following syntax

@media print {

   BODY { font-size: 12pt }
 }

To assign the declaration to more than one media type:

@media print handheld{

   BODY { font-size: 12pt }
 }

Alternatively, and perhaps a neater solution is to create a separate style sheet for a given media type and include the following in your templates <head> (the following is taken from the beez template):

<link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/beez/css/print.css" type="text/css" media="Print" />


Poprawianie wydajności szablonu

Szablony administratora (zaplecza)