Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsługiwanie stron - switch najlepszy?
Forum PHP.pl > Forum > PHP
Apocalyptiq
Witam!

Na serwisach z różnymi podstronami, do których trzeba coś pobrać z bazy lub coś zrobić w php, daję switch - jest on wtedy wielki, no i niezależnie na ktorą stronę się wejdzie, przeglądarka będzie musiała pobrać cały plik. Znacie może jakieś lepsze sposoby takiego obsługiwania stron? Czy switch to najepsze wyjście?
Do stron używam systemu szablonów PHPTAL, który jest opraty na xml.
rzymek01
Cytat
daję switch - jest on wtedy wielki, no i niezależnie na ktorą stronę się wejdzie, przeglądarka będzie musiała pobrać cały plik

przeglądarka nie pobiera kodu php
Apocalyptiq
no nie, ale ściąga plik winksmiley.jpg
vokiel
Dajesz switch'a żeby rozdzielić ruch na podstrony?
Czyli np switchujesz parametr $_GET['strona'] i w zależności od zawartości includujesz odpowiednie pliki? O ile dobrze Cie zrozumiałem, to możesz użyć np in_array, array_key_exist
Tworzysz tablice podstron, sprawdzasz czy parametr występuje w tablicy, jeśli tak to robisz działanie odpowiadające danemu parametrowi.

Możesz też poczytać o takich hasłach: autoloader, router...
Spawnm
art o tym, poczytaj .
Apocalyptiq
Nie pliki, tylko odpowiednie akcje w php, np. pobranie czegoś z bazy. Szablony podstron pobieram z GETa najpierw sprawdzając, czy taka podstrona istnieje w folderze z podstronami.
Spawnm
tablica z nazwami funkcji , jeśli nazwa funcji z get==z tablicy {
$fun=$_GET['fun'];
$fun();
1010
Według mnie switch jest dobrym rozwiązaniem
Apocalyptiq
Hm, no ale z funkcjami wyjdzie tak samo jak ze switchem... Chyba zostane przy nim smile.gif
1010
A zauważyłeś spadek wydajności?

Do przeglądarki i tak jest wysyłany tylko plik wynikowy czyli sam HTML/XHTML/JavaScript/CSS
Apocalyptiq
Aha, no raczej wydajność jest spoko, robiłem dotychczas tylko jeden taki porządniejszy projekt (gra via www) właśnie tym switchem, i raczej strona działała ok.
1010
Ja również nie miałem z tym nigdy problemów a mam kilka większych projektów już za sobą smile.gif I zawsze switch miał tutaj zastosowanie.


A jak to mówią "dopóki działa nie naprawiaj" winksmiley.jpg
Apocalyptiq
Dzięki za rady winksmiley.jpg
dr_bonzo
Switcha to mozna uzyc do 5 statycznych podstron.

Przy 50ciu, z akcjami, sql itd to jest bez sensu.

Zajrzyj do najprostszego frameworka (Cohana, CI) i zobacz jak to tam zrobili (Kontrolery i Akcje)
1010
Nigdy nie zauważyłem spadku wydajności przez switch.
potreb
Już zaprzestałem korzystać ze switcha, bo jest więcej zabawy, chyba że aplikacja ma 5 podstron dla jednego pliku winksmiley.jpg
dr_bonzo
Cytat
Nigdy nie zauważyłem spadku wydajności przez switch.

A kto mowi o wydajnosci - chodzi mi o bezsens tego kodu, 1000 razy klepiesz to samo, jak mozna prosciej to rozwiazac tablica, albo sprawdzeniem czy plik $_GET['action' ] istnieje itp, includujesz go - w nim masz akcje, pobieranie danych wyswietlanie.

A jak dodatkowo cala aplikacje trzymasz wewnatrz tego switcha to rzalibul.
1010
Cytat
A jak dodatkowo cala aplikacje trzymasz wewnatrz tego switcha to rzalibul.


To byłby prawdziwy hardcore smile.gif
megawebmaster
No hardcore winksmiley.jpg Jednak MVC ma moc smile.gif No i nie trzeba pisać takiego switcha, a kontrolery, których potrzeba.
Apocalyptiq
Dzięki za liczne odpowiedzi, więc jako dobry zamiennik switcha będzie ten MVC? Nie słyszalem przedtem o czymś takim, poczytam smile.gif
W grze via www którą niedawno robiłem, switch miał z 1000 wierszy biggrin.gif

A tak offtop, czytałem troche o języku Ruby, no i wygląda super, ma też jakiś famework do obsługi stron www (Ruby on Rails), ale trzeba go instalować na serwerze, bo raczej trudno chyba znaleźć serwer z zainstalowanym już Ruby. Używał ktoś kiedyś Ruby do tworzenia stron www? smile.gif
Kocurro
Sorry za offtopica.

Apocalyptiq jak chcesz pisać takie posty to lepiej zdejmij sobie ze stopki ten link i buttona - już google mnie przyprowadziło do tego tematu jak sprawdzałem "firmę" estender.net, szkoda sobie psuć wizerunek zadając takie pytania winksmiley.jpg

Potencjalny klient to zobaczy i odpuści a wierz mi, że klienci na których możesz dobrze zarobić prześwietlą Cię najpierw porządnie.

Pozdrawiam,
Łukasz

ps: w sprawie serwera z Rubym zapraszam na PW
Apocalyptiq
Dzięki za rade smile.gif

Hm, tak poczytałem o MVC, fajna sprawa. Ale też poczytałem o tym, że lepiej czasami stosować gotowe rozwiązania, np. Zend Framwork. On korzysta z modelu MVC? Ja jakoś lubię programować od podstaw... Używa ktoś tego Zend Framworka? Warto się tym zainsteresować? Np. do serwisu z newsami, artykulami, komentarzami i ocenami do nich z panelem admina do tego wszystkiego, będzie użyteczny? Bo niby takie proste serwisy raczej nie problem bez żadnych frameworków napisać.
megawebmaster
Szczerze Symfony z jego Admin-Generatorem ma większą moc od Zenda winksmiley.jpg Zend to raczej zbiór bardzo dobrych bibliotek i trzeba umieć z niego korzystać. A poza tym - chyba wszystkie frameworki korzystają ze wzorca MVC smile.gif
Apocalyptiq
Ja jednak spróbuje samemu napisać prosty system oparty o MVC - z użytkownikami (rejestracja, logowanie), newsami, artykułami, no i zapleczem adminowym do tego wszystkiego.

Mam jeszcze jedno pytanie co do tego MVC - przeczytałem tutorial o nim, ale nie było sprecyzowane, jak w tym Kontrolerze (sterowniku) przekierowywać na dane działanie, przez switch? smile.gif Np. user wszedł na podstronę z jakimś newsem, więc mam page=new i id=5 na przykład, więc muszę utworzyć switcha ze wszstkimi możliwymi akcjami (podstronami), a tam przy każdej będzie zawarte pobranie odpowiednich danych z bazy (model) i ich wyświetlenie (widok, u mnie odpowiada za to system szablonów PHPTAL, więc sprowadza sie to do załadowania odpowiedniego szablonu xml i przekazaniu do niego danych pobranych z bazy)? Bo wyżej mówiliście, że switch to złe wyjście, więc tu chyba go nie powinno być?
ikssde
Masz url w postaci :

a ) zendowy router umożliwia tworzenie takich urli

  1. <?php
  2. www.strona.pl/news/id/4, skrócony na
  3. www.strona.pl/news/4
  4. ?>


b ) bez bawienia się w rewrite

  1. <?php
  2. www.strona.pl/index.php?controller=news&action=show&id=4
  3. ?>


Następnie w swoim głównym kontrolerze (centrum aplikacji) odbierasz wpisany adres przy pomocy, np. $_GET i wiesz, że musisz wywołać kontroler o nazwie "news" i akcję należącą do tego kontrolera o nazwie "show", a także masz przekazać jej parametr "id=4".
Kontroler to nic innego jak klasa, pliki z kontrolerami możesz sobie includować z jakiegoś folderu, w razie braku pliku o podanej nazwie możesz dołączyć domyślny (np. z błędem), a potem to już tylko wywołujesz daną funkcję należącą do kontrolera(klasy).
Apocalyptiq
Dzięki, nieco mi to wyjaśniłeś smile.gif Więc najpierw ładuję kontroler klase News, ktorej przekazuje numer newsa. Ta klasa pobiera z bazy danych treść tego newsa i inne dane o nim jak data itp, następnie przekazuje to wszystko do widoku - tj. ładuje odpowiedni szablon html i wrzuca w zawartość w odpowiednie miejsce informacje o newsie? Więc ta klasa news (praktycznie należaloby ją nazwać "New", news to przecież nowości a nie nowość z ang smile.gif, no ale słowo New jest chyba zastrzeżone w php) będzie wyglądać tak:
  1. <?php
  2. class News{
  3. private $id;
  4. public $news;
  5. public function __construct($id){
  6. $this->news=$db->getRow('SELECT * FROM news WHERE id=?',$id); // $db - obiekt klasy PDO
  7. }
  8. }
  9. $news=new News($id);
  10. $szablon_html->news=$news->news
  11. ?>

Tak to by wyglądało? No i jeszcze musiałbym przekazać jakoś obiekt z bazą danych $db do klasy News, co tu pominąłem winksmiley.jpg
ikssde
W gwoli ścisłość ta architektura implementuje trzy elementy Model-Widok-Kontroler, u Ciebie są tylko dwa.

Masz kontroler (controllerNews) w którym odwołujesz się do modelu (news), w modelu (klasie) masz zbiór funkcji odpowiedzialnych za wszelkie działania na określonym zbiorze, w tym przypadku na nowościach, czyli, np. odczytywanie po id, odczytywanie wszystkiego, odczytywanie 3 najnowszych, itp.

  1. <?php
  2. class controllerNews {
  3.  
  4. ...
  5. public function show($id)
  6. {
  7.        $model = new News();
  8.        $widok->news = $model->getNews($id);
  9. }
  10. ...
  11.  
  12. }
  13.  
  14. class News {
  15.  
  16. ...
  17. public function __construct()
  18. {
  19.        ... laczenie sie z baza danych, itp....
  20. }
  21.  
  22. public function getNews($id)
  23. {
  24.        return $pdo->getRow('SELECT * FROM news WHERE id=?', $id);
  25. }
  26.  
  27. ?>
megawebmaster
@ikssde ładnie wytłumaczył - masz 3 warstwy - kontroler, który za pomocą modelu pobiera dane z bazy np. tak:
  1. <?php
  2. $model = new News;
  3. $dane = $model->pobierzNajnowsze();
  4. ?>

I dopiero teraz przekazujesz dane do widoku. Czyli do systemu szablonów. No i oprócz samego kontrolera wywołuje się w nim akcję (metodę), żeby ułatwić zarządzanie. Np. metoda index() w kontrolerze News odpowiada za wyświetlenie 10 najnowszych wiadomości i uruchamiana jest jak nie poda się innych metod. Metoda pokazJeden() w kontrolerze News odpowiada za wyświetlenie tylko jednej wiadomości o id, jaki przekażesz w URL'u.
Apocalyptiq
Dzięki za wytłumaczenie tego, ale jeszcze co do tej akcji index() nie rozumiem - nie ma być ona przecież funkcją __construct? Jak ma być uruchamiana jak sie nie poda innej metody (która rozumiem ma coś wyświetlać)?
megawebmaster
__construct() jest uruchamiane niezależnie od wszystkiego - czyli za każdym utworzeniem obiektu. Zaś metoda index() będzie działać tylko, jeśli ją wywołasz. Skrótem - do __construct() możesz wrzucić wszystko co się będzie powtarzać dla każdej akcji.

EDIT: Musisz decydować wcześniej przed tworzeniem kontrolera jaka metoda ma być wywołana. Jak nie ma żadnej wywołujesz index().
Apocalyptiq
Dzięki za wytłumaczenie tego mechanizmu smile.gif

Tak zacząłem czytać o tym Zend Framwork, no i z tego co czytałem wygląda na użyteczny, ale na wstępie zauważyłem jedną wadę - waży 17MB, ta minimalna wersja ;/ Może jakieś nieużywane biblioteki z tego można wywalić? Bo raczej nie wykorzystam wszystkich mozliwości Zenda przy np. stronce z newsami, artykułami, komentarzami i panelem admina do tego smile.gif
ikssde
Jak budujesz sobie stronę na podstawie Zenda, to nie dodawaj bibliotek Zend'owskich z automatu tylko je sobie includuj, żebyś później wiedział co jest wykorzystywane. Tym sposobem z 17mb zrobi Ci się 3 smile.gif Zresztą 17mb to chyba znowu nie aż tak dużo, no ale jak uważasz.

Tak przy okazji, jeśli chcesz korzystać z gotowych rozwiązań, a nie masz ochoty uczyć się masy innych niepotrzebnych (niekoniecznie potrzebnych) rzeczy, korzystaj z Zenda smile.gif Naprawdę dobrze się z tym pracuje, może Cię zniechęcić polski support, ale jeśli w miarę dobrze władasz angielskim nie będziesz miał najmniejszych problemów.
Apocalyptiq
Narazie coś nie mogę się w tym połapać - pracuje z PHPTALem, systemem szablonów - jest świetny i za nic nie chce z niego zrezygnować smile.gif Znalazłem gotowe rozwiązanie jak zintegrować Zend z PHPTALem, ale właśnie nie mogę się w tym wszystkim połapać. O MVC poczytałem, o Zendzie również troche. Ale w tym tutorialu jest troche dziwna struktura:
Cytat
|/application
| |/modules # modules directory
| | |/default # directory of the module named 'default'
| | | |/contollers # controllers of the default module
| | | |/views # views of the default module (may contain also helpers and filters)
| | | | /templates # templates of the default module (default ZF name is scripts)
| | | | /layouts # this one holds scripts (templates) for the IndexController
| | |/nextmodule
| | | |/controllers
| | | |/...

W folderze application jest folder modules, w którym są chyba wszystkie moduły, a w każdym module kontrollery do niego i widoki. Mi się zdawało, że to kontrollery mają być trzonem danej akcji, a nie moduły które tylko pobierają dane z bazy danych ;| A dodatkowo coś nie mogę tu znaleźć modułów - widzę tu tylko kontroller (w folderze controllers IndexController.php) i widok (layouts i templates w views, tj. główne szablony strony www i szablony podstron). Tak ta struktura powinna wyglądać? I gdzie są te moduły? smile.gif

A co mi w ogóle daje ten Zend że tak warto jego używać? Chyba nie problem napisać klasę kontrollera, modułu i widoku smile.gif Bo nie wiem czy warto wtajemniczać się w to, czy zabrać się za swój mały MVC framework.
megawebmaster
Warto, bo otrzymujesz pewne stabilne i pewne mechanizmy (np. Router, FrontController), które zostały sprawdzone przez wielu ludzi, więc przetestowane pod każdym możliwym względem.
AxZx
Cytat(Apocalyptiq @ 18.04.2009, 16:35:05 ) *
no nie, ale ściąga plik winksmiley.jpg


nie, nie ściąga pliku. przeglądarka pobiera tylko efekt działania pliku z php.
Apocalyptiq
Nawet bym przeszedł na Zend, ale wiem, gdzie są te moduły? No bo miały być te kontrollery - mam IndexController.php, widoki - w views są jakieś szablony, a gdzie sie podziały moduły? Struktura dwa posty wyżej

Narazie nie mogę dodać nawet podstrony drugiej :/ Dodałem plik NewsController.php do folderu z kontrollerami, tam klase NewsController, w szablonach dodałem folder news i tam index.tpl.html. A zend wywala mi:
Cytat
Fatal error: Uncaught exception 'Zend_Controller_Response_Exception' with message 'Cannot send headers; headers already sent in /home/szymon/domains/estender.net/public_html/framework/application/modules/default/controllers/NewsController.php, line 1' in /home/szymon/domains/estender.net/public_html/framework/library/Zend/Controller/Response/Abstract.php:281 Stack trace: #0 /home/szymon/domains/estender.net/public_html/framework/library/Zend/Controller/Response/Abstract.php(114): Zend_Controller_Response_Abstract->canSendHeaders(true) #1 /home/szymon/domains/estender.net/public_html/framework/application/Bootstrap.php(115): Zend_Controller_Response_Abstract->setHeader('Content-Type', 'text/html; char...') #2 /home/szymon/domains/estender.net/public_html/framework/application/Bootstrap.php(39): Bootstrap::sendResponse(Object(Zend_Controller_Response_Http)) #3 /home/szymon/domains/estender.net/public_html/framework/www/index.php(4): Bootstrap::run() #4 {main} thrown in /home/szymon/domains/estender.net/public_html/framework/library/Zend/Controller/Response/Abstract.php on line 281

Co robie nie tak?
megawebmaster
http://www.heavymind.net/zend-framework-tutorial/

Samouczek do Zenda po polsku. Co prawda jest tego tylko początek, ale początek jest najtrudniejszy wg. mnie winksmiley.jpg
ikssde
Moduły to nie modele. Równie dobrze możesz pominąć katalog z modułem default, jest to tylko takie udogodnienie, że w jednym module możesz umieścić stronę, a w drugim np. panel administracyjny.
Apocalyptiq
Tym razem robiłem wszystko od początku, zgodnie z tutorialem Zend Frameworka. Utknąłem przy tworzeniu podstrony do errora - stworzyłem ErrorController.php i error/error.phtml, ale przy wpisaniu jakiegoś nieistniejącego urla, wywala mi błąd:
Cytat
Fatal error: Uncaught exception 'Zend_Controller_Response_Exception' with message 'Cannot send headers; headers already sent in /home/szymon/domains/apocalyptiq.duu.pl/application/bootstrap.php, line 1' in /home/szymon/domains/apocalyptiq.duu.pl/library/Zend/Controller/Response/Abstract.php:281 Stack trace: #0 /home/szymon/domains/apocalyptiq.duu.pl/library/Zend/Controller/Response/Abstract.php(299): Zend_Controller_Response_Abstract->canSendHeaders(true) #1 /home/szymon/domains/apocalyptiq.duu.pl/library/Zend/Controller/Response/Abstract.php(727): Zend_Controller_Response_Abstract->sendHeaders() #2 /home/szymon/domains/apocalyptiq.duu.pl/library/Zend/Controller/Front.php(972): Zend_Controller_Response_Abstract->sendResponse() #3 /home/szymon/domains/apocalyptiq.duu.pl/public_html/index.php(48): Zend_Controller_Front->dispatch() #4 {main} thrown in /home/szymon/domains/apocalyptiq.duu.pl/library/Zend/Controller/Response/Abstract.php on line 281

Mój .htaccess w public_html:
Cytat
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L]

Hm, co robię nie tak?

Może to jest spowodowane tym, że mam nieco inny .htaccess niż kazali w tutorialu (zmieniłem nieco, ponieważ ten z tutoriala mi nie działał), oto ten z tutoriala:
Cytat
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]




Zainstalowałem XAMPPa (Ubuntu 8.10), może to wina serwera była że nie łykał tego .htaccess z tutoriala zenda. Jeszcze ściągam tam zenda, jak sprawdze czy coś to dało, dam znać smile.gif

Wrzucenie w .htaccess tego:
Cytat
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1

W koncu doprowadziło do działania Zenda smile.gif Tak czytam tutoriala, no i faktycznie Zend ma fajne funkcjonalności smile.gif

Jednak przeszedłem na Kohana Framework - tworzony przez społeczność a nie firmę, jest lżejsza, elastyczniejsza, po prostu super mi się na niej pracuje :-)
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.