Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [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
bim2
post 23.01.2009, 15:53:00
Post #2





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Ok, ok a do czego twoim zdaniem w tym wypadku będzie służyło new formular();

Zresztą czemu taka dzwina nazwa? class Form {} class Field extends Form {} class InputField extends Field {} smile.gif


--------------------
Go to the top of the page
+Quote Post
Crozin
post 23.01.2009, 16:24:17
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@bim2: class Field extends Form? Eeee... a co to ma niby wspólnego ze sobą? smile.gif
W obiekcie formularza jak najbardziej może znajdować się kolekcja obiektów dziedziczących po Field (które najprawdopodobniej będzie klasą abstrakcyjną)
Go to the top of the page
+Quote Post
bim2
post 23.01.2009, 17:36:07
Post #4





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Hmm, inputy należą do forma. Można by znać indetyfikator forma i później w fieldzie operować na nim. Mam zaawansowaną obsługę walidacji, gdzie wykorzystuję id forma, jak jest jak nie ma sam przypisuje a później fieldy potrzebują jakiś uchwyt do niego smile.gif


--------------------
Go to the top of the page
+Quote Post
pinochet
post 23.01.2009, 18:43:24
Post #5





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

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


Tez cos takiego pisalem ale nie dopisalem pozatym byly to moje poczatki z OOP:] ... chętnie zobacze jak inni to rozwiązali ...
ja mialem cos takiego:
  1. <?php
  2. $form = new HTMLForm();
  3. $form->setType('POST');
  4. $form->setName('logowanie');
  5. $form->setAction('formularz.php');
  6. $form->addField(array('type'=>'TEXT', 'name'=>'login', 'maxlength'=>'50', 'valreg'=>'NULL'));
  7. $form->addField(array('type'=>'PASSWORD', 'name'=>'pass', 'maxlength'=>'50', 'valreg'=>'NULL'));
  8. $form->addField(array('type'=>'SUBMIT', 'name'=>'submit', 'maxlength'=>'1', 'valreg'=>'NULL', 'value'=>'Wy�lij'));
  9. echo $form->getHTML();
  10. ?>

dodatkowo jeszcze byly parametry value, class(CSS), ID, valreg(nazwa funkcji validującej dane pole lub metody w klasie validatora zraca true lub komunikat błędu.)
oprocz HTML obiekt potrafił zwracac XML(specjalna skladnia na potrzeby skryptu ...) i importowac formularz z XML + sprawdzanie poprawnosci z XSD. Byla tez mozliwosc zwracania tablicy z poszczególnymi polami formularza, aby można łatwo było formatowanie zmieniac i przekazac to w jakis sensowny sposob np do SMARTY. w opisie poszczególnego Field znajduje się tez komunikat wyswietlany w przypadku błędnie wypełnionego pola ...
warto tez pomyslec nad jakims cachowaniem bo przeciez formularze w większości nie są dynamiczne. ewentualnie jedna klasa runtime ... druga generator :]

Ten post edytował pinochet 23.01.2009, 18:44:17
Go to the top of the page
+Quote Post
Tarcil
post 24.01.2009, 11:43:23
Post #6





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

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


Jak pisałem, zaczynam się bawić w oop. Obiekt formular miał zawierać dane formularza (więc właściwie wartości parametrów znacznika FORM) i w jakiś sposób grupować obiekty Field. Field zawierałby te dane, ktore są wspólne dla każdego z pól formularza, a obiekty inserField i im podobne miałyby dziedziczyć wspólne własności po Field i "obsługiwałyby" różnice pomiędzy typami pól.

Dzięki wszystkim za wypowiedzi... postaram sie w najbliższych dniach coś poskładać i ewentualnie wrzucę wyniki mojej pracy.

Pozdrawiam
Tarcil
Go to the top of the page
+Quote Post
Black-Berry
post 29.01.2009, 14:49:25
Post #7





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Z doświadczenia moge powiedziec ze lepiej sprawdzają się pojedyncze obiekty generujące pola - przykład:

  1. <?php
  2. $input = new TextInput();
  3. $input->label = 'Imie i nazwisko';
  4. $input->width = 500;
  5. $input->top = 100;
  6. $input->left = 20;
  7. $input->onclick = 'some javascript';
  8. $input->name = 'imie_i_nazwisko';
  9. $input->generate();
  10. ?>


Oczywiście należy napisać kilkanaście klas takich jak Select, FileInput, Button, CheckBox itd...
Kiedy już masz wszystkie klasy wyswietlające mozna zabrać się do etapu tworzenai klasy form. (Jeszcze nie doszedłem do tego etapu smile.gif ).

Dlaczego takie rozwiązanie:
-Bo każda przeglądarka z tego samego kodu generuje coś innego. Metoda generująca musi wykryć typ przeglądarki i uwzględnić to dodając odpowiednie style. To bardzo przyspiesza pracę.

Moze ci się to rpzyda. Pozdrawiam.


--------------------
Go to the top of the page
+Quote Post
WaterIntelligenc...
post 2.02.2009, 11:38:28
Post #8





Grupa: Zarejestrowani
Postów: 7
Pomógł: 1
Dołączył: 29.09.2008
Skąd: Świdnica

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


Ostatnio zaprojektowałem klasy formularzy, które powiązałem z Xajaxem. Dodatkowo dodałem klasy walidujące, które są używane przez formularze jak i inne klasy w aplikacji korzystające z tych samych danych.
Jeden formularz miał z reguły około 15 pól, z czego było parę formularzy różniących się między sobą rodzajami pól. Tworzenie klasy formularza to dobry pomysł. Ja zrobiłem tak że teraz jeśli chce dodać formularz definiuję nową klasę o nazwie np. Form_MojFormularz{} w której
1. dodaje kolejno obiekty formularza (input, checkbox itd). -> metoda setFields()
2. implementuje metodę, która pobiera dane z bazy jeśli chcę wyświetlić w tym formularzu dane ->setFieldsData()
3. określam po id, które pola mają być wyłączone (disabled) -> setDisabledFields()
4. implementuje metodę zapisującą dane z formularza do bazy
Można tworzyć obiekty z jednej klasy Form i tam ustawiać nazwę formularza, jednak doszedłem do wniosku, że dla moich potrzeb lepiej jest tworzyć nowe klasy dla nowych formularzy ponieważ istnieje potrzeba implementacji metod takich jak np. zapis do bazy danych.

Możesz zastosować np. Dekorator dla dodawania pól do nowego obiektu formularza, ja akurat z tego nie skorzystałem bo zmniejszyłaby się czytelność mojego kodu i pola dodaje bezpośrednio wewnątrz nowej klasy formularza (do kolekcji $objTagsCollection), a kontroler w roli klienta służy mi jedynie do: uruchomienia formularza/określenia z jakiego walidatora ma korzystać kalsa formularza/określenia pliku szablonu .phtml dla formularza/określenia czy formularza pobierany jest przez wywołanie Ajaxowe czy POST.

Inny patent (uzupełniając to co napisał Black-Berry) to np. każda klasa pola (TagInput{}, TagSelect{} itd) posiada metodę insertMeToXajaxResponse($objXajaxResponse). Formularze tworzę właśnie używając biblioteki Xajax, ale zostawiam możliwość wygenerowania formularza zwykłym POST'em określając to w kontrolerze. Metoda insertMeToXajaxResponse() jest w każdej klasie Taga ponieważ każdy tag w nieco inny sposób dodaje się do odpowiedzi Ajax, można oczywiście zdefiniować odrębną klasę menadżera np. AjaxFormManager{} i jej przypisać odpowiedzialność za dodawanie pól do odpowiedzi Ajax, ale to już chyba kwestia wybrania konkretnej drogi w projekcie. winksmiley.jpg

Ponadto każda klasa pola/taga posiada obiekt klasy TagError, jeśli podczas walidacji danych z bazy coś jest nie tak automatycznie zmienia się jego kolor na czerwono lub wykonywane są inne akcje (pomijam dlaczego zapisuje błędne dane do bazy - akurat jest taka potrzeba).

Dzięki tworzeniu klasy formularza zauważysz naprawdę sporo zależności więc zachęcam do pracy.

Ten post edytował WaterIntelligence 2.02.2009, 11:42:22


--------------------
Go to the top of the page
+Quote Post
Tarcil
post 4.02.2009, 11:16:58
Post #9





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

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


Dzięki za porady smile.gif

