Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Klasa formular, Jak się do tego zabrać?
Tarcil
post 23.01.2009, 13:07:30
Post #1





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 24.11.2006

Ostrzeżenie: (0%)
-----


Witam

Mam troszkę dzisiaj czasu i buszuję po forum. Nospor napisał gdzieś, że do generowania formularzy (i zabezpieczenia się przed F5) używa własnej klasy (chyba, że źle zrozumiałem jego wypowiedź).

Jako, że próbuję się "otrzaskać" z obiektowo zorientowanym php od razu powstał w mej łepetynie pomysł "napisz sobie klasę do formularzy"... No i faktycznie, pomysł mi się podoba bo jednak formularzy jest mnóstwo na stronach, przy których coś usiłuję dłubać i gdyby się udało fajną klasę do tego zrobić, byłoby spoko.

Na razie wymyśliłem to tak:
1. Główna klasa to oczywiście klasa formular
2. Do niej dodałbym klasę formField, której właściwości to $_name (nazwa pola, do wrzucenia w name="") $_label (do wrzucenia w <label></label>) i $_desc (opis pola)
3. po klasie formField dziedziczyłyby klasy inputField (z właściwością type, czyloi wartością parametru type=""), selectField (z metodą addOption), textareaField itd...
4. Strukturę formularza tworzyłbym w sposób przybliżony do tego:
  1. <?php
  2. $form = new formular();
  3. $field = new inputField('name', Nazwa, 'wpisz swoje imię');
  4. $filed2 = new selectField('plec', 'Płeć', 'wybierz płeć');
  5. $filed2->addOption('k', 'kobieta');
  6. $filed2->addOption('m', 'mężczynza');
  7.  
  8. $form->generateHTML();
  9. ?>

wynikiem ostatniej metody byłby gotowy kod formularza.

Co Wy o tym myślicie? Jaki jest lepszy sposób na to? Jeszcze muszę tu gdzieś zapodać metodę insertValue(), która by wpisywała domyślną wartość... i do pól typu checkbox i do selecta jeszcze coś w rodzaju selectCurrentValue(). Ale czy wg Was podstawowe założenia mają sens? Jeśli nie, to wskażcie mi proszę luki w moim rozumowaniu.

Pozdrawiam!
Tarcil
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
chiken
post 14.02.2009, 22:59:48
Post #2





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 31.07.2006
Skąd: Czeladź

Ostrzeżenie: (0%)
-----


hmmm, narazie korzystam z domyslnych wygladow, dla selecta, checkboxa, oraz radio, ogolnie jak poustawiam style to sa male roznice,

i dla klienta to nie problem smile.gif hehe,

ale dzieki za wyjasnienie, zgadzam sie ze aby formularze zrobic podobne dla kazdej przegladarki jak sa pola jak wyzej, to jest porazka.



Mam kilka pytan smile.gif
klasy i obiekty uzywam od jakiegos czasu, ale postanowilem wziasc sie porzadnie za to, i chce dobrze wszystko zrozumiec, i stosowac jak najlepiej smile.gif
dlatego ponizej tego calego kodu, beda pytania smile.gif , mam nadzieje ze ktos odpowie smile.gif
  1. <?php
  2. class form {
  3.  
  4.    #####################################################################
  5.    #    Klasa do generowania Formularzy                                    #
  6.    #                                                                    #
  7.    #####################################################################
  8.    
  9.    protected $enctype='multipart/form-data';
  10.    protected $method=array('post','get');
  11.    protected $action='';
  12.    protected $form=array('method'=>'','action'=>'','enctype'=>'','id'=>'','class'=>'','style'=>'');
  13.    public $elements=array();
  14.    
  15.    function __construct($method='post',$action='',$enctype=null,$id=null,$class=null,$style=null)
  16.    {
  17.        if (!in_array($method,$this->method)) die('bledny parametr method. Podaj: post lub get');
  18.        $this->form['method']=$method;
  19.        $this->action=$action;
  20.        if ($enctype) $this->setEnctype(1);
  21.        $this->form['id']=$id;
  22.        $this->form['class']=$class;
  23.        $this->form['style']=$style;
  24.    }
  25.    public function setEnctype($set=0)
  26.    {
  27.        if ($set) $this->form['enctype']=$this->enctype;
  28.            else $this->form['enctype']=null;
  29.    }
  30.    public function setAction($set='')
  31.    {
  32.        $this->action=$set;
  33.    }
  34.    public function setMethod($set='')
  35.    {
  36.        if (!in_array($set,$this->method)) die('bledny parametr method. Podaj: post lub get');
  37.        $this->form['method']=$set;
  38.    }
  39.    public function setId($set='')
  40.    {
  41.        $this->form['id']=$set;
  42.    }
  43.    public function setClass($set='')
  44.    {
  45.        $this->form['class']=$set;
  46.    }
  47.    public function setStyle($set='')
  48.    {
  49.        $this->form['style']=$set;
  50.    }
  51.    public function newInput($type='submit',$name='name',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');')
  52.    {
  53.        $this->elements[$name]=new input($type,$name,$value,$id,$style,$class,$onclick);
  54.    }
  55.    public function newInput2($type='submit',$name='name',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');')
  56.    {
  57.        return new input($type,$name,$value,$id,$style,$class,$onclick);
  58.    }
  59.  
  60.    public function generate()
  61.    {
  62.        $t='<form action="'.$this->action.'"';foreach($this->form as $id=>$val) $val?$t.=' '.$id.'="'.$val.'"':'';$t.='>';
  63.        $t.="r\n";
  64.        foreach ($this->elements as $id)
  65.            $t.=$id->generate();
  66.        $t.='</form>';
  67.        return $t;
  68.    }
  69.  
  70. }
  71.  
  72. class input {
  73.    
  74.    ################################################################################
  75.  
  76.    #    Klasa do generowania Input                                                    #
  77.    #    <input type="text" value="" name="" id="" style="" class="" onclick="">        #
  78.    ###########################################################################
  79. #####
  80.    
  81.    protected $field= array('type'=>'','name'=>'name','value'=>'','id'=>'','style'=>'','class'=>'','onclick'=>'');
  82.    protected $type= array('text','hidden','image','submit','checkbox','radio');
  83.    
  84.    function __construct($type='text',$name='name',$value='value',$id=null,$style=null,$class=null,$onclick=null)
  85.    {
  86.        if (!in_array($type,$this->type)) die('bledny parametr type. Podaj: text, hidden, image, lub submit');
  87.        $this->field['type']=$type;
  88.        $this->field['name']=$name;
  89.        $this->field['value']=$value;
  90.        $this->field['id']=$id;
  91.        $this->field['style']=$style;
  92.        $this->field['class']=$class;
  93.        $this->field['onclick']=$onclick;
  94.    }
  95.    /*Pobiera wartosci z field, jesli danej value nie ma. Sprawdza czy istnieje w field, jesli nie ma to killuje proces*/
  96.    public function __get($name){
  97.        if (!isset($this->field[$name]))
  98.            die('Brak danego pola w bazie które możesz wywołać $obiekt -> '.$name.'!<br/>');
  99.        else return $this->field[$name];
  100.    }
  101.  
  102.    /*Jesli nie ma danego pola, tworzy w tablicy nowe, i ustawia wartość*/
  103.    public function __set($name, $value){
  104.        if ($name=='type')
  105.            $this->setTyp($value);
  106.        else
  107.            $this->field[$name]=$value;
  108.    }
  109.  
  110.    public public function setTyp($type)
  111.    {
  112.        if (!in_array($type,$this->type)) die('bledny parametr type. Podaj: text, hidden, image, lub submit');
  113.        $this->field['type']=$type;
  114.    }
  115.    public function generate()
  116.    {
  117.        $t='<input ';foreach($this->field as $id=>$val) $val?$t.=$id.'="'.$val.'" ':'';$t.='/>';
  118.        $t.="r\n";
  119.        return $t;
  120.    }
  121.    
  122. }
  123.  
  124.  
  125.    $form=new form($method='post',$action='aa',$enctype=1,$id='id',$class='c',$style='s');
  126.    $form->setEnctype(1);
  127.    $form->setAction('');
  128.    $form->setMethod('post');
  129.    $form->setId('identyfikator');
  130.    $form->setClass('class');
  131.    $form->setStyle('style');
  132.    
  133.    $form->elements['input1']=new input($type='text',$name='name1',$value='value wyslij',$id='id',$style='style',$class='class',$onclick='');
  134.    $form->elements['input1']->id='nowe_id';
  135.    $form->elements['input2']=new input($type='submit',$name='name2',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');');
  136.    $form->newInput($type='submit',$name='name3',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');');
  137.    $form->elements['name3']->id='test';
  138.    $form->elements['input4']=$form->newInput2($type='radio',$name='name4',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');');
  139.    $form->elements['input4']->class='klasa';
  140.    
  141.    echo $form->generate();
  142. ?>

