Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obiektowe formularze
Forum PHP.pl > Forum > PHP > Object-oriented programming
Vengeance
Witam,

Daje ten wątek tu a nie na "Oceny" gdyż tam bardziej pasują projekty zakończone.
Moje, to jedynie biblioteka w rozwoju :]

Napisałem w ciągu ostatnich trzech dni troche kodu php5, mającego za zadanie
generowanie formularzy, ich automatyczną walidację po stronie JavaScript jak i php.

Przykład: http://vengeance.strefaphp.net/ObjectForms/Example.php5
Źródło przykładu: http://vengeance.strefaphp.net/ObjectForms/source.php

A oto źródła obecnej wersji tego co napisałem: http://vengeance.strefaphp.net/ObjectForms/ObjectForms.zip

Byłbym wdzięczny za jakieś uwagi, sugestie. Uważam, iż API jak i możliwości są wystarczająco dobre. Jednak nie zadowalają mnie niektóre obecne rozwiąznaia w samym kodzie. Np. realizacja wykrywania błędów podczas walidacji i wyświetlanie stosownego komunikatu obok Input.

Jeżeli byście byli tak uprzejmi i zaproponowali jakieś swoje (wg was lepsze) rozwiązania pewnie wspólnymi siłami mogła by powstać niezła biblioteka uprzyjemniająca prace nam wszystkim.

Obecnie najlepiej "rozbudowane" są Textarea oraz Input typu Text/Password
Selecty, checkboxy i radio nie są jeszcze oprogramowane.

Pozdrawiam.
NuLL
Jestem trochę spiący więc kodu samego nie komentuję. Ale mam wskazówkę - sporo pomysłow możesz znaleść w PEAR::QuickForm napewno :-)
Vengeance
Wiesz... wpadłem na to w połowie projektu i jak się okazało (mimo iż QuickForm w życiu na oczy wcześniej nie widziałem) to 60% kodu była bardzo podobna :]


Ale nie chce używać pakietów PEAR, a pomysły zawsze ściągnąć można
NuLL
No dobra coś napisze. Dla osobiście za dużo kodu. Można być napisać nakładkę aby mieć coś ala:

  1. <?php
  2.  
  3. $f=new form();
  4. $f->addInput();//w nawiasie jakies cos
  5.  
  6. ?>

addInout byłby nakładkę na tworzenie obiektu Input, można by mu podać regułki itp i wszystko w samej metodzie smile.gif
Vengeance
Jak dla mnie kodu wcale nie jest dużo jak na ilość operacji które skraca.
Jako że biblioteke raczej ja będę wykorzystywał (inni zazwyczaj i tak wolą pisać zawsze swoje własne) to nie skorzystam z propozycji :]

Ma ktoś pomysł na te errory?
Nievinny
O, @Vee -> niekoniecznie, zaglądnąłem i myślę, że jak będzie trochę dopracowana (Ty albo ja, dla mnie nie stanowi to różnicy) to warto ją wykorzystać.
nospor
Twoja klasa ma jedną poważną wadę, która uniemożliwi korzystanie z tej kalsy szerszym odbiorcom.
Nie ma możliwości rozmieszczania elementów tam gdzie się chce. W tej chwili lecą chyba jeden pod drugim.

pozatym zgadzam się z @Null za dużo funkcji by jedno pole wygenerować. jedno addInput powino wystarczyć (w mojej klasie wystarcza, no i można dowolnie umieszczać elementy biggrin.gif )
NuLL
Wg. dobrym pomysłem jest generowanie formularzy z plików XML biggrin.gif Pracuje nad czymś takim ale z braku czasu nie idzie. Wtedy generowanie formularza to jest jedna linijka co oszczędza napradę sporo kodu.
Vengeance
@nospor, wręcz odwrotnie! Do każdego pola możesz dodać dowolne (w ramach specyfikacji html) atrybuty jak np. class czy style. Wszystko da się ułożyć jak tylko główa zamarzy dzięki CSS.

Efekt "wszystko pod sobą" w przykładzie jest dlatego iż właśnie zastosowano tam krótki CSS w postaci "dislpay: block;" co powoduje wyświetlanie pod sobą. Ale możliwości wg mnie są ogromne. No może
nie oblejesz formularza w tabelki, ale powiedzmy sobie szczerze na co to komu :] Tabelka i tak nie do tego sluży ;P


Co do ilości kodu: Przecież u mnie ten Input to 2 linie. Najpierw nowy obiekt Input a potem dodanie go do Formy przez AddChild().

A cała reszta kodu to tworzenie tagów <label> czy <legend> bo niby czemu miały by być generowane automatycznie przez klase Input? Przecież właśnie chodzi nam o osiągnięcie maksymalnie elastycznego układu wyświetlania, nie? :]

NuLL: Ja nie przepadam za wszystkim co się wiąże z oddzielnymi konfigami, plikami w tym XML itd. Dla mnie to niepotrzebne komplikowanie (choć można więcej przez to uzyskać, zgodze się).

Ale czy nie tyle samo lini wyjdzie ci moim kodem bez konfigów, a twoim (jedna linia w php i dziesiątki w confie XML?)

@Nievinny: Co rozumiesz przez "dopracowana"? Uściślij to będę wiedzial na co uwagę zwrócić.

Dzięki za uwagi, widze że opłaca się dalej pracować nad tym kodem :]
nospor
wedlug mnie ta pozycja dzięki css to częściowe rozwiązanie, może trochę życie utrudnić. No bo teraz przy css dla każdego pola muszę definiować styl, position absolute aby gdzieś tam się pojawil. A jeżeli to będzie jakieś tabelryczne ulożenia to szybciej chyba tabelka by poszla niż zabawa w position absolute. Przy dużej liczbe elementów formualrza będzie się można zachlastać przy próbie zmianie polozenia. Tak mi się wydaje
Vengeance
@nospor: Jeśli piszesz o defniowaniu dla każdego pola styli, czy też o pozycjonowaniu absolutnym to chyba po prostu jeszcze nie do końca znasz tajniki CSS. Prawda jest taka, że na stronie wszystkie formularze mają identyczny wygląd. Toteż napisanie odpowiedniego stylu obejmującego wszystkie formy nie jest problemem.

A gdy potrzebujesz innego wyglądu, możesz zastosować wszystkie możliwości takie jak atrybuty "class" czy "style".

Pozdrawiam
nospor
Cytat
Prawda jest taka, że na stronie wszystkie formularze mają identyczny wygląd
Na jakiej stronie? Może na Twojej. Ja mówiłem szerszym gronie odbiorców, u których może być inaczej.

Co do css to faktycznie w 100% tego 'cuda' nie znam biggrin.gif
serafin
Szczerze Vengenance przekombinowujesz winksmiley.jpg. Szybciej napisze taki formularz w surowym htmlu niz przy wykorzystaniu twoich "widgetow". Sorry ale klasy piszemy po to zeby przyspieszyc/zautomatyzowac niektore czynnosci. U ciebie dziala to w druga strone.

Co do tworzenia formularzy z pliku xml. Pomysl fajny ale nie nowy (patrz: glide) ale znowu wiekszy narzut czasowy przy tworzeniu pliku xml niz wstukaniu szablonu

Jesteś szalooona guitar.gif
matid
Cytat(serafin @ 2005-08-12 17:45:32)
Szczerze Vengenance przekombinowujesz winksmiley.jpg. Szybciej napisze taki formularz w surowym htmlu niz przy wykorzystaniu twoich "widgetow". Sorry ale klasy piszemy po to zeby przyspieszyc/zautomatyzowac niektore czynnosci. U ciebie dziala to w druga strone.

Weź pod uwagę, że tutaj masz od razu walidację formularzy w JS i php...
Vengeance
Cytat(nospor @ 2005-08-12 16:35:05)
Cytat
Prawda jest taka, że na stronie wszystkie formularze mają identyczny wygląd
Na jakiej stronie? Może na Twojej. Ja mówiłem szerszym gronie odbiorców, u których może być inaczej.

Co do css to faktycznie w 100% tego 'cuda' nie znam biggrin.gif

Przecież tworząc formularze wiesz gdzie się będą znajdować i jak mają wyglądać.
Tak więc przy pomocy CSS można spokojnie i szybko stowrzyć unikalny wygląd każdego formularza. robisz sobie:

<div id="form2">
<?php echo $Form;?>
</div>

A w CSS definicje stylów dla formularza zagnieżdżonego w danym DIV i już :]
W kodzie php nie musisz wtedy nawet definiować stli czy klas. Wszystko rozwiązujesz przez możliwości CSS.


@serafin: Już się przyzwyczaiłem, że jesteś anty wszystko a w szczególnośći anty moje :] Zastanawia mnie tylko, dlaczego tyle ludzi używa PEAR QucikForm. Przecież to nic nie ułatwia :/
ebe
I do tego jeśli piszesz cms'a który wykorzystuje wirtualne klasy contentu(vide ez) to taki generator jest nieoceniony do automatycznego generowania formularzy. Też coś takiego robię :]
aleksander
@Vee zainspirowałeś mnie, żeby samemu coś takiego napisac smile.gif To jest o tyle dobre, że moge sobie generowac formularz na podstawie tabeli bazy danych:)

EDIT: hehe juz mam pierwsza wersje:) Zastanawiam sie tylko jak rozwiazac problem wyswietlania wszystkich tych rzeczy:) Vee mowisz ze CSS wszystko załatwi? w sumie nie jestem tego do konca pewien...
Vengeance
Na przykładzie mojego kodu, gdyby ktoś się uparł by mieć tabelki można dopisać klasy Tr, Td, Table które działałby by wg wzorca Decorator. W konstruktorze przekazywał byś element (np Input) i przez __set __get i __call przenosił wszystkie odwołania na ten element.

A przy metodzie __toString() dopisać by trzeba było wyświetlanie odpowiednich tagów przed i po tym ww. Input.
aleksander
a co powiesz na malutki system szabloników??biggrin.gif

cos w stylu:
  1. {while elements}
  2. <tr>
  3. <td>
  4. {$element.name}
  5. </td>
  6. <td>
  7. {$element}
  8. </td>
  9. </tr>
  10. {/while}
User tworzy sobie wtedy jakis standardowy wyglad formularza i stosuje go do nich:)

Wiem to wariactwo ale wkoncu alek to alek laugh.gif
Vengeance
Też tak można. Każdy robi jak mu wygodniej :]

Tak btw, co nie pasuje ci w moim kodzie iż piszesz swój (chęć nauki, wiem, też to mam. Ale pytam serio bo chce poznać słabe strony mojego kodu)
aleksander
chec nauki biggrin.gif

w sumie narazie napisalem sam generator formularza, validacja przede mną. O dziwo samo wstawianie elementów mamy podobne jak nie identyczne (przypadek):
  1. <?php
  2. $form = new Form( 'testowyform', 'plik.php', 'post' );
  3. $form->addElement( new Input( array( 'type' => 'text', 'value' => 'to jest wartosc' ) ) );
  4. $form->addElement( new Input( array( 'type' => 'submit', 'value' => 'to jest wartosc' ) ) );
  5. echo $form->getCode();
  6. ?>
Ale wydaje mi sie że samą walidację zrobie troche inaczej:) Wkrotce zapodam szczegółowe dane (narazie pizza i film:P)
nospor
Skoro już @aleksander wspomanial o systemie szablonów. Moja klasa do formularza korzysta ze smarty. W smartym definiuje gdzie ma się wyswietlać etykieta a gdzie pole. Pozwala to w łatwy i dość chyba intuicyjny sposób umieścić pola formularza a nie bawić się css, którego efekt chyba ciężko se wyobrazić.
Etyiekta - {label for="idpola"}
pole - {input name="idpola"}
Dodatkowo mozna okreslic gdize mają się pojawić komunikaty o bledach, gdyż wyswietlają się one w postaci listy a nie jak u @Vengeance w postaci alertów. To również proponwalnym zmienic. W przypadku dużego formularza można się naklikać i zapomnieć gdzie było źle.


Jak kiedyś przepiszę tę mą klasę na php5 to się również pochwalę. Narazie jest pod php4 i jest zintegrowana z naszymi projektami.
Vengeance
Alert wyświetla się tylko jeden. W razie ominięcia podstawowych mechanizmów weryfikacji JavaScript, php wyświetla informacje o błędach wyświetlając odpowiedni napis pod polem Input.

Wspomne tylko, iż raczej pisze tę klasę do własnych zastosować.
Sami widzicie, że już np. aleksander pisze własny kod robiący to samo. I popieram to bo można się wiele dzięki temu nauczyć.
Dlatego nie ma sensu moim zdaniem dostosowywać aplikacji do wymagań kogoś, wbrew własnym wymaganiom. Ale niektóre uwagi są przydatne.

@nospor: Nie rozumiem gdzie widzicie problem z wyświetlaniem moich formularzy :/ Jedyna nizgodność z waszym podejściem i moim jest taka, że u mnie nie zastosujesz zbyt prosto tabelek by w nich umiejscowić kod formularza co i tak jest niezgodne z semantyką xhtml-a !
aleksander
ja od siebie jeszcze dodam, że mam zamiar dopisac klase, która generuje formularz na podstawie tabeli mysql smile.gif
bela
Też coś takiego napisałem, ale jakoś nie podoba mi się to rozwiązanko tongue.gif
Tak myśle bardziej nad czymś podobnym do tego: http://cocoon.apache.org/2.1/userdocs/xsp/...heet-forms.html
aleksander
ok, wiec ten generator juz jest napisany smile.gif jeszcze nie zakodowalem wszystkich pól mysql ale jestem w trakcie:)

u mnie tworzenie przykładowego formularza wyglada tak:
  1. <?php
  2. $form = new Form( array( 'name' =>'testowyform', 'action' => '#', 'method' => 'post' ) );
  3.  
  4. $form->addElement( new Input( array( 'type' => 'text', 'name' => 'test' ) ) );
  5.  
  6. $oEmail = new Input( array( 'type' => 'text', 'id' => 'email', 'name' => 'email' ) );
  7. $form->addRule( new EmailRule( $oEmail, 'email jest zly!' ) );
  8. $form->addElement($oInput );
  9.  
  10. $oPhone = new Input( array( 'type' => 'text', 'id' => 'phone', 'name' => 'phone' ) );
  11. $form->addRule( new OnlyNumericRule( $oPhone, 'pole moze miec tylko wartosci numeryczne' ) );
  12. $form->addElement( $oPhone );
  13.  
  14. $form->addElement( new Input( array( 'type' => 'submit', 'name' => 'a', 'value' => 'Zapisz' ) ) );
  15. echo $form->getCode();
  16. ?>
Rezultat:
  1. <script language="JavaScript">
  2. var braki;
  3. function checkScriptValidation()
  4. {
  5. braki = "";
  6. var regexp = /^[0-9a-zA-Z.]+\@[0-9a-zA-Z]+\.[0-9a-zA-Z.]+$/;
  7. var email = document.getElementById( "email" ).value;
  8. if ((regexp.test(email) == false) || (email == null))
  9. {
  10. braki += "email jest zly!"
  11. }
  12. var regexp = /^[0-9]*$/;
  13. var element = document.getElementById( "phone" ).value;
  14. if ((regexp.test(element) == false) || (element == null))
  15. {
  16. braki += "pole moze miec tylko wartosci numeryczne"
  17. }
  18. if( braki != "" )
  19. {
  20. alert( "Formularz zawiera błedy, które należy poprawic:\n" + braki );
  21. return false;
  22. }
  23. return true;
  24. }
  25. </script><form name="testowyform" action="#" method="post" onsubmit="return checkScriptValidation();" >
  26. <input type="text" name="test" />
  27. <input type="text" id="email" name="email" />
  28. <input type="text" id="phone" name="phone" />
  29. <input type="submit" name="a" value="Zapisz" />
  30. </form>
Zamierzam jeszcze wprowadzic dodatkowy fetaure, czyli mini systemik szablonów. Przykładowy szablon:
  1. <div>
  2. <!-- FOR START -->
  3. <span style="font-weight: bold"><!-- LABEL --></span><!-- ELEMENT --><br />
  4. <!-- FOR END -->
  5. </div>
Czyli kilka znaczników, prosciutki szablonik, wg którego tworzony jest formularz. Daje to duzo wieksze pole do popisu w przypadku ustawiania pól formularza smile.gif
Kod php wyglada wtedy tak:
  1. <?php
  2. // defniowanie wszystkich pól
  3. $form->useTemplate( 'example.tpl' );
  4. echo $form->getCode();
  5. ?>
Vengeance
Uwzględnij w kodzie JS, że na stronie może być więcej niż jeden formularz. Przyda ci się na przyszłość.
aleksander
to bedzie w wersji 2.0 tongue.gif
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.