Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: projektowanie kontrolera
Forum PHP.pl > Forum > PHP
pikornecki
Witam,

Chciałbym zaprojektować wydajny kontroler. Znalazłem taki artykół na stronie http://php.pl/Wortal/Artykuly/Proces-tworz...anie-Kontrolera, w którym switch pełni rolę takiego kontrolera:
  1. switch ( @$_GET['action'] ) {
  2. case 'edit':
  3. include ('actions/edit.php');
  4. break;
  5. case 'post':
  6. include ('actions/post.php');
  7. break;
  8. case 'delete':
  9. include ('actions/delete.php');
  10. break;
  11. case 'default':
  12. include ('actions/view.php');
  13. break;
  14. }


I teraz moje pytanie, chciałbym tak jak w tym przykładzie użyć switcha do obsługi menu złożonego z takich imputów:

  1. <input class="menuButtons" type="submit" value="Załaduj obrazki" name="addImagesButton"/>


Teraz pytanie, nawet jeśli zastosuję takiego samego name(a) dla 10 przycisków jak zastosować to w switchu? Co dla mnie będzie casem?


EDIT: chciałbym dodać że chce operować POST a nie GET
tabbi
a nie można w:

switch ( @$_POST['action'] ) {

i odpowiednio zmieniać value w inputach

albo zrobić tablice np. name=mirrors[action][value]
CuteOne
Dla każdego guzika będziesz robił oddzielny <form action="xxx"></form>?? Podany przez Ciebie przykład z artykUłu dotyczy bardziej linków niż submitów. Poza tym zamiast switchów wygodniej jest zrobić sobie tablicę z danymi modułów.

  1.  
  2. $modules = array(
  3. 'main' => array('main.php', 1),
  4. 'logowanie' => array('login.php', 1),
  5. //itd...
  6. );
  7.  
  8. if(array_key_exists($_GET['action'], $modules)) {
  9.  
  10. if($modules[$_GET['action']][1] == 1) {
  11.  
  12. include $modules[$_GET['action']][0];
  13. }
  14. }


A jeszcze wygodniejszym rozwiązaniem jest zaangażowanie do tego celu bazy danych


EDIT: fakt zamiast in_array powinno być array_key_exists wink.gif dzięki fifi
Sagnitor
Hm, twojego switch'a da się zastąpić instrukcją if, else przy okazji filtrując dane.

  1. $sAction = $_GET['action']; // Tutaj należy dodać filtrowanie zmiennej.
  2.  
  3. if(file_exists('./actions/'.$sAction.'.php'))
  4. {
  5. include ('./actions/'.$sAction.'.php');
  6. } else {
  7. include ('./main.php'); // W tym miejscu includujemy lub przekierowujemy na stronę główną
  8. }
  9.  


To są najprostsze i najbardziej prymitywne przykłady wink.gif.

Pozdrawiam
AndyPSV
uzywam czegos bardziej skomplikowanego - [SPAM]
  1. function loadMod($m) {
  2. $uri = explode(';',$m); if(!empty($uri[1])) $m = $uri[0]; $pth = DIR_MOD.strtolower($m).N.INX.PHP; $q = q('SELECT id FROM `'.PRFX.'c0'.LG.'` WHERE url = "'.$m.'" LIMIT 1'); if(n_r($q) == 0) {
  3. if(file_exists($pth)) include_once($pth); else { header(LOC.URL,true,301); exit; } } else include_once(DIR_MOD.strtolower('pg').N.INX.PHP);
  4. } if(empty($_GET[0]) or substr($_GET[0],0,1) == '?') loadMod(PG_H_MOD); else { if(ctype_digit($_GET[0])) loadMod('ad'); else { if(ctype_digit(end(explode(',',$_GET[0])))) loadMod('ad'); else {
  5. if(substr($_GET[0],0,3) == 'buy') loadMod(substr($_GET[0],0,3)); elseif(is_dir('m/'.$_GET[0])) loadMod($_GET[0]); else {
  6. $q = q('SELECT id,t FROM '.PRFX.'ads WHERE uri = "'.$_GET[0].'" LIMIT 1'); if(n_r($q) > 0) { $ad = f($q); exit(header(LOC.URL._url($ad['t']).','.$ad['id'])); } else exit(header(LOC.URL));
  7. }
  8. }}


kod umozliwia otworzenie wszystkiego.
Fifi209
Cytat(CuteOne @ 15.07.2011, 18:59:54 ) *
  1.  
  2. $modules = array(
  3. 'main' => array('main.php', 1),
  4. 'logowanie' => array('login.php', 1),
  5. //itd...
  6. );
  7.  
  8. if(in_array($_GET['action'], $modules)) {
  9.  
  10. if($modules[$_GET['action']][1] == 1) {
  11.  
  12. include $modules[$_GET['action']][0];
  13. }
  14. }

Jak dla mnie array_key_exists zamiast in_array

Cytat(Sagnitor @ 16.07.2011, 13:00:20 ) *
Hm, twojego switch'a da się zastąpić instrukcją if, else przy okazji filtrując dane.

  1. $sAction = $_GET['action']; // Tutaj należy dodać filtrowanie zmiennej.
  2.  
  3. if(file_exists('./actions/'.$sAction.'.php'))
  4. {
  5. include ('./actions/'.$sAction.'.php');
  6. } else {
  7. include ('./main.php'); // W tym miejscu includujemy lub przekierowujemy na stronę główną
  8. }
  9.  


To są najprostsze i najbardziej prymitywne przykłady wink.gif.

Gdzie w tym kodzie filtracja? Jakiś ctype_ czy preg_match ukryty? A może filter_var? Nawet brak podstawy jaką jest basename
Sagnitor
@UP

Wstawiłem kod bez filtracji i pokazałem miejsca, w których powinna sie odbywać. Być może słabo sprecyzowałem swoją wypowiedź.
-=Peter=-
Cytat(AndyPSV @ 16.07.2011, 12:16:21 ) *
  1. function loadMod($m) {
  2. $uri = explode(';',$m); if(!empty($uri[1])) $m = $uri[0]; $pth = DIR_MOD.strtolower($m).N.INX.PHP; $q = q('SELECT id FROM `'.PRFX.'c0'.LG.'` WHERE url = "'.$m.'" LIMIT 1'); if(n_r($q) == 0) {
  3. if(file_exists($pth)) include_once($pth); else { header(LOC.URL,true,301); exit; } } else include_once(DIR_MOD.strtolower('pg').N.INX.PHP);
  4. } if(empty($_GET[0]) or substr($_GET[0],0,1) == '?') loadMod(PG_H_MOD); else { if(ctype_digit($_GET[0])) loadMod('ad'); else { if(ctype_digit(end(explode(',',$_GET[0])))) loadMod('ad'); else {
  5. if(substr($_GET[0],0,3) == 'buy') loadMod(substr($_GET[0],0,3)); elseif(is_dir('m/'.$_GET[0])) loadMod($_GET[0]); else {
  6. $q = q('SELECT id,t FROM '.PRFX.'ads WHERE uri = "'.$_GET[0].'" LIMIT 1'); if(n_r($q) > 0) { $ad = f($q); exit(header(LOC.URL._url($ad['t']).','.$ad['id'])); } else exit(header(LOC.URL));
  7. }
  8. }}


kod umozliwia otworzenie wszystkiego.


Nie zdziwię się jeśli to spaghetti otwiera też puszkę konserwową.
Fifi209
Cytat(Sagnitor @ 16.07.2011, 15:40:18 ) *
Wstawiłem kod bez filtracji i pokazałem miejsca, w których powinna sie odbywać.

Trzeba było podsunąć pomysł na filtrację skoro wiesz o co chodzi. smile.gif

Równie dobrze możesz dać kluczyki do auta 10-latkowi i powiedzieć, że może jechać gdzie chce.
Dałeś mu kod, jeszcze biedak użyje w takiej wersji bo może nie wie jak przefiltrować? 10 razy nic się nie stanie, za 11 ktoś wykorzysta brak filtracji.
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.