Wynik:
  1. <form action="" method="post" enctype="multipart/form-data" id="identyfikator" class="class" style="style">
  2. <input type="text" name="name1" value="value wyslij" id="nowe_id" style="style" class="class" />
  3. <input type="submit" name="name2" value="value wyslij" style="style" class="class" onclick="return confirm('click');" />
  4. <input type="submit" name="name3" value="value wyslij" id="test" style="style" class="class" onclick="return confirm('click');" />
  5. <input type="radio" name="name4" value="value wyslij" style="style" class="klasa" onclick="return confirm('click');" />
  6. </form>


Zaczne od konca smile.gif

Zdefiniowalem klase input,
field, i type jest protected, stosuje funkcje __get, oraz __set do ustawiania pol field, praktyczne to jest?
funckje generate() - zwracaja kod html.

wywolanie funkcji input:

$c=new input($type='text',$name='name1',$value='value wyslij',$id='id',$style='style',$class='class',$onclick='');
$c->id='nowe_id';
echo $c->generate();

w konstruktorze ustawiam najwazniejsze rzeczy smile.gif , reszte mozna ustawic poprzez:
$c->id, $c->value itp,
stosuje sie takie cos? dla mnie ladnie to wyglada winksmiley.jpg ale nie wiem jeszcze czy to jest praktyczne smile.gif. Chcialem zawezic funckcje magiczne tylko dla pol fields ale chwilowo to pominalem (musialbym dac wszystkie mozliwe pola jakie input moze posiadac).

funckją setTyp($value) ustawiam type inputa, przez oddzielna funkcje, poniewaz trzeba miec kontrole akurat nad tym jednym polem smile.gif


A teraz klasa Form,

jak w klasie input, najwazniejsze parametry ustawiam poprzez konstruktor,
nastepnie kazda opcje formularza mozna ustawic tylko przez metody do tego stworzone smile.gif

mam tutaj glownie pytania, jak tworzyc nowe pola w takim formularzu smile.gif

dalem 4 sposoby:

  1. <?php
  2. $form->elements['input1']=new input($type='text',$name='name1',$value='value wyslij',$id='id',$style='style',$class='class',$onclick='');
  3.    $form->elements['input1']->id='nowe_id';
  4.    $form->elements['input2']=new input($type='submit',$name='name2',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');');
  5.    $form->newInput($type='submit',$name='name3',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');');
  6.    $form->elements['name3']->id='test';
  7.    $form->elements['input4']=$form->newInput2($type='radio',$name='name4',$value='value wyslij',$id=null,$style='style',$class='class',$onclick='return confirm('click');');
  8.    $form->elements['input4']->class='klasa';
  9. ?>

jak trzeba wyjasnien do tych sposobow napiszcie, a wyjasnie smile.gif najbardziej optymalna wedlug mnie jest metoda z input4[name4]


--------------------
Projektowanie stron internetowych
Go to the top of the page
+Quote Post

Posty w temacie
- Tarcil   [PHP] Klasa formular   23.01.2009, 13:07:30
- - bim2   Ok, ok a do czego twoim zdaniem w tym wypadku będz...   23.01.2009, 15:53:00
- - Crozin   @bim2: class Field extends Form? Eeee... a co to m...   23.01.2009, 16:24:17
- - bim2   Hmm, inputy należą do forma. Można by znać indetyf...   23.01.2009, 17:36:07
- - pinochet   Tez cos takiego pisalem ale nie dopisalem pozatym ...   23.01.2009, 18:43:24
- - Tarcil   Jak pisałem, zaczynam się bawić w oop. Obiekt form...   24.01.2009, 11:43:23
- - Black-Berry   Z doświadczenia moge powiedziec ze lepiej sprawdza...   29.01.2009, 14:49:25
- - WaterIntelligence   Ostatnio zaprojektowałem klasy formularzy, które p...   2.02.2009, 11:38:28
- - Tarcil   Dzięki za porady Teraz muszę skończyć jedno pseu...   4.02.2009, 11:16:58
- - Black-Berry   Jeśli o mnie chodzi to czekam z niecierpliwośćią b...   4.02.2009, 13:50:00
|- - chiken   Cytat(Black-Berry @ 4.02.2009, 13:50...   14.02.2009, 14:13:26
|- - Black-Berry   Cytat(chiken @ 14.02.2009, 14:13:26 )...   14.02.2009, 14:50:52
- - chiken   hmmm, narazie korzystam z domyslnych wygladow, dla...   14.02.2009, 22:59:48
- - bim2   troche dzina konstrukcja, moim zdaniem powinno to ...   15.02.2009, 14:07:16
- - chiken   z definiowaniem klasy form, sie zgadzam, jeszcze u...   15.02.2009, 17:37:02
- - bim2   ale oczywiscie, html elements ma miec tylko dane r...   15.02.2009, 17:39:00
- - chiken   hmmm, a nie lepiej tworzyc obiekty w klasie html_e...   15.02.2009, 17:46:39
- - Black-Berry   Idealnie powinno być tak: [PHP] pobierz, plaintex...   15.02.2009, 18:10:24
- - chiken   dzieki za nakierowanie, wlasnie cos podobnego plan...   15.02.2009, 18:29:44
- - bim2   Ale co za prbolem z validacją? Validacja w tych kl...   15.02.2009, 20:19:32
|- - Black-Berry   Cytat(bim2 @ 15.02.2009, 20:19:32 ) A...   15.02.2009, 21:04:15
- - Whisller   Jakiś czas temu (od wersji 1.21.1 pomyliły mi się ...   15.02.2009, 21:19:12
- - Black-Berry   @bim2 Idea fajna ale z punktu widzenia profesjonal...   15.02.2009, 21:20:07
- - bim2   Ni potrzeba frameworka. Parsuje pregami fdokument ...   15.02.2009, 22:55:22
- - chiken   jak dla mnie ze tak powiem zamotane, powinno sie...   15.02.2009, 22:57:22
- - Black-Berry   Trochę tak. Zasada minimalizmu zawsze się opłaca:/   15.02.2009, 23:52:03
- - bim2   No nie wiem, bardzo ładnie działa i dodanie kolejn...   16.02.2009, 15:36:06
|- - chiken   Cytat(bim2 @ 16.02.2009, 15:36:06 ) N...   16.02.2009, 21:53:27
- - destroyerr   Oczywiście symfony ma formularze w obecnej postaci...   16.02.2009, 15:41:50
- - Crozin   @chlken: checkJavascript() to pewnie coś co genere...   17.02.2009, 08:18:00
- - chiken   no musiialem nie doczytac hehe   17.02.2009, 08:23:51


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:40