Avatar
user
Redaktor
Avatar
user:

Ahoj,
nedari se mi prijit na problem se zpracovanim $_POST pozadavku, nikdzy jsem se s timto problemem nesetkal a nevim jestli se mi podari spravne vyjadrit...
Nicmene ti kteri se s timto problemem jiz setkali by mi mohli pomoci, predem diky za pomoc.

Jde o to ze mam formular, ktery kdyz odeslu na spracovani, tak mi php skoci do vetve empty post, zde se zobrazi defaultni stranka, formular se tim padem vubec nespracuje... ale, kdyz predam defaultni strance $_SESSIONS['post'] s poslednim obsahem $_POST (promenou $_POST vkladam do sessions ve vetvi !empty($_POST){} !!!) V defaultni strance uz vsechny $_POST data z formulare existuji...

Zajimave je ze kdyz odeslu jiny formular, napr. login/logout , funguje vse bez problemu...

pridam asi radsi nejaky kod:

if( !empty($_POST) )// zpracovani $_POST pozadavku - tu vetev php preskoci
        {
            $_SESSION["post"] = $_POST;
            $this->accessManagerController();

}elseif (   empty($_POST) //zpracovani $_GET pozadavku, neni zadny post pozadavek
         && isset($_GET)
         && isset($_GET[self::_param1])
        )
        {


        }/*elseif (empty($_POST)) {// pokud je vetev definovana, zkoci sem, jinak do else nize
            echo var_dump($_POST); // => vysledek = empty $_POST, data z formulare "neexistuji"

        }*/else
            echo View::getDefaultPage();
    }
___________
View::getDefaultPage():

getDefaultPage()
{
return self::getLayout(self::menu(self::MembersSubmenu(), self::AccessSubmenu(self::getAccessForm())), var_dump($_SESSION["post"]));
// vysledek je existujici $_POST, vypisi se vsechny data ktere jsem do formulare pred odeslanim zadal
}
 
Odpovědět 26.8.2012 3:57
Avatar
user
Redaktor
Avatar
Odpovídá na user
user:

samozrejme kod sem prochazel asi stokrat, zadna chyba v syntaxi nebo tak...
uz nevim co s tim....

 
Nahoru Odpovědět 26.8.2012 4:08
Avatar
Kit
Redaktor
Avatar
Kit:

Strkat obsah $_POST do $_SESSION není zrovna nejlepší nápad.

Test isset($_GET) je zbytečný. Pole $_GET existuje vždy, i když si nejsem jist, jestli je dostupné uvnitř třídy. Ještě jsem to nezkusil.

Co je obsahem proměnné self::_param1? Je v ní název indexu? Proč jednoduše nepoužiješ $_GET['parametr']?

Větev empty post tam nevidím. Jestli myslíš tu zakomentovanou, tak ta se nikdy neprovede, protože je odchycena už v první podmínce.

Takhle se dnes dělá MVC? V tom bych se nevyznal.

Nahoru Odpovědět 26.8.2012 6:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
user
Redaktor
Avatar
user:

:) $_POST do $_SESSION strkám jen v této ukázce, abych "ukázal" že data z $_POST jsou dostupná až po ukončení zpracování formuláře... $_GET v mé třídě není vždy dostupné.
self::_param1 je název parametru, Jinak jsem se pokusil vyjádřit "jádro" problému, což se mi očividně nepovedlo, což teď už chápu (po přečtení mého příspěvku) takže se omlouvám za zmatek, byl jsem "rozpálený", :) a nepomyslel jsem na to že vy vlastně o tom jak můj kód funguje nevíte vůbec nic. Ukázka s mím kódem nemá nic moc společného. Pokusím se ještě jednou snad to bude lepší... (doufám)
Pro Controller používám vzor singletron (běží na jedné instanci), V jeho konstruktoru mám front controller, nejdříve ověřím zde je zaslán nějaký $_POST požadavek (v první větvi), pokud ano, zpracuji, pokud ne tak ověřím jestli existuje nějaký $_GET parametr a jestli má platnou hodnotu, pokud ano, zpracuji na základě té hodnoty parametru, pokud ne v poslední větvi (else{})zobrazím defaultní stránku, (uživatel nic nechce). Jak jsem psal vše funguje bezvadně třeba u modulu pro přihlášení aj.. Problém je že, právě formulář pro registraci, se nechce zpracovat. Tzn. ve front controlleru přejde do poslední větve else a zobrazí se defaultní stránka... (první větev = $_POST požadavek, druhá = $_GET požadavek. Protože není definován $_POST (i když by po odeslání regis. formuláře měl být definován) ani $_GET, skočí do else...

 
Nahoru Odpovědět 26.8.2012 7:30
Avatar
Kit
Redaktor
Avatar
Odpovídá na user
Kit:

Singleton se používá jen tam, kde je to nezbytně nutné. Controller není ten případ.

Uvědom si, že když se zpracuje 1. větev, tak další se už neprovedou.

Podmínky empty($_POST) a isset($_GET) není třeba testovat, protože v daném místě jsou splněny vždy.

Celé mi to připadá značně chaotické. Proč to děláš tak složitě? Když použiješ Simple Factory tak to bude krásně přehledné a nebude to zlobit.

Nahoru Odpovědět 26.8.2012 7:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
user
Redaktor
Avatar
user:

Na Simple Factory se ještě podívám, jinak singleton mi přišel že se mi sem právě docela hodí...

K těm větvím, právě že je splněna vždy jen jedna:

if( !empty($_POST) )
{
   // Zpracuji požadavek a přesměruji, (do další větve už nepolezu)

}elseif (   empty($_POST)
         && isset($_GET["parametr"])
         && array_key_exists(ValidateInputController::validateInput($_GET["parametr"], FALSE),$arr_request)// pokud parametr je v poli povolených parametrů
        )
        {
            $func = $arr_request[ValidateInputController::validateInput($_GET["parametr"], FALSE)];// struktura $arr_request je = array("getParametr"=>"volanaMetoda")
            return $this->$func();// Zavola danou metodu, treba sowRegistrationPage()

}else
    echo View::getDefaultPage();

Jestli máš lepší řešení, budu jen rád když mě s ním seznámíš :)

 
Nahoru Odpovědět 26.8.2012 8:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na user
Kit:

Na co ten Sigleton potřebuješ? Většinou k ničemu jinému, než k otevření databáze. V ostatních případech je lepší se mu vyhnout. Je to antipattern. Skoro bych řekl, že se nehodí k ničemu, až na výjimky.

Ve druhé větvi nemusíš testovat podmínku empty($_POST), protože je splněna vždy, když není splněna podmínka pro první větev.

Proč používáš statické objekty? Proč voláš ValidateInputController::validateInput() 2× za sebou? Kam ukládáš výsledek validace $_GET["parametr"]? A proč vlastně validuješ, když to používáš jako index do slovníku $arr_request?

Nahoru Odpovědět  +1 26.8.2012 8:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
user
Redaktor
Avatar
Odpovídá na Kit
user:

S návrhovými vzory moc zkušeností nemám, ale u toho singletonu se mi hlavně líbila přectava, že se pořád pracuje s jednou instancí objektu, proč vytvářet pokaždé novou stejnou instanci? K otevření databáze jí ani nepoužívám, pro to používám PDO s vlastní statickou třídou, tam vlastně taky pracuju jen s jedním spojením... Dvakrát validovat nemusím, to máš pravdu, validuji proto, že nevím zda by se dal použít nějaký záškodný kód, což si myslím že dal, jistota je jistota :) , Statické objekty používám jen v případě database a jedné třídy View, kde mi to tak přišlo lepší...

 
Nahoru Odpovědět 26.8.2012 9:00
Avatar
Kit
Redaktor
Avatar
Odpovídá na user
Kit:

Tak ještě jednou a naposled: Singleton je na ho..o. Zapamatuj si to.

Celé se to bezpečně dá udělat třeba takto i bez pole $arr_request:

function factory() {
   if(!empty($_POST)) return new ZpracujPost($_POST);
   if(isset($_GET["parametr"]) {
      switch($_GET["parametr"]) {
         case 'getParametr': return new ZpracujGetParametr($_GET);
         case 'jinyPrikaz':  return new ZpracujJinyPrikaz($_GET);
         default: return new UzivatelJeKretenKteryMeChceHacknout($_GET);
      }
   }
   return new DefaultPage();
}

$objekt=factory();
echo $objekt;
Nahoru Odpovědět 26.8.2012 9:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
user
Redaktor
Avatar
Odpovídá na Kit
user:

Asi máš pravdu, Díky za příklad

 
Nahoru Odpovědět 26.8.2012 9:26
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kit
Kit:

V tom mém příkladu chybí jedna uzavírací závorka. Jinak by to mělo být funkční. Samozřejmě je možné na $_POST udělat úplně stejný switch jako na $_GET["parametr"] a tím tu továrničku dovést k dokonalosti.

Když se konstruktorům přidá další parametr $model, vznikne z toho přehledná realizace MVC.

Nahoru Odpovědět 26.8.2012 13:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.