Teraz muszę skończyć jedno pseudoforum dla firmy z mojego miasta. Potem mam wolne od projektów póki co, więc znów dosiądę do ćwiczenia nowych rzeczy w php. Jak napiszę klasę to wrzucę, ocenicie czy się do czegokolwiek nadaje.

Na razie pozdrawiam!
Go to the top of the page
+Quote Post
Black-Berry
post 4.02.2009, 13:50:00
Post #10





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Jeśli o mnie chodzi to czekam z niecierpliwośćią bo jak będę miał już wszystkie kontrolki to chcę to połączyć w klasę Formularz. Niestety kilka razy już próbowałem i poziom abstrakcji mnie przerósł. Poległem na walidacji dlatego póki co piszę inputy. Najgorsze że większość z nich trzeba całkowicie ukrywać (opticy:0) a na ich miejsce wstawiać własne - oskryptowane obrazki.


--------------------
Go to the top of the page
+Quote Post
chiken
post 14.02.2009, 14:13:26
Post #11





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

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


Cytat(Black-Berry @ 4.02.2009, 13:50:00 ) *
Najgorsze że większość z nich trzeba całkowicie ukrywać (opticy:0) a na ich miejsce wstawiać własne - oskryptowane obrazki.


mozesz dokladniej wyjasnic?

ja wlasnie powoli tworze klase do formularzy smile.gif bo czesto potrzebuje rozne i rozbudowane, wraz z walidacja danych.
mam nadzieje ze taka klasa spooro czasu bedzie w przyszlosci oszczedzac smile.gif

zobaczymy co z tego wyjdzie winksmiley.jpg


--------------------
Projektowanie stron internetowych
Go to the top of the page
+Quote Post
Black-Berry
post 14.02.2009, 14:50:52
Post #12





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Cytat(chiken @ 14.02.2009, 14:13:26 ) *
mozesz dokladniej wyjasnic?


Jeśli masz np. input typu file lub chociaż zwykły checkbox i jeśli będziesz chciał nadać tym inputom jakiś konkretny wygląd - bardzo szybko zauważysz że każda przeglądarka stosuje wolną amerykankę. Często zamiast checkboxa stosuję taki kod

  1. <input type="chck" style="opticy:0;"/>
  2. <img src="fakeCheckBox.gif" onclick="checkboxClicked();"/>


Trzeba oczywiście to jeszcze oskryptować ale dzięki nałożeniu obrazka na ukryty input mamy pewnosć, że każda przeglądarka wyrenderuje to samo. Kod odpowiedzialny za generowanie takieo kodu opkakowuję sobie w klasę i póżniej mogę już stosować ją zamiast męczyć się z przeglądarkami

  1. <?php
  2. $check = new HtmlElement_Checkbox();
  3.    $check->selected = true;
  4.    $chcck->left = '15px';
  5.    $check->top = '20px;'
  6.    echo $check->HtmlCode();
  7. ?>


Staram się uzyskac coś podobnego do obiektu formularza znanego z Delphi czy Visual C++. Tworzę też zaawansowane kontrolki np HtmlElement_ImageList, HtmlElement_TextEditor(w oparciu o tinyMCE) czy HtmlElement_ImageUploadBox

Podałem tylko 1 przykład ale takich kontrolek trzeba napisać kilkanaście. Najwięcej zabawy jest z <input type="file" /> bo oczywiście każda przeglądarka inaczej rozumie width smile.gif Funkcja wykrywająca przeglądarkę jest niezbędna. Zacznij od niej w swoim framworku. Powodzenia!


--------------------
Go to the top of the page
+Quote Post
chiken
post 14.02.2009, 22:59:48
Post #13





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
bim2
post 15.02.2009, 14:07:16
Post #14





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


troche dzina konstrukcja, moim zdaniem powinno to być tak:
  1. <?php
  2. $oForm = new Form('action', 'get', true); // ostatnie pyta czy ma stworzyc Enctype :)
  3. $oForm->setArg('class', 'costam');
  4.  
  5. class Form extends HTML_Elements {
  6. public function  __construct($sAction, $sMethod, $sEnctype = false)
  7. {
  8. $this->setArg('action', $sAction);
  9. $this->setArg('method', $sMethod);
  10. }
  11. }
  12. class HTML_Elements {
  13. public function setArg($sName, $sValue)
  14. {
  15. $this->aArgs[$sName] = $sValue;
  16. }
  17. }
  18. ?>

Cos takiego


--------------------
Go to the top of the page
+Quote Post
chiken
post 15.02.2009, 17:37:02
Post #15





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

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


z definiowaniem klasy form, sie zgadzam, jeszcze ulepsze,

ale wedlug mnie to zly pomysl umieszczac tworzenie pol w jednej klasie html_elements,

chyba ze bedzie klasa form, dziedziczaca po html_elements, a w html_elements bedzie dodawalo sie odpowiednie pola, a kazde pole jest oddzielnym obiektem jak u mnie.

Wydaje mi sie ze to bylo by najlepsze wyjscie smile.gif

co wy na to ?

jesli nie moze byc kazde pole definiowane przez obiekt, podaj mi wyjasnienie dlaczego smile.gif jesli mozesz


--------------------
Projektowanie stron internetowych
Go to the top of the page
+Quote Post
bim2
post 15.02.2009, 17:39:00
Post #16





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


ale oczywiscie, html elements ma miec tylko dane regulki

class Input extends HTML_ELEMENTS {} itd.

ale robisz tak
$oInput = new Input();
$oForm = new Form();
$oForm->append($oinput);
  1. <?php
  2. public function append(HTML_elements 4oElement)
  3. {
  4.  
  5. }
  6. ?>


--------------------
Go to the top of the page
+Quote Post
chiken
post 15.02.2009, 17:46:39
Post #17





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

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


hmmm, a nie lepiej tworzyc obiekty w klasie html_elements ? wydaje mi sie niepotrzebne tworzyc pozaklasa form, a pozniej przenosic do klasy smile.gif

dla mnie to troche nielogiczne


--------------------
Projektowanie stron internetowych
Go to the top of the page
+Quote Post
Black-Berry
post 15.02.2009, 18:10:24
Post #18





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Idealnie powinno być tak:

  1. <?php
  2. $form = new Form();
  3. $group = new Group();
  4. $group->addItem(new Form_Item());
  5. $form->addGroup($group);
  6. ?>


Już samo napisanie generatora kodu to nie mały problem ale to i tak przysłowiowy 'pikuś' jeśli zaczniemy myśleć o walidacji (walidacji PHP a nie JS). Ja osobiscie chciałbym mieć poniższe metody:

  1. <?php
  2. $item->validation(/*argumenty walidacji*/);
  3. ?>


a do tego najlepiej żeby była metoda

  1. <?php
  2. $form->onValid(/*przekierowanie lub funkcja wykonująca się jeśli form jest poprawnie wypełniony*/);
  3. ?>


i tu zaczynają się schody. Bez definiowania akcji która wykonuje się po zwalidowaniu formularza cała praca jest niepotrzebna bo do generowania kodu HTML wystarczą same kontrolki smile.gif Na ostatni podany przeze mnie problem nie znalazłem jeszcze dobrego rozwiązania. Pomyślę może jak zrobię sobie wszystkie inputy. Pozdrawaim.


--------------------
Go to the top of the page
+Quote Post
chiken
post 15.02.2009, 18:29:44
Post #19





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

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


dzieki za nakierowanie, wlasnie cos podobnego planowalem zrobic, ale jeszcze mi nie calkiem switalo w glowie,

sposob walidacji juz takze mam w glowie, bo mam odpowiednie funkcje zrobione, oraz sposob wyswietlania, wiec tylko trzeba to dobrze do klasy wcisnac smile.gif


--------------------
Projektowanie stron internetowych
Go to the top of the page
+Quote Post
bim2
post 15.02.2009, 20:19:32
Post #20





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Ale co za prbolem z validacją? Validacja w tych klasach to pikuś bez klas, tj szukaniu w kodzie <input> smile.gif U mnie w FW, klasa Template przekazuje gotową templatkę do Error która pobiera sobie inputy i szuka w nich error=""

tj.
  1. <input type="text" error="min[10] max[30] noempty" />
  2. <input type="text" error="checkmail">

On sobie rozpoznaje, i wywoluje
Error_Check_Min[_Max][_Checkmail]

Naprawdę validacja to pikuś...


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.07.2025 - 13:49