Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Klasa formular
Forum PHP.pl > Forum > PHP > Object-oriented programming
Tarcil
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
bim2
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
Crozin
@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ą)
bim2
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
pinochet
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 :]
Tarcil
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
Black-Berry
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.
WaterIntelligence
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.
Tarcil
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!
Black-Berry
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.
chiken
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
Black-Berry
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!
chiken
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]
bim2
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
chiken
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
bim2
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. ?>
chiken
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
Black-Berry
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.
chiken
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
bim2
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ś...
Black-Berry
Cytat(bim2 @ 15.02.2009, 20:19:32 ) *
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=""


Cikawe podejście.
Whisller
Jakiś czas temu (od wersji 1.21.1 pomyliły mi się numerki winksmiley.jpg) w symfony także zastosowano klasy formularzy połączone z walidatorami. Warto się także przyjrzeć jak oni to rozwiązali - http://www.symfony-project.org/book/forms/1_2/en/
Black-Berry
@bim2 Idea fajna ale z punktu widzenia profesjonalnego kodu troche to do mnie nie przemawia. Mam rozumieć że stosujesz parser? Czy to nie jest mało wydajne? Sposób też wymaga gotowego frameworka który ma kontrolery.

Moze jakieś momysły na Pakiet Standalone ?smile.gif
bim2
Ni potrzeba frameworka. Parsuje pregami fdokument szukając <form error="true">. Później z pomiędzy <form> wyciągam inputy, selecty itd. przekazuje tablicę do sesji i po kliknięciu wyślij wywoluje
if($this->checkForms())
które sprawdza dane. Obsługuje także js dopisując zdarzenia onSubmit
chiken
jak dla mnie ze tak powiem zamotane,

powinno sie wydzielic widok, i nic pozniej nie wyciagac z szablonow, lub innych rzeczy,

takie sprawdzanie to dla mnie jazda pod gorke smile.gif
Black-Berry
Trochę tak. Zasada minimalizmu zawsze się opłaca:/
bim2
No nie wiem, bardzo ładnie działa i dodanie kolejnych sprawdzaczy to pikuś, bo interfejs wymaga dwóch metod, check i checkJavascript smile.gif Bardzo fajne i ułatwia pracę...
destroyerr
Oczywiście symfony ma formularze w obecnej postaci od wersji 1.1 ale to szczegół, warto jednak wspomnieć, że formularze te to subframework, czyli działają niezależnie od symfony. Mi pracuje się z nimi wygodnie, ale formularze z zend framework pewnie też są godne przyjrzenia się im. Kohana też coś próbuje mieć, jednak to młody projekt i w sumie ciężko coś ustalić. Pewnie jest wiele więcej frameworków, czy też osobnych rozwiązań. Warto się im przyjrzeć chcąc napisać własne formularze, w przeciwnym wypadku nie ma to chyba sensu, o ile w ogóle jakiś ma.
chiken
Cytat(bim2 @ 16.02.2009, 15:36:06 ) *
No nie wiem, bardzo ładnie działa i dodanie kolejnych sprawdzaczy to pikuś, bo interfejs wymaga dwóch metod, check i checkJavascript smile.gif Bardzo fajne i ułatwia pracę...


ty sprawdzasz bledy tylko po stronie js ? czy takze php?
Crozin
@chlken: checkJavascript() to pewnie coś co genereuje kod JS odpowiedzialny za sprawdzanie po stronie klienta, a check() po stronie serwera.
chiken
no musiialem nie doczytac smile.gif hehe
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.