Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Szablony] Pobieranie zmiennych
Forum PHP.pl > Forum > PHP
Asmox
Witam,
wpadłem na oryginalną koncepcję średniej strony internetowej jednocześnie wykorzystując szablon, a w plikach dołączeniowych nadawać zmiennym odpowiednie wartości. Niestety mam pewien problem, mianowicie mając taki kod:
  1. <!DOCTYPE
  2. html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  3. "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  4. <!--DOCTYPE-->
  5. <html>
  6. <head>
  7. <title><?php echo "Zmienna $title"; ?></title>
  8. </head>
  9. <body>
  10. <?php
  11. if (!empty($_GET['page'])) {
  12. include ($_GET['page'].".html");
  13. }
  14. ?>
  15. </body>
  16. </html>

Dużym problemem jest to, że zmienna $title jest w plikach dołączanych i w związku z tym zanim się ona załaduje, tytuł jest już gotowy ale bez tej zmiennej. Czy ma ktoś z was pomysł na rozwiązanie tego problemu ?
Mephistofeles
Eee, jak zmienna może być ustawiana w .html ? Chyba, że źle zrozumiałem. Popraw bezpieczeństwo - takie coś jak include ($_GET['page'].".html"); to spora dziura w kodzie.
PS. Po co wyświetlasz napis "Zmienna ..."? winksmiley.jpg.
marcio
Nom daj tam jakis basename() chociaz albo statyczna tablice plikow do include() a jak ci sie nie chce podaj adres www strony to zawsze jak mi sie bedzie nudzic mozna cos pokombinowac tongue.gif
Asmox
Znaczy jeśli chodzi o includowanie plików, to te linijki miały po prostu oznaczać, że ten kod ma się tam pojawić (zastosowałem już mechanizmy zabezpieczające i tak dalej, tylko wpisałem taki prosty kod, aby wszystko było przejrzyście). Więc o to się nie musicie martwić. Bardziej mnie martwi jak wyciągnąć tą zmienną.
Ten napis Zmienna wpisałem, ponieważ na początku myślałem, że nic się w ogóle nie chce pojawić. Nie wiem, czy dobrze mnie zrozumieliście, więc może wytłumaczę jeszcze raz:
Każdy plik, którego mogę wrzucić treść do szablonu ma na samym początku zmienną z opisem tytułu. Nie mogę jednak go wgrać, ponieważ najpierw jest pobierana zmienna z tytułem (której jeszcze tak naprawdę nie ma), a potem jest includowana treść razem ze zmienną.

Mephistofeles o .html też się nie martw - w konfiguracji serwera dopisałem linijkę przetwarzającą kod php także w plikach z rozszerzeniem .html

Sorry, że odświeżam, ale jakoś nikt mi nie odpowiedział, a problem został :/ . Żeby nie było, że chcę gotowca, wymyśliłem parę rozwiązań.

ROZWIĄZANIE I
Utworzenie pliku na przykład strona.phtml, w którym są zmienne, używane w szablonie:
1. Przez zmienne:
  1. <?php
  2. $strona_title = "Przykładowy tytuł strony";
  3. $strona_meta_content = "cośtam cośtam cośtam";
  4. $strona_content = "Tekst, linijka 1
  5. Linijka 2
  6. Linijka 3";
  7. # Albo jeśli tak nie można to
  8. # $strona_content = "Tekst, linijka 1 "
  9. # . "Linijka 2 "
  10. # . "Linijka 3 ";
  11. ?>

2. Przez tablice asocjacyjne
3. Przez utworzenie klasy page, i różnych fajnych pól/metod

ROZWIĄZANIE II
Polegałoby na tym, aby wszystkie potrzebne rzeczy, które mogą się różnić, trzymać w bazie danych, na przykład tabeli pages
Kod
|page_id|page_title|page_content|
itd...
1. Dzięki klasie pobierać te dane i potem je wrzucać w odpowiednie miejsca.
2. Używać statycznych funkcji zwracających dane. albo wypisujących je w odpowiedniej postaci.

Które rozwiązanie by nie było najlepsze, najchętniej (nie koniecznie) zrobiłbym to używając OOP, ponieważ wydaje mi się to dobrym rozwiązaniem.

A może wy macie jakiś sposób ?
erix
A nie możesz po prostu wdrożyć modelu MVC?
Asmox
ok tylko nie wiem za bardzo jak to zrobić. Nie mów mi co to mvc, bo to już akurat wiem, nie wiem tylko jak wykorzystać ten model w moim przykładzie
@EDIT:
Nie chcę być niemiły, ale jeżeli w końcu niewiadomo jak z tym MVC, to powiedzcie coś o moich pomysłach (te, co napisałem wyżej).
erix
Cytat
ok tylko nie wiem za bardzo jak to zrobić. Nie mów mi co to mvc, bo to już akurat wiem

Jedno przeczy drugiemu...

Cytat
Nie chcę być niemiły, ale jeżeli w końcu niewiadomo jak z tym MVC

A nie pomyślałeś, że są Święta i nie każdy siedzi przed PC? Poza tym, mogłeś za ten czas spokojnie liznąć podstaw, co to jest ten "MVC" w praktyce. A właśnie on jest rozwiązaniem Twojego problemu. Podpowiem: właściwie, to próbujesz go zrealizować, ale najpierw poczytaj co nieco.
MWL
MVC jest proste, najlepiej przyjrzyj się istniejącym frameworkom.
Asmox
Powiem tak: Wiem co to jest model MVC, jak działa i gdzie się przydaje, wiem co to jest Zend Framework, ale nie wiem jak wykorzystać te narzędzia w praktyce. Czy moglibyście mi podpowiedzieć, jak można by było to zrobić, albo podali jakiś tutorial do FW?
erix
Cytat
Czy moglibyście mi podpowiedzieć, jak można by było to zrobić, albo podali jakiś tutorial do FW?

Cytat
najlepiej przyjrzyj się istniejącym frameworkom.
guitarnet.pl
na poczatek przeklep linijka po linijce i zobacz jak dziala potem stanie sie jasnosc

http://wortal.php.pl/phppl/wortal/artykuly...e_aplikacji/mvc
Asmox
No już coś kojarzę coraz lepiej z tym MVC, ale na razie próbuję jeszcze robić to po swojemu, chociaż niektórzy mówią, że moje "dzieła", upodabniają się do MVC. Tak więc jestem chyba na dobrej drodze. Wiem, że zaraz ktoś znowu wyskoczy z pomysłem "daruj sobie, obejrzyj ZF/Symfony/KOHANA/(tu wstaw nazwę swojego ulubionego frameworka)", ale na razie jakoś nie potrafię.
Ostatnio doznałem pewnego olśnienia, mianowicie coś takiego:
(1) Tworzymy plik szablonu, dając ewentualne zmienne w nawiasy klamrowe, na przykład: <title>{title}</title>.
(2) Tworzymy plik tekstowy/htmlowy/inny według zasady, że pierwsza linijka będzie traktowana jako tytuł strony, pozostała jako treść
(3) W pliku głównym includowany jest plik treści i renderowany, czy coś takiego, z plikiem szablonu, zamieniając zmienne {var} w tekst z pliku.

Chciałbym usłyszeć, co o tym twierdzicie, jakie są wady tego rozwiązania itd... chociaż mam wrażenie, że będzie ich dużo :|
P.S. Właśnie sobie poczytałem coś o Smarty, z którego zaczerpnąłem szablony: http://wortal.php.pl/phppl/wortal/artykuly...y_szablonowania
Wygląda na to, że mój pomysł nie był w ogóle dobry. Może spróbowałbym te strony zrobić podejściem obiektowym...? Sorry, że marudzę, ale na razie jakoś mnie odpycha od frameworków.
erix
Cytat
Sorry, że marudzę, ale na razie jakoś mnie odpycha od frameworków.

Prędzej czy później MVC/frameworki Cię po prostu czekają...

Cytat
"daruj sobie, obejrzyj ZF/Symfony/KOHANA/(tu wstaw nazwę swojego ulubionego frameworka)", ale na razie jakoś nie potrafię.

To poszukaj jakichś prostych implementacji MVC typu TinyMVC, etc.
Asmox
Już żeby nie zakładać nowego tematu to będę dalej pisał tutaj:
W ogóle nie rozumiem podejścia MVC dlatego, że nie umiem stworzyć kontrolera. Gdzie bym nie szukał, to albo piszą jak zrobić MVC dla newsów albo łączą niektóre elementy tego wzorca ze sobą (na przykład na php.pl). Bardzo chciałbym sobie jakoś z tym poradzić, ale nie wiem paru rzeczy:
1. Na czym polega ta cała "wymienność widoków i kontrolerów"?
2. Skąd kontroler ma wiedzieć, którego modelu użyć do pobrania danych dla widoku?
3. Czy jedynym zadaniem akcji zainkludowanie widoku i wyświetlenie go na stronie?
erix
Cytat
1. Na czym polega ta cała "wymienność widoków i kontrolerów"?

Masz model, który wyciąga dane z pliku. Ale masz inny kaprys i zmieniasz na taki model, który wyciąga z bazy. Co do widoków - jeden generuje Ci HTML, chcesz RSS? Zostawiasz kontroler i modele te same, zmieniasz widok na generujący XML.

Cytat
2. Skąd kontroler ma wiedzieć, którego modelu użyć do pobrania danych dla widoku?

To piszesz w kodzie kontrolera. [;

Cytat
3. Czy jedynym zadaniem akcji zainkludowanie widoku i wyświetlenie go na stronie?

Nie - załadowanie modeli, przetworzenie parametrów zapytania, przygotowanie zmiennych dla widoku. To w takim skrócie. [;
MWL
Kiedyś też miałem z tym straszne problemy (każdy kiedyś zaczynał). Więc polecam Ci odwiedzić stronę http://framework.zend.com i obejrzeć sobie video tutorial, od razu zrozumiesz jak to działa. Dodatkowo odwieź phpedię, jest tam to całkiem banalnie wyjaśnione.

A najprosciej.

Zacznij od pliku php który za pomocą odpowiednich parametrów adresu, czy to GET czy ścieżka php (index.php/sraka), wywołaj odpowiedni kontroller - czyli to czym się zajmuje aplikacja i tym co przetwarza ci zadania, czyli pobiera ci modele (po prostu includuje klasy modelu i używa je), i rysuje odpowiednią stronę za pomocą pliku z kodem html i tym co każde napisać konrtoller. Proste? mam nadzieję że zrozumiałeś smile.gif
Asmox
Jeszcze mam pytanie w sprawie tego co napisał erix.
Cytat
Masz model, który wyciąga dane z pliku. Ale masz inny kaprys i zmieniasz na taki model, który wyciąga z bazy. Co do widoków - jeden generuje Ci HTML, chcesz RSS? Zostawiasz kontroler i modele te same, zmieniasz widok na generujący XML.

Czyli jeden kontroler może obsługiwać tylko jeden model i tylko jeden widok ?

Cytat
Zacznij od pliku php który za pomocą odpowiednich parametrów adresu, czy to GET czy ścieżka php (index.php/sraka), wywołaj odpowiedni kontroller - czyli to czym się zajmuje aplikacja i tym co przetwarza ci zadania, czyli pobiera ci modele (po prostu includuje klasy modelu i używa je), i rysuje odpowiednią stronę za pomocą pliku z kodem html i tym co każde napisać konrtoller. Proste? mam nadzieję że zrozumiałeś smile.gif

Wybacz, ale nic nie zrozumiałem. Załóżmy że mam stronę i chcę zastosować na niej MVC.
Ponieważ nagłówek i stopka mają być w każdym przypadku takie same, chciałbym je przenieść do innego pliku, na przykład zrobić taki nagłówek:
  1. <title><?php print ($this->view->title) ?></title>
  2. </head>

Wtedy w widoku miałbym coś takiego:
  1. <?php require_once("header.phtml") ?>
  2. <h1>Witamy na stronie głównej</h1>


Nie wiem, czy model miałby się zajmować załączaniem plików, czy nie, ale mógłby mi ktoś pokazać w jaki mniej więcej sposób to zrobić? (W sensie pokazać co ma być w modelu co w kontrolerze i jakie funkcje) Bo ja sam już się w tym pogubiłem
erix
Cytat
Czyli jeden kontroler może obsługiwać tylko jeden model

Nie - masz np. kontroler strony głównej - wczytujesz model newsów, użytkownika, itp.

Cytat
i tylko jeden widok ?

Generalnie jeden, ale można również stosować zagnieżdżenia; wszystko zależy od implementacji.
Asmox
Zobaczcie jeszcze na mój edit
erix
Cytat
Nie wiem, czy model miałby się zajmować załączaniem plików, czy nie, ale mógłby mi ktoś pokazać w jaki mniej więcej sposób to zrobić? (W sensie pokazać co ma być w modelu co w kontrolerze i jakie funkcje) Bo ja sam już się w tym pogubiłem

No to przecież tytuł jest globalny dla strony, nie?

Tak w ogóle, to możesz stosować coś takiego w akcji kontrolera:
  1. <?php
  2. $this->view['title'] = config::$pageTitle.' - podstrona';
  3. ?>


A jeśli chodzi o nagłówki, itp - to już zależy od widoku; możesz dołączać.

PS. Do widoku przydaje się extract" title="Zobacz w manualu PHP" target="_manual pod warunkiem, że działa w trybie tworzenia referencji. [;
Pr0100
jeżeli nie możesz zrozumieć MVC to zainteresuj się systemem szablonów SMARTY. Nauczy on Ciebie w dosyć przystępny sposób odróżniać widok od kontrolera smile.gif
Asmox
W porządku znam już trochę smarty. Fajne szablony można nim robić. Ok, to już kumam trochę, że na przykład akcja ma wysyłać nagłówki do widoku. A w jaki sposób ma działać dyspozytor ($controller->Dispatch) ? I czy dobrze rozumiem - to widok ma pobierać dane od modelu (w sensie że na przykład ostatnia edycja posta na forum to będzie w widoku:
  1. <?php
  2. print($this->view->GetFromModel('lastpostmodify'))
  3. ?>

i jaki jest wkład 'akcji' w tym?
Pr0100
Cytat
I czy dobrze rozumiem - to widok ma pobierać dane od modelu


kontroler pobiera dane z modelu a nie widok. Kontroler pobiera dane z modelu, oraz przesyła je do odpowiedniego widoku.

W kontrolerze możesz np. zrobić walidacje formularza

  1. <?php
  2. if (/* formularz został wysłany? */)
  3. {
  4.  return pokaz_widok("formularz");
  5. }
  6.  
  7. if (/* sprawdzanie czy wszystkie wymagane pole nie są puste */)
  8. {
  9.  return pokaz_widok("formularz", array("form_error" => "nie uzupełniłeś wszystkich pól");
  10. }
  11.  
  12. $user = wczytaj_model("user");
  13.  
  14. if ($user->count_where("nick", $_post['nick']) != 0)
  15. {
  16.  return pokaz_widok("formularz", array("form_error" => "nick zajęty");
  17. }
  18.  
  19. $user->insert($_POST);
  20. return pokaz_widok("gratulacje");
  21. ?>


w widoku
- formularz - sam kod HTML + if isset $form_error echo $form_error
- gratulacje - sam kod HTML "twoje konto zostało utworzone"
Asmox
Już zaczyna mi coś świtać w głowie biggrin.gif. A co to jest Dyspozytor i czym on się zajmuje?
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.