Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ison lomakkeen virhekäsittely

Sivun loppuun

Jyri [03.10.2008 11:45:09]

#

Terve!

Aloitin tuossa muutama päivä sitten PHP-projektin, jossa tarvitsee käsitellä erittäin iso lomake. Lomake siis on ihan normaali HTML-formi, mutta siinä on 15 -inputtia, pari textareaa ja 7 radio-buttonia.
Nyt scripti on periaatteessa muuten valmis, mutta käyttäjälle tarvitsisi vielä näyttää, jos hän täyttänyt lomakkeen väärin. Ajattelin tehdä siihen järjestelmän, jossa virheellistä dataa sisältävä input-kenttä muuttuu punaiseksi ja sen viereen tulee virheilmoitus.
Nyt ongelmana on se, että aina kun haluan tarkistaa, onko käyttäjä täyttänyt inputin oikein, täytyy minun käydä läpi $errors taulukko, jossa on pahimmillaan 17 alkiota. Tämä taulukko täytyisi siis käydä tarkistuksessa läpi noin 25 kertaa.
Eli kysymykseni on: onko liian raskasta välittää $errors taulukko funktiolle parametrina, sen läpikäymistä varten? Tämä siis todella tapahtuisi 25 kertaa...

Chiman [03.10.2008 12:02:08]

#

Ei tuo kuulosta raskaalta, vaikken ymmärräkään miksi virhetaulukko pitäisi käydä kokonaan läpi joka kierroksella. Voit luoda taulukkoon avain-arvo-pareja, joissa avaimina toimivat lomakkeen input-kenttien nimet. Siten voit yhdellä if-ehdolla tutkia, onko lomakkeen tietyssä kentässä virhettä.

<?php

echo '<input type="text" name="address" value="'. htmlentities($_REQUEST['address']) .'" />';
if ($form_errors['address']) {
    echo '<span class="errornote">'. $form_errors['address'] .'</span>';
}

?>

Jos text-inputit ovat peräkkäin, ne voi luoda silmukalla.

Teuro [03.10.2008 12:21:51]

#

Lomakkeita varten kannattaa myös miettiä luokkaa olioita varten, jolloin ne voidaan kerätä taulukkoon, josta niiden käsittely on erittäin yksinkertaista. Minulla on omilla sivuilla juuri kuvatunlainen järjestelmä käytössä ja se toimii minusta ihan hyvin.

Pieni esimerkki alle.

<?php
require("luokat/Clomake.php");

$oliot[] = new Ctext("etunimi", true, "", "anna etunimesi");
$oliot[] = new Ctext("sukunimi", true, "", "anna sukunimesi");
$valinta[] = new CradioElement("mies");
$valinta[] = new CradioElement("nainen");
$oliot[] = new Cradio("sukupuoli", true, $valinta);

piirraLomake($oliot);
?>

Tällä tavalla saadaan kaikki html-merkaus siirrettyä pois php-koodin seasta sotkemasta, ja kaikki lomakkeet ovat varmuudella samanlaisia. Muodostumissa on mahdollisuus valita onko kenttä täytettävä vai ei. Olisiko tässä tilausta koodivinkille?

tsuriga [03.10.2008 12:39:26]

#

<?php

class FormHelper
{

    protected $_elements;
    protected $_errors;

    public function __construct()
    {
        $this->_elements = array();
        $this->_errors = array();
    }

    public function addElement($id, $type, $value='')
    {
        $this->_elements[$id] = array(
                                       'type' => $type,
                                       'value' => $value
                                     );
    }

    public function addError($element, $msg)
    {
        $this->_errors[$element] = $msg;
    }

    public function getElementCode($id)
    {
        $markup = '<input type="%s" name="%s" id="%s" value="%s" />';
        $markup = sprintf(
                           $markup,
                           $this->_elements[$id]['type']
                           $id,
                           $id,
                           $this->_elements[$id]['value']
                         );

        if (isset($this->_errors[$id])) {
            $markup .= '<span class="error">' . $this->_errors[$id] . '</span>';
        }

        return $markup;
    }
}

?>

Ja mitä pidemmälle tuota jalostaa, sitä lähemmäksi se menee frameworkeista jo valmiiksi löytyviä vastaavia.

EDIT: Ja yllä kerittiinkin jo ehdottaa, tässä hatusta kiireessä vedetty esitys, jossa on myös tuo virheilmoitusten liittäminen. Toivottavasti siitä saa jonninlaista kuvaa.

Chiman [03.10.2008 12:41:50]

#

Teuro, tuollainen voi olla kätevä, mutta helposti tulee eteen tilanteita, jotka pitää toteuttaa jotenkin toisin. Miten hyödyntäisit tuota Jyrin tilanteessa, eli virheilmoitusten liittämisessä kentän viereen?

Sinänsä html-merkkauksen irrottaminen php-koodista on järkevää. Itse käytän siihen Smartyä.

Teuro [03.10.2008 13:02:27]

#

Mun tapauksessa koodi tekee punaiset reunukset kenttien ympärille, joihin ei ole asetettu vaadittavaa arvoa. Milä tavalla asiat pitäisi tehdä eri tavalla? Virheen käsittelyn kannalta tuskin kovin monella tapaa. Piirtäminen lienee aika samanlaista aina. Mulla luokalla on (yllättäen) eri metodit konkreettisen datan hallintaa varten ja piirtoa varten. Yksilöllinen virhetieto kentän viereen on aika helppoa luomalla uusi solu kentän viereen, johon tulostetaan virhetieto.

Olio siis tallentaan itseensä virhetiedon / virheille on oma luokka, jonka annaVirhe() metodia kutsutaan olion kautta. Voitko antaa jonkin esimerkin, jota ei voi mielekkäästi toteuttaa edellä mainitulla tavalla?

Chiman [03.10.2008 13:21:19]

#

Teuro kirjoitti:

Milä tavalla asiat pitäisi tehdä eri tavalla?

Esimerkiksi lomakkeen muotoilun kannalta. Jos haluaa eri input-tekstikentät eri pituisiksi, tarvitaan lisää parametreja Ctext-oliolle.

En siis ole tyrmäämässä luokkaasi, päinvastoin. Mietin vain sen yleistä sovellettavuutta tilanteissa, joihin olen törmännyt. Koodivinkkinä se olisi varmasti hyödyllinen.

Miten esimerkiksi hoidat virhetilanteen, jossa sähköpostikentässä ei ole @-merkkiä? Eli onko virhetarkistus integroitu noihin luokkiisi, vai tapahtuuko se ensin muualla ja syötät virheilmoituksen (esim. Ctext-) olion muodostimelle ylimääräisenä parametrina?

Edit: Tai ylimääräisenä oliona, taisit tarkoittaa. Tulostuuko lomake taulukkona (<table>, <tr>, <td>)? Virhekentät tulostuvat tällöin omalle rivilleen (<tr>)?

Teuro [03.10.2008 13:29:33]

#

Chiman kirjoitti:

Esimerkiksi lomakkeen muotoilun kannalta. Jos haluaa eri input-tekstikentät eri pituisiksi, tarvitaan lisää parametreja Ctext-oliolle.

Totta tuo olisi pitänyt ottaa huomioon, melkoisen helppo muokata onneksi kuitenkin.

chiman kirjoitti:

Miten esimerkiksi hoidat virhetilanteen, jossa sähköpostikentässä ei ole @-merkkiä? Eli onko virhetarkistus integroitu noihin luokkiisi, vai tapahtuuko se ensin muualla ja syötät virheilmoituksen (esim. Ctext-) olion muodostimelle ylimääräisenä parametrina?

Minulla on yleinen virheentarkistus tyhjille kentille. Jokaiselle oliolle voi speliasisoida oman virheentarkistuksen, jolloin ensin tarkistetaan yleisellä metodilla epätyhjyys ja sitten spesiaalimetodilla syötteen oikeellisuus.

Email-oliolle voi siis rakentaa sähköpostiosoitteen tarkistamiseen erikoistuneen metodin. Mahdollista on myös kutsua tarkistusmetodia, joka kutsuu spesiaaliametodia, mikäli sellainen löytyy. Tässä olisikin kehiteltävää...

Jyri [03.10.2008 13:37:58]

#

Lähinnä siis kysymykseni oli vain, että onko tyhmää välittää taulukko niin monta kertaa funktiolle.
Tuo olio tekniikka näyttää todella kätevältä. Olenkin usein miettinyt, miten voisin irroittaa HTML:n php:stä.

Teuro [03.10.2008 13:45:26]

#

Jyri kirjoitti:

Lähinnä siis kysymykseni oli vain, että onko tyhmää välittää taulukko niin monta kertaa funktiolle.
Tuo olio tekniikka näyttää todella kätevältä. Olenkin usein miettinyt, miten voisin irroittaa HTML:n php:stä.

Taulukko pitää antaa funktiolle tasan kerran, jos se logiikka on tehty edes lähes fiksusti. HTML irroitus php:ä on varsin suositeltava tapa toimia.

tsuriga [03.10.2008 14:21:30]

#

Ajatusvirtaa asiasta koodivinkin vääntämiseen:

Teuro [03.10.2008 14:30:37]

#

Hyviä pointteja tsuriga. Mulla tämä lähti ihan pienestä ajatuksesta ja halusta oppia, miten tällainen komponentti toimii. Ei tässä koodivinkin ainesta taida ollakaan. Tosin on tuolla vinkkien puolella huonompiakin nähty. Tosin se ei oikeuta tällaisten räpellysten julkaisuun.

frameworkien kanssa enemmän ohjelmoineet voivat kertoa niiden ominaisuuksista ja esitellä, koska paremmin tietävät niiden toiminnan itse tuskin koskaan otan käyttööni tuollaista, mutta koskaan ei tule sanoa ei koskaan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta