Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zrobić menu w szablonach Smarty
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
mkapi
Mój problem polega na tym że nie potrafię zrobić sobie menu w szablonach smarty.
Czy możecie mi dać prosty przyklad.

Zrobiłem sobie strone index.php Która zawiera następujący kod ..

................................................................................
........................................
  1. <?
  2.  
  3. //Dołączenie klasy głownej do smarty index.tpl
  4. require_once('.../Smarty/Smarty.class.php');
  5. //Tworzenie obiektu
  6. require_once('.../config/application.inc.php');
  7.  
  8. try {
  9. Lang::init(); 
  10. } catch (Exception $err) {
  11. exit('Lang error');
  12. }
  13. $smarty = new SmartyTemplate();
  14. $smarty->assign_by_ref('Interface', new ApplicationInterface());
  15.  
  16. //Tworzenie własnej zmiennej imie
  17.  
  18. $smarty->assign('imie','KATALOG GŁÓWNY');
  19. $smarty->assign('menu1','company.phtml');
  20. $smarty->assign('menu2','MENU2');
  21. $smarty->assign('menu3','MENU3');
  22. $smarty->assign('menu4','MENU4');
  23. $smarty->assign('CATEGORY_SPECIALS','GŁOWNA KATEGORIA');
  24. $smarty->assign('PRODUCT_NAMAE','TYTUŁ');
  25. $smarty->assign('PRODUCT_DESCRIPTION','Strona podtytułowa body');
  26. $smarty->assign('PRODUCT_PRICE','156');
  27. $smarty->assign('COPYRIGHT_YEARS','Prawa autorskie &copy;2007 dla MARCIN');
  28. $smarty->assign('images', array('images1'=>'<img src="../smartydirs/templates/images/baner.jpg" width=" 1078" height="94" alt="[Rozmiar: 28095 bajtów]">',//widok zdjec aluplastu
  29. 'logo'=>'<img src="../smartydirs/templates/images/logo.jpg" width="139" height="94" align="top" alt="[Rozmiar: 12258 bajtów]">',
  30. 'pl'=>'<a href="?lang=pl"><img src="../smartydirs/templates/images/pl.jpg" width="30" height="13" alt="[Rozmiar: 751 bajtów]"></a>',
  31. 'de'=>'<a href="?lang=de"><img src="../smartydirs/templates/images/de.jpg" width="30" height="13" alt="[Rozmiar: 799 bajtów]"></a>'
  32. ));
  33.  
  34.  
  35. //Wyświetlenie szablonu tpl
  36.  
  37. $smarty->display('start.tpl') ;
  38.  
  39.  
  40.  
  41.  
  42. ?>

................................................................................
........................................................

Potem plik szablonu start.tpl

................................................................................
...........................................................

  1. <html xmlns="http://www.w3.org/1999/xhtml" lang="{$Interface->getMessage('html_symbol')}" xml:lang="{$Interface->getMessage('html_symbol')}">
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3.  
  4.  
  5. <STYLE type="text/css">
  6. {literal}
  7. <!--
  8. BODY {
  9. margin: 0px;
  10. }
  11. -->{/literal}
  12. </STYLE>
  13. <table ><tr><td colspan="2">{include file="baner.tpl"}</td></tr>
  14. <tr><td valign="top" background="../smartydirs/templates/images/tlo2.jpg">{include file ="menu.tpl"}</td><td>{include file="intro.tpl"}</td></tr>
  15.  
  16.  
  17. </table>
  18.  
  19.  
  20.  
  21.  
  22. </body>
  23.  
  24. </html>
  25.  
  26. </html>

................................................................................
.................................................

NO i chodzi mi o to zebym w pliku menu.tpl/

zrobil cos takiego np:

<a href="">O mnie</a>
<a href="">Produkty</a>
<a href="">Kontakt</a>
<a href="">wolna</a>

I jak klikne na odnosnik w plikumenu.tpl to zeby on zmienial mi strone intro.tpl.
Nie bardzo sobie umię z tym poradzić wiem że należy skorzystać z tablicy asocjacyjnej oraz z funkcji GET
Ale nie bardzo potrafie to skleic w kupe i sie do tego odwołać. Dlatego najlepiej prosił bym o przedstawienie prostego przykładu.
Prosze też nie myśleć że licze na gotowizne ponieważ już 4 dni nad tym siedzę i nic. Poprostu zalamac sie mozna
Jak naraize doszedlem do czegos takiego w pliku index.php ale nie potrafię sie do tego nijak odwołać.
Wszystko co robie to z ksiażek lub internetu.

.....
  1. <?php
  2. $strona = 'intro';
  3. $allowed = array('intro', 'kontakty') ; //strony
  4. if( isset($_GET['go']) && in_array($_GET['go'], $allowed) ){
  5. $strona = $_GET['go'];
  6. }
  7.  
  8. $smarty->assign('page', $strona.'.tpl');
  9. ?>

...

Jak wybieram {$page} to mi się wyświetla strona intro.tpl/ Coś pewnie z tym kodem źle robię.
BARDZO WAS PROSZĘ O POMOC > JAK ZOBACZE PRZYKLAD TO MOŻE WKOŃCU ZROZUMIĘ>

Używaj BBCode inaczej zarobisz ostrzeżenie
~kwiateusz
strife
No dobrze kombinujesz, ale co jeśli będziesz chciał dodać 20 stron, za każdym razem będziesz edytował tą tablicę? Twoje rozwiązanie jest mało elastyczne, lepiej już zrobić to w ten sposób:

  1. <?php
  2. $sFile = $_GET['action'];
  3. $url  = 'templates/' . $sFile . '.tpl';
  4. if ( basename( file_exists( $url ) )
  5. {
  6. $page = $url;
  7. }
  8. else 
  9. {
  10. $page = 'templates/default.tpl';
  11. }
  12. $smarty -> assign('content', $page );
  13. ?>


Jak się domyślasz skrypt sprawdza czy w katalogu templates/, są pliki, które podajemy w zmiennej w tablicy $_GET. Potem w miejscu gdzie chcesz, aby zawartość się pojawiała dajesz:

  1. {include file=$content}


I powinno bez problemu działać. Chyba o to Ci chodzi ?
mkapi
moj plik aplication.inc.php zaweira wpis co do wersji jezykowej.
  1. <?php
  2. //Załadowanie pliku definicji 
  3. //parametrów konfiguracyjnych
  4. require_once('define.inc.php');
  5.  
  6. //Załadowanie pliku konfiguracji 
  7. //systemu szablonów Smarty
  8. require_once('smarty.inc.php');
  9.  
  10. //Klasa obsługi języków
  11. class Lang {
  12.  
  13. //Obiekt DOMDocument przechowywujący komunikaty językowe
  14. private static $_langDOM;
  15.  
  16. //Zmienna określająca symbol aktualnie wybranego języka
  17. private static $_langSymbol = null;
  18.  
  19. //Obiekt DOMXPath do tworzenia zapytań XPath
  20. private static $_domxpath;
  21.  
  22. //Konstruktor prywatny. Nie można utworzyć obiektu klasy 
  23. private function __construct() {}
  24.  
  25. //Metoda inicjująca klasę języka
  26. public static function init() {
  27. //Sprawdzenie, czy język jest przekazywany w zmiennej GET
  28. if (isset($_GET['lang'])) {
  29. if (!preg_match('/[a-z]{2}/', $_GET['lang'])) throw new Exception();
  30. if (file_exists('../config/lang/'.$_GET['lang'].'.lang.xml')) self::$_langSymbol = $_GET['lang']; 
  31. }
  32. //Sprawdzenie czy język nie jest trzymany w zmiennej sesyjnej
  33. if (!self::$_langSymbol && isset($_SESSION['lang'])) {
  34. if (!preg_match('/[a-z]{2}/', $_SESSION['lang'])) throw new Exception();
  35. self::$_langSymbol = $_SESSION['lang']; 
  36. }
  37.  
  38. if (defined('DEFAULT_LANG') && !self::$_langSymbol) {
  39. //Sprawdzenie czy język dane języka są dopuszczalne
  40. if (!preg_match('/[a-z]{2}/', DEFAULT_LANG)) throw new Exception(); 
  41. self::$_langSymbol = DEFAULT_LANG; 
  42. }
  43.  
  44. //Załadowanie pliku komunikatów
  45. if (!self::$_langDOM = @DOMDocument::load('../config/lang/'.self::$_langSymbol.'.lang.xml'))
  46. throw new Exception();
  47.  
  48. //Wyszukiwanie komunikatów
  49. self::$_domxpath = new DOMXPath(self::$_langDOM);
  50.  
  51. //Zapamiętanie języka w sesji
  52. $_SESSION['lang'] = self::$_langSymbol;
  53. } 
  54.  
  55. //Tłumaczenie komunikatu
  56. public static function getMessage($msg) {
  57. $result = self::$_domxpath->query('//msg[@label="'.$msg.'"]');
  58.  
  59. if ($result->length!=1)
  60. return self::$_langDOM->documentElement->getAttribute('defaultMsg');
  61. return $result->item(0)->getAttribute('value');
  62. }
  63. }
  64. //Interfejs aplikacji dla systemu szablonów Smarty
  65. class ApplicationInterface {
  66. public function getMessage($msg) {return Lang::getMessage($msg);}
  67. }
  68. ?>




Problem polega na tym że w pliku index.php mam taki wpis

  1. <?
  2.  
  3. //Dołączenie klasy głownej do smarty index.tpl
  4. require_once('.../Smarty/Smarty.class.php');
  5. //Tworzenie obiektu
  6. require_once('.../config/application.inc.php');
  7.  
  8. try {
  9. Lang::init(); 
  10. } catch (Exception $err) {
  11. exit('Lang error');
  12. }
  13. $smarty = new SmartyTemplate();
  14. $smarty->assign_by_ref('Interface', new ApplicationInterface());
  15.  
  16. //Tworzenie własnej zmiennej imie
  17.  
  18.  
  19. $smarty->assign('images', array('images1'=>'<img src="../smartydirs/templates/images/baner.jpg" width=" 1078" height="94" alt="[Rozmiar: 28095 bajtów]">',//widok zdjec aluplastu
  20. 'logo'=>'<img src="../smartydirs/templates/images/logo.jpg" width="139" height="94" align="top" alt="[Rozmiar: 12258 bajtów]">',
  21. 'pl'=>'<a href="?lang=pl"><img src="../smartydirs/templates/images/pl.jpg" width="30" height="13" alt="[Rozmiar: 751 bajtów]"></a>',
  22. 'de'=>'<a href="?lang=de"><img src="../smartydirs/templates/images/de.jpg" width="30" height="13" alt="[Rozmiar: 799 bajtów]"></a>'
  23. ));
  24.  
  25.  
  26. $strona = 'intro';
  27. $allowed = array('intro', 'kontakt','firma', 'menu','wycena', 'mapa') ; //strony
  28. if( isset($_GET['go']) && in_array($_GET['go'], $allowed) ){
  29. $strona = $_GET['go'];
  30. }
  31.  
  32. $smarty->assign('page', $strona.'.tpl');
  33. //Wyświetlenie szablonu tpl
  34.  
  35. $smarty->display('start.tpl') ;
  36.  
  37.  
  38.  
  39. ?>




jeszcze plik define.inc.php W ktorym na domyslny jezyk ustawiam sobie przy starcie .

  1. <?php
  2. /**************************************
  3.  * Parametry systemu szablonów Smarty *
  4.  **************************************/
  5. //Katalog szablonów
  6. define('SMARTY_TEMPLATE_DIR', '../smartydirs/templates/');
  7.  
  8. //Katalog kompilacji
  9. define('SMARTY_COMPILE_DIR', '../smartydirs/templates_c/');
  10.  
  11. //Katalog konfiguracji szablonów
  12. define('SMARTY_CONFIG_DIR', '../smartydirs/config/');
  13.  
  14. //Katalog plików cache’u szablonów
  15. define('SMARTY_CACHE_DIR', '../smartydirs/cache/');
  16.  
  17. //Parametr debuggera
  18. define('SMARTY_DEBUGGING', FALSE);
  19.  
  20. //Parametr sprawdzania kompilacji
  21. define('SMARTY_COMPILE_CHECK', TRUE);
  22.  
  23. //Parametr cache’owania wyników kompilacji
  24. define('SMARTY_CACHING', FALSE);
  25.  
  26. define('SMART_CACHE_LIFETIME', 1);
  27.  
  28. //Domyślny język
  29. define('DEFAULT_LANG', 'de');
  30.  
  31.  
  32.  
  33. ?>



No i jak otwiera sie stronka mam domyslny jezyk polski. potem jak klikam na menu przykladowo
  1. <a href= "index.php?go=wycena"
to wywala mi jezyk.
Chciałbym żeby po kliknieci na jezyk przelaczaly sie rowniez podstony a nie tylko te strony ktore sa zaladowane przy starcie z pliku start.tpl/

Plik start.tpl zaweira jeszcze taki wpis .

  1. <html xmlns="http://www.w3.org/1999/xhtml" lang="{$Interface->getMessage('html_symbol')}" xml:lang="{$Interface->getMessage('html_symbol')}"> ....



I nie wiem co z tym zrobic wszystkim,
strife
Na pierwszy rzut oka analizując kod, mogę powiedzieć, że musisz w linku podać jeszcze język, czyli:

  1. <a href= "index.php?go=wycena&lang=de"

  1. <a href= "index.php?go=wycena&lang=en"


itd.

Czy taka operacja pomaga ?

Pozdrawiam.
mkapi
Taka operacja pomogła.
A gdybym chciał zrobić sesje .
Tak gdyby ktoś w trakcie przeglądania strony chciał zmienić język i nie został by przeładowany do strony start.tpl.


Czy może mi ktoś dać przykład. Był bym bardzo wdzięczny.
Bardzo dziękuję za dotychczasową pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.