Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]System szablonów - umiejscowienie poszczególnych elementów strony.
Forum PHP.pl > Forum > Przedszkole
ZuyPan
Witam.
Piszę bardzo łatwy system szablonów, taki najprostszy. Ogólnie koncepcja jego działania polegała by na:

- sprawdzenie wybranego języka (w wersji uproszczonej na potrzeby pewnego projektu wczytywany będzie za pomocą include polski język)
- wczytywanie configa, etc.
- jeśli $_GET['strona'] != null includuje stronę o nazwie $_GET['strona'].php
- jeśli $_GET['strona'] == null pobiera treść "powitania" na stronie i includuje plik news.php i przypisuje wszystko do tablicy $tresc np. $tresc['powitanie'] (tu zaczną się schody, opiszę to dalej)
- jeśli $raporter != null usuwa poprzednie wartości tablicy $tresc i nadpisuje ją treścią raportera (raporter - system wyświetlania wiadomości - np. "Pomyślnie dodałem newsa do bazy danych" albo "Błąd podczas łączenia się z bazą danych".)


W taki mniej więcej sposób działał będzie system php, który będzie umieszczony w pliku index.php
Poniżej znajduje się funkcja, która pobierze odpowiedni szablon z folderu tpl.

Mój problem polega na tym, że wiem jak wyświetlać zwykłą treść, np powitanie będzie miało postac $tresc['powitanie'] i tyle, ale jak wyświetlić cały system newsów? newsy w pliku news.php odczytywane są za pomocą pętli, więc nie bardzo wiem jak przyporządkować je do jednej zmiennej. Poza tym w starym systemie strony w pliku news.php są divy pomagające wyświetlić w ładny sposób newsy. To zadziała gdy szablon strony się nie zmieni. A co jeśli styl narzucony przez news.php nie będzie pasował do całego tpl? Poza tym news.php będzie zawierał w sobie stronicowanie.

Może wydawać się to trochę skomplikowane dlatego wrzucę kod

  1. <?php
  2. $zapytanie = 'SELECT * FROM newsy ORDER BY id DESC';
  3. $query = mysql_query($zapytanie, $polaczenie1);
  4. if (mysql_num_rows($query) >= 1){
  5. while ($rekord = mysql_fetch_assoc($query)){
  6.  
  7.  
  8. echo '<div class="news_tytul">';
  9. echo '<font size="2,5"><strong>';
  10. echo $rekord['tytul'];
  11. echo '</strong></font>';
  12. echo '</div>';
  13. echo '<hr>';
  14. echo '<div class="news_tekst">';
  15. echo $rekord['tresc'];
  16. echo '<div class="podpis_news"><br><br>';
  17. echo '<font size="1"><br>Dodane przez: ';
  18. if ($rekord['autor'] != 'Konto usunięte'){
  19. echo "<a href='index.php?akcja=profil&login=".$rekord['autor']."'>".$rekord['autor']."</a>";
  20. }else{
  21. echo $rekord['autor'];
  22. }
  23. echo ' | dnia : ';
  24. echo $rekord['data'];
  25. echo "<br><a href='?akcja=news&akcja2=pokaz_komentarze&id=$rekord[id]'>Pokaż komentarze</a>";
  26. echo '</font></div>';
  27. echo '</div>';
  28. echo '<br>';
  29. echo '</div>';
  30.  
  31. }
  32.  
  33. }else{
  34. echo '<center><font color="red">Brak newsów do wyświetlenia.</font></center>';
  35. }
  36. ?>


Jak widać w linijce np. 8 został użyty div "news_tytul".
Resumując - jak umieszczać system newsów za pomocą zmiennej $tresc['...']? To samo pytanie można by zadać jeśli chodzi o logowanie includowane z pliku logowanie.php (ale tu już łatwiej - jeśli nie zalogowany $tresc['logowanie'] to formularz, a jeśli zalogowany to np. Witaj $_SESSION['nick'])

Jeśli macie jakieś rady, ciekawe "sztuczki" odnośnie systemu szablonów to poradźcie mi smile.gif
Quantum
piszesz system szablonów, to może zobacz najpierw jak takie najprostsze działają; to co teraz wysłałeś to mieszanie logiki z widokiem, a w to się nie baw, bo do niczego dobrego Cie to nie doprowadzi.

popatrz na ten prosty przykład:

  1.  
  2. // przykładowe dane (za te podstawiamy te wyciągnięte z bazy; tu masz na to wiele sposóbów)
  3. $data = array(
  4. array('id' => 10, 'name' => 'example_10'),
  5. array('id' => 11, 'name' => 'example_11')
  6. );
  7.  
  8. // tworzymy obiekt klasy View - naszego systemu szablonów
  9. $widok = new View('sciezka/do/widoku/szablon.php');
  10.  
  11. // przypisujemy dane
  12. $widok->assign('data', $data);
  13.  
  14. // wyświetlamy, tutaj dzięki metodzie magicznej __toString w klasie View
  15. echo $widok;
  16.  


w pliku sciezka/do/pliku/szablon.php:

tutaj piszemy tabelkę z wynikami: (pamiętaj o zagnieżdzaniu PHP w HTML, nie odwrotnie)
  1. <table>
  2. <tr>id<td></td><td>name</td></tr>
  3. <?php foreach ($data as $record) { ?>
  4. <tr><td><?php echo $record['id'] ?></td><td><?php echo $record['name'] ?></td></tr>
  5. <?php } ?>
  6. </table>


jak taka najprostsza klasa systemu szablonów powinna wyglądać ? mniej-więcej tak:

  1. <?php
  2.  
  3. class View {
  4.  
  5. private $template, $parameters = array();
  6.  
  7. function __construct($template)
  8. {
  9. $this->template = $template;
  10. }
  11.  
  12. public function assign($key, $value)
  13. {
  14. $this->parameters[$key] = $value;
  15. }
  16.  
  17. public function __toString()
  18. {
  19. return $this->render();
  20. }
  21.  
  22. public function render()
  23. {
  24.  
  25. extract($this->parameters);
  26.  
  27. require_once $this->template;
  28.  
  29. return ob_get_clean();
  30. }
  31. }


mam nadzieję, że choć trochę pomogłem w zrozumieniu winksmiley.jpg
ZuyPan
A strukturalnie się jakoś tego nie da? :/
Patrzyłem jak takowe działają, myślę, że rozumiem, ale to wszystko to obiektówka (niestety)
Quantum
Taką klasę możesz wykorzystać w strukturalnym kodzie, nie musisz używać pełnego OOP, po prostu włączasz ją do projektu i używasz w sposób jaki zaprezentowałem. Dlaczego niestety obiektówka ? smile.gif Masz jeszcze wiele innych systemów szablonów, tych bardziej zaawansowanych, które mają własne pseudo-języki; Smarty, OPT.
ZuyPan
Niestety ponieważ ten sposób programowania jest dla mnie jak gonitwa po całym kodzie. Nie potrafię go zrozumieć, jak dla mnie wymaga on znajomości ogromu funkcji, które ja pierwszy raz widzę. Najprościej w świecie nie rozumiem tego sposobu i raczej już tak pozostanie.

Co do wykorzystania tego u mnie no to ok, ale jeśli zaczął bym używać tego w jednym miejscu, to cały skrypt w końcu by się od tego uzależnił. Poza tym nie muszę chyba mówić, że skoro to jest obiektówka to:
a - nie rozumiem tego
b - nie umiał bym tego stosować
a na dokłądkę (ale to już ode mnie)
c - kiepski ze mnie programista

Co do systemów takich jak smarty etc. Daj spokój... Gubię się w takich kombajnach, 5 minut temu pobrałem otp i stwierdziłem "Boże co za idiotyzm" - kosz.
Jak na 3 lata programowania (oczywiście nie regularnie) nie umiem praktycznie nic. Nie winie tu nikogo bo pretensje mogę mieć jedynie do siebie, no ale cóż... Tak czy siak choćbym chciał to pewnie tego nie dam rady zrobić
Quantum
Również nie używam OPT czy Smarty, mają własne pseudo-języki, na które nie opłaca mi się tracić czasu, a jeżeli zwykły PHP zagnieżdzony w widoku spełnia swoją rolę - kompletnie nie widzę takiej potrzeby. Co do obiektówki - jeżeli ją zrozumiesz powiesz to samo o strukturalnym co przed chwilą powiedziałeś o OOP. Jest dużo łatwiej zarządzać projektem, który ma rozdzielone zadania na kilka mniejszych klas spełniające jedną rolę. W strukturalnym odwrotnie - totalny bałagan w kodzie. Po kilku dniach przerwy wracasz do kodu i nie masz pojęcia jak to napisałeś, że działa (lub już nie) biggrin.gif Polecam nauczyć się języka od podstaw, czasem po wielu latach można zgubić wiele przydatnych informacji. Wystarczy, że znajdziesz jakiś dobry kurs i możesz szybko nadrobić stracony czas. A jeśli chodzi o programowanie obiektowe, możesz zakupić książkę, osobiście polecam: programowanie obiektowe w php 5, Hasin Hayder; kosztuję ona ok. 37zł z przesyłką, a jest warta uwagi.

pozdrawiam.
darko
Programujesz 3 lata w php i celowo unikasz obiektówki? Lepiej, dla własnego dobra, jak najszybciej opanuj chociaż podstawy programowania obiektowego, a szybko zauważysz same zalety.
Kto chce - dąży do rozwiązania problemu, kto nie chce - wymyśla przeszkody. Ty należysz raczej do tej drugiej grupy. Pozostawię bez komentarza nazywanie czegokolwiek idiotyzmem, tylko dlatego, że się tego nie rozumie (i nie chce zrozumieć).
ZuyPan
Czyli Wasza rada to: powtórzyć kurs php a potem obiektówka? Nie powiem aby mi się to specjalnie uśmiechało, ale cóż...
darko
Cytat(ZuyPan @ 20.07.2010, 11:43:33 ) *
Czyli Wasza rada to: powtórzyć kurs php a potem obiektówka? Nie powiem aby mi się to specjalnie uśmiechało, ale cóż...

Szybko docenisz zalety oop. Powodzenia i owocnej nauki.
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.