Szablony Smarty 3

Framework używa Smarty 3 jako domyślnego silnika szablonów. Informacje na temat użycia innych silników szablonów znajdują się poniżej.

Twórca aplikacji nie jest ograniczony technicznie w zakresie możliwości projektowania i rozmieszczenia interfejsu. Tylko lokalizacja i nazwa pliku szablonu są obowiązkowe.


Używanie Smarty

Aby uprościć programowanie, framework dostarcza szereg zmiennych i helperów, które są dostępne w szablonie.

Zmienne są następujące

  • {$wa_url}: ścieżka do katalogu głównego instalacji frameworka z katalogu głównego witryny.
  • {$wa_app_url}: względny adres URL strony frontend aplikacji z głównego katalogu witryny. W szablonach frontendowych zmienna zwraca ścieżkę do strony frontendowej aplikacji, w szablonach backendowych ścieżkę do strony backendowej aplikacji.
  • {$wa_app_static_url}: ścieżka do katalogu aplikacji z korzenia strony (używana do budowania linków do statycznych plików aplikacji, np: {$wa_app_static_url}img/logo.png.
  • {$wa_app}: zwraca APP_ID aplikacji.
  • {$wa_backend_url}: względny URL backendu.


Helper $wa:

  • {$wa->header()} - zwraca kod nagłówka HTML backendu z listą zainstalowanych aplikacji i nazwą bieżącego użytkownika.
  • {$wa->app()} - APP_ID aplikacji.
  • {$wa->appName()} -nazwa aplikacji.
  • {$wa->accountName()} - nazwa konta (instancja instalacji frameworka).
  • {$wa->css()} - zwraca kod HTML do podłączenia wymaganych plików CSS.
  • {$wa->user()->getName()} - bieżąca nazwa użytkownika.
  • {$wa->user()->getId()} - identyfikator bieżącego użytkownika.
  • {$wa->version()} - numer wersji aplikacji.
  • {$wa->url()} - ścieżka instalacji frameworka od korzenia witryny.
  • {$wa->url(true)} - ścieżka do backendu z korzenia strony.


Lokalizacja

Aby wyświetlić ciągi znaków, które muszą być przetłumaczone w zależności od locale użytkownika, należy użyć mechanizmu gettext. W takim przypadku do kodu szablonu wstawiany jest klucz do tłumaczenia w ramce projektu

[` `], np: [`some gettext key`]. Więcej informacji na temat mechanizmu lokalizacji znajduje się w rozdziale Lokalizacja.


Przykład

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<title>{$wa->appName()} &mdash; {$wa->accountName()}</title>
  {$wa->css()}
 
<script src="{$wa_url}wa-content/js/jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
</head>
<body>
 
<div id="wa">
    {$wa->header()}
   
<div id="wa-app">
     
<div class="block">
        {if !$records}
       
<p>[`Guestbook is empty. Write a new post on the public guestbook page.`]</p>
        {else}
       
<ul class="zebra">
          {foreach from=$records item=r}
         
<li>
            {if $rights_delete}
<a class="count" href="?action=delete&id={$r.id}"><i class="icon16 delete"></i></a>{/if}
           
<span class="hint">
             
<strong>{$r.name|escape}</strong>
              {$r.datetime|wa_datetime}
           
</span>
            {$r.text|escape|nl2br}
         
</li>
          {/foreach}
       
</ul>
        {/if}
       
<a href="{$url}" target="_blank">[`Guestbook on site`]</a>
       
<i class="icon10 new-window"></i>
     
</div>
   
</div>
 
</div>
</body>
</html>



Używanie alternatywnych silników szablonujących

Domyślny silnik Smarty 3 może być zastąpiony dowolnym alternatywnym silnikiem szablonów.

Framework komunikuje się z silnikiem szablonów poprzez specjalną klasę adaptera. W szczególności, system uzyskuje dostęp do Smarty 3 poprzez klasę systemową waSmarty3View, która znajduje się w pliku wa-system/view/waSmarty3View.class.php.

Aby użyć innego silnika szablonów, należy zaimplementować klasę adaptera i podłączyć ją (poprzez plik konfiguracyjny), aby umożliwić interakcję pomiędzy frameworkiem a silnikiem szablonów.


Łączenie szablonów w czystym PHP

Framework zawiera adapter, który pozwala na użycie zwykłych plików PHP jako szablonów.

Uwaga: Ten adapter został obecnie zaimplementowany w uproszczonej formie w celach demonstracyjnych i nie jest przeznaczony do stosowania w projektach o dużym obciążeniu.


Aby używać w swojej aplikacji szablonów PHP zamiast Smarty, wystarczy utworzyć plik konfiguracyjny wa-apps/{APP_ID}/lib/config/factories.php o następującej zawartości:

<?php

return array(
   
'view' => 'waPHPView'
)


Jeśli w aplikacji istnieje już plik factories.php, należy dodać do niego odpowiednią linię.

Konwencja nazewnictwa dla szablonów PHP jest taka sama jak dla szablonów Smarty. Jedyną różnicą jest rozszerzenie plików szablonów: w przeciwieństwie do szablonów Smarty, które mają rozszerzenie .html, szablony PHP mają domyślne rozszerzenie .php.


W szablonach PHP dostępne są te same wbudowane zmienne i helper $wa, co w szablonach Smarty.


Tworzenie adaptera do podłączenia silnika szablonów alternatywnych

Każdą tworzoną aplikację można skonfigurować tak, aby korzystała z silnika szablonów znanego twórcy. W tym celu należy określić klasę adaptera silnika szablonów w pliku konfiguracyjnym aplikacji wa-apps/{APP_ID}/lib/config/factories.php:

<?php

return array(
   
'view' => '{NAZWA KLASY ADAPTERA VIEW}'
);


Domyślną wartością parametru view jest waSmarty3View (adapter dla Smarty 3).

Możesz zdefiniować własną klasę jako klasę adaptera (musi ona pochodzić od klasy systemowej waView), umieścić ją w pliku o odpowiedniej nazwie w dowolnym miejscu podkatalogu lib/ aplikacji, a następnie zaimplementować w niej wszystkie potrzebne funkcje.

Implementacja adaptera do podłączenia silnika szablonów na przykładzie klasy waPHPView:

<?php

/**
 * Każdy adapter View musi być dziedziczony z klasy systemowej waView
 */

class waPHPView extends waView
{
 
   
// Tutaj ustawiono domyślne rozszerzenia plików szablonów .html,
   
// aby używać zwykłego PHP jako view, pliki szablonów muszą mieć nazwy widoku *.php
   
protected $postfix = '.php';
 
   
// Zmienna do przechowywania danych przekazanych do view
   
protected $vars = array();
 
   
// Katalog główny dla szablonów (określony w konstruktorze)
   
protected $template_dir = array();
 
   
// Obiekt waSystem aplikacji
   
protected $system;
 
   
// Zmienna pomocnicza do przechowywania aktualnie aktywnego szablonu
   
protected $current_template;
 
   
public function __construct(waSystem $system, $options = array())
   
{
        $this
->system = $system;
   
       
// Ustawiamy katalog główny dla szablonów,
       
// domyślnie jest to katalog aplikacji wa-apps/{APP_ID}/
        $this
->template_dir = isset($options['template_dir']) ? $options['template_dir'] : $this->system->getAppPath();
   
}

   
/**
     * Implementacja funkcji assign - przekazywanie danych do szablonu z działania/kontrolera
     */

   
public function assign($name, $value = null)
   
{
       
if (is_array($name)) {
            $this
->vars += $name;
       
} else {
            $this
->vars[$name] = $value;
       
}
   
}

   
/**
     * Usuwanie zmiennej
     */

   
public function clearAssign($name)
   
{
       
if (isset($this->vars[$name])) {
                unset
($this->vars[$name]);
       
}
   
}

   
/**
     * Czyszczenie wszystkich przesłanych danych do szablonu
     */

   
public function clearAllAssign()
   
{
        $this
->vars = array();
   
}

   
/**
     * Zwraca jedną lub wszystkie zmienne przekazane do szablonu
     */

   
public function getVars($name = null)
   
{
       
if ($name === null) {
           
return $this->vars;
       
} else {
           
return isset($this->vars[$name]) ? $this->vars[$name] : null;
       
}
   
}

   
/**
     * Zwraca wynik renderowania szablonu jako ciąg
     */

   
public function fetch($template, $cache_id = null)
   
{
        ob_start
();
        $this
->display($template, $cache_id);
        $result
= ob_get_contents();
        ob_end_clean
();
       
return $result;
   
}

   
/**
     * Renderuje szablon do przeglądarki klienta
     */

   
public function display($template, $cache_id = null)
   
{
       
if ($this->templateExists($template)) {
            $this
->current_template = $template;
            extract
($this->vars);
            include
($this->template_dir.'/'.$this->current_template);
       
} else {
           
throw new waException("Template ".$template.' not found');
       
}
   
}

   
/**
    * Sprawdza, czy podany szablon istnieje
    */

   
public function templateExists($template)
   
{
       
return file_exists($this->template_dir.'/'.$template);
   
}

}



Błąd w tekście? Zaznacz ją myszką i kliknij Ctrl + F1 lub kliknij na ten blok!