ugrás a tartalomhoz

Szerver vs kliens oldal; mit hova?

fchris82 · 2008. Okt. 1. (Sze), 12.44
Az lenne a kérdésem, hogy ki mit helyez át szerver oldalról a kliensre és miért? Mik a tapasztalatok? Bennem most teljes a dilemma. Egyrészről van egy nyomás, hogy minél felhasználóbarátabbak legyenek a formok, amit pl extjs-sel szépen meg is lehetne oldani, de van-e értelme JS-ből generálni a form-ot is? És szerver oldalról csak egy XML-t vagy JSON-t átadni, hogy hogyan is nézzen ki a form.
A másik oldalról meg ott van az, hogy most Symfony szépen legenerálja a form-ot, csak ott nem lesz azonnali a validálás, és nem lehet oldal újratöltés nélkül behozni egy klikkre egy formot. És ott van az is, hogy a felhasználó kikapcsolja a JS-t. Szóval? Ki, hol és hogyan csinálja?
 
1

Form validáció

vbence · 2008. Okt. 1. (Sze), 13.18
Ugyebár szerveroldalon mindenképpen kell. Aztán vannak olyan elleőrzések, amik további adatokat igényelnek, ezeket nem célszerű a kliensoldalon megoldani.

A kielsoldali ellenőrzés nagyrésze (beleértve a kötelező kitöltést) meoldható regex-szel, ami szerveroldalon éppúgy használható (feltéve, persze hogy a kifejezés a böngésző és a szerver implementációja számára is érthető). Készíthetsz egy közös "kottát" a formodhoz, amit megért a szerver és a kliens is, ezt json-ben elküldöd a formmal együtt.

Vannak logikai ellenőrzések, amik több mező között valósulnak meg. Pl: a kezdeti dátum mindig kisebb kell legyen a befejezési dátumnál. Ekkor vagy készítesz magadnak egy mező-alapú réteget, ami lekezeli a mezők tipusait és egyszerű relációkat (pl. kisebb), ekkor a "kottád" részévé teheted ezeket is. Vagy (ami egyszerübb) megírod az ellenőrzést JS-ben a kliensnek, és PHP-ban a szervernek. Ekkor ott a lehetőség, hogy különbözni fog a két feltétel, vagy elfelejted az egyiket módosítani.

A JS-generált form megengedhető egy olyan oldalon, amihez a JS kritikus feltétel (pl egy webalkalmazás), de egy álagos odalon, pl webáruház, szigorúan tilos :)

Szóval nem könnyű kérdés. Szerintem az újratöltés belefér. Ha jól írtad meg az oldal többi részét, a felhasználó nem fogja tudni megkülönböztetni az újratöltést egy AJAX kéréstől (a mai böngészők megfelelően gyors válasz esetén villanásmentes újrarajzolásra is képesek).
2

Ez egyértelmű

fchris82 · 2008. Okt. 1. (Sze), 14.09
Az teljesen egyértelmű, hogy az ellenőrzést a szerver oldalon megismétlem.
3

Nem ez volt...

vbence · 2008. Okt. 1. (Sze), 14.33
a lényegi része. :)
4

Symfony és ajax

zila · 2008. Okt. 1. (Sze), 17.25
Másrészről mintha a symfony-val nagyszerűen lehetne ajax-ot használni. Mondjuk csak dokumentációból tudom, mert nem használtam még ezt a részét soha...
5

transzparens validátorok

Hodicska Gergely · 2008. Okt. 5. (V), 02.48
Én ezt nagyon régen úgy oldottam meg, hogy a validátorok automatikusan tudtak JS ellenőrzést is, és csak egy opció volt egy form esetében, hogy van-e kliens oldali validáció, vagy sem. Ha pedig a megjelenítésben volt szükség az alaptól eltérő működésre, akkor lehetett saját form renderert definiálni.

Csodálkozom, hogy a symfony nem ezzel jött ki (elvileg ugye az sfFrom volt az egyik újdonság), ezt már pl. QuickForm is tudja ősidők óta.

Egy példa:
<?php                                                                                                                                                                                                                                       
        include_once(CORE_CLASS_DIR.'ValidationRule.php');                                                                                                                                                                                  
                                                                                                                                                                                                                                            
        class regexpRule extends ValidationRule {                                                                                                                                                                                           
                function regexpRule()                                                                                                                                                                                                       
                {                                                                                                                                                                                                                           
                        $this->_defErrMsg = 'A***paramName*** nem megfelelő!';                                                                                                                                                              
                        $this->_argsNeeded = array('regexp');                                                                                                                                                                               
                }                                                                                                                                                                                                                           
                                                                                                                                                                                                                                            
                function _doValidation(&$request, &$value, &$ruleData)                                                                                                                                                                      
                {                                                                                                                                                                                                                           
                        if (strlen($value) == 0 && !$ruleData['isMandatory'] && !isset($ruleData['args']['skipMandCheck'])) {                                                                                                               
                                return true;                                                                                                                                                                                                
                        } else {                                                                                                                                                                                                            
                                return preg_match($ruleData['args']['regexp'], $value);                                                                                                                                                     
                        }                                                                                                                                                                                                                   
                }                                                                                                                                                                                                                           
                                                                                                                                                                                                                                            
                function getJsValidatorFunctionBody()                                                                                                                                                                                       
                {                                                                                                                                                                                                                           
                        $script = <<< EOFF                                                                                                                                                                                                  
        obj = getObjByName(form, name);                                                                                                                                                                                                     
        obj.value = obj.value.trim();                                                                                                                                                                                                       
        if ( obj.value == "" && !isMandatory && typeof(args['skipMandCheck']) == 'undefined') return true;                                                                                                                                  
        var regexp = eval(args["regexp"]);                                                                                                                                                                                                  
        return regexp.test(obj.value);                                                                                                                                                                                                      
EOFF;                                                                                                                                                                                                                                       
                        return $script;                                                                                                                                                                                                     
                }                                                                                                                                                                                                                           
                                                                                                                                                                                                                                            
        }                                                                                                                                                                                                                                   
?>
Nagyon régi kód, de olyan szempontból érdekes lehet, hogy a fenti felállásban ugyanaz a regexp használható PHP és JS oldalon is.