Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [klasa]formularz, php5
Spawnm
post
Post #1





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




download

Wczoraj w wolnej chwili takie coś napisałem ... i postanowiłem że się podzielę smile.gif
Klasa ma za zadanie generowanie formularza html .

Użycie :

klasę zaczynamy tak:
  1. <?php
  2. $form=new form($action,$method,$enctype,$fieldset,$style);
  3. ?>


przesłanie danych nie jest obowiązkowe , jeśli nic nie wpiszemy form będzie przesyłać dane postem do obecnej strony.

inna forma startu klasy to danie tablicy z danymi:
  1. <?php
  2. $dane=array(
  3. 'action'=>'index.php',
  4. 'method'=>'post',
  5. 'enctype'=>'multipart/form-data',
  6. 'fieldset'=>true,
  7. 'style'=>'border: 1px dotted black'
  8. );
  9. $form=new form($dane);
  10. ?>


do formularza możemy dodać:
legendę:
$form->addLegend('tytuł');

//<label>
$form->addLabel($text,$stylOpcjonalny);

inputy dodajmy przez funkcję addInput(); , dane możemy przesłać na 2 sposoby -> przez tablicę lub standardowe przekazanie parametrów :
//addInput($type,$name=null,$value=null,$style=null,$html=null,$label=null)
//w inpucie jest możliwość wywołania <label> dzięki czemu będzie w przesłanych tagach html
  1. <?php
  2. $in=array(
  3.  'type'=>'text',
  4.  'name'=>'jeden',
  5.  'value'=>'treść',
  6.  'style'=>'id="mojeId"',
  7.  'html'=>array('<p>','</p>'),
  8.  'label'=>array('Imie: ','style="font-size:24px"')
  9. );
  10. $form->addInput($in);
  11. $form->addInput('text', 'jeden','treść');
  12. ?>


dając opcjonalny parametr html dostajemy przez i za inputem tagi html.

textarea:
również parametry możemy przesłać na 2 sposoby.
//addArea($name,$value=null,$style=null,$rows=null,$cols=null,$html=null);
np:
$form->addArea('arenka',null,null,20,40);

select
2 typy przesyłania danych
//addSelect($name,$style=null,$html=null);

opcje dodajemy przez:
//addOption($value,$title,$selected=false)
//też można na 2 sposoby
  1. <?php
  2. $form->addSelect('mine', null, array('<p>','</p>') );
  3. $form->addOption(1,'jeden');
  4. $form->addOption(2,'dwa',true);
  5. $form->addOption(3,'trzy');
  6. ?>


select zamykamy funkcją closeSelect() jednak nie jest to wymagane.

na koniec
aby otrzymać nasz gotowy formularz używamy funkcji getForm(); :
echo $form->getForm();


Jakiś przykładowy form:

  1. <?php
  2. $form=new form('loguj.php','post',true);
  3. $form->addLegend('panel logowania');
  4. $in=array(
  5.  'type'=>'text',
  6.  'name'=>'imie',
  7.  'value'=>$_POST['imie'],
  8.  'html'=>array('<div>','</div>'),
  9.  'label'=>array('Imie: ')
  10. );
  11. $form->addInput($in);
  12. $form->addLabel('hasło:');
  13. $form->addInput('password', 'pass');
  14. $form->addInput('submit', 'submit','wyślij',null,array('<br/>'));
  15. echo $form->getForm();
  16. ?>



To chyba tyle smile.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Moli
post
Post #2





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Hmmm mało Ci ta klasa ułatwia.
Kod
'enctype'=>'multipart/form-data',

Ja nigdy tego nie pamiętam, więc u siebie wystarczy że tam
Kod
'method'=>'file',

Po drugie, strasznie dużo danych przekazujesz do metod. One wszystkie są wymagane ?

Z guzikiem, fajnym pomyslem jest coś takiego.
Kod
$form->getForm();

Zwróci
Kod
</form>

a
Kod
$form->getForm('Wyślij');

Kod
<input type='submit" value="Wyślij" />
</form>

Oczywiście to ładnie ustawić, to prosty przykład smile.gif Ja tak mam u siebie i cholernie sie przy testach sprawdza smile.gif

Ten post edytował Moli 15.05.2009, 13:11:56
Go to the top of the page
+Quote Post
Spawnm
post
Post #3





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




//Po drugie, strasznie dużo danych przekazujesz do metod. One wszystkie są wymagane ?
nie smile.gif

został dodany bajer z $form->getForm('Wyślij'); smile.gif
Go to the top of the page
+Quote Post
pejott
post
Post #4





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Do obsługi formularzy mam trochę inne podejście.
Jedna klasa reprezentuje formularz, a wszystkie elementy mają swoje klasy.
W uproszczeniu wygląda to tak.

  1. <?php
  2. $objForm = new dfForm('sampleForm');
  3.  
  4. $objForm->setAction('...');
  5. $objForm->setMethod(dfForm::Post);
  6.  
  7. $objForm->setLayout('...');
  8.  
  9. $objInputNickname = new dfInputText('Nickname', '...');
  10.  
  11. $objInputNickname->setFilter(new dfFilterString(...));
  12. $objInputNickname->setValidator(new dfStringValidator(...));
  13.  
  14. $objInputEmail = new dfInputText('Email', '...');
  15.  
  16. $objInputEmail->setValidator(new dfEmailValidator(...));
  17.  
  18. $objForm->setFields($objInputNickname, $objInputEmail);
  19. ?>

Obiekt $objForm posiada oczywiście metody renderujące lub zwracające kod.
Według mnie, jedna klasa do obsługa tak istotnego elementu aplikacji to za mało.
Twoja klasa nie zapewnia Ci elastyczności i tak naprawdę nie wspomaga obsługi formularzy.

Pozdrawiam.

Ten post edytował pejott 15.05.2009, 14:47:43
Go to the top of the page
+Quote Post
Spawnm
post
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




tworzyć osobno 2 klasy dla <form> i <input> to imho trochę przesada ...

//$objInputNickname->setValidator(new dfStringValidator(...));
...
//$objInputEmail->setValidator(new dfEmailValidator(...));

2 osobne klasy do validacji maila i stringa ... nie lepiej jedna klasa valid ?

//Twoja klasa nie zapewnia Ci elastyczności i tak naprawdę nie wspomaga obsługi formularzy.
Dlaczego ?
jakoś mi tak lepiej pisać

  1. <?php
  2. $form=new form('loguj.php','post',true);
  3. $form->addLegend('panel logowania');
  4. $form->addLabel('hasło:');
  5. $form->addInput('password', 'pass');
  6. $this->html=$form->getForm('loguj');
  7. ?>


niż

  1. <?php
  2. $this->html='<form action="loguj.php" method="post">
  3. <fieldset>
  4. <legend>panel logowania</legend>
  5. <label>hasło: <label><input type="password" name="pass">
  6. <input type="submit" name="submit" value="loguj">
  7. </fieldset>
  8. </form>';
  9. ?>


mnie problemów z " ' jest jeśli chce się bawić z $_POST w formie

Ten post edytował Spawnm 15.05.2009, 15:13:20
Go to the top of the page
+Quote Post
pejott
post
Post #6





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Tak się składa, że tych klas nie jest dwie, tylko więcej. tongue.gif
Odpowiednio dla select, textarea, radio, checkbox i tak dalej.
Kiedyś miałem jedną klasę walidującą dane, ale właśnie ze względu na formularze rozbiłem ją na kilka klas.
Hm, może nie widzisz zalet takiego rozwiązania, ale jak popracujesz trochę na swojej klasie, to i tak dojdziesz do podobnych wniosków.
Dodam, iż nie jest to rozwiązanie stosowane tylko przeze mnie. Tak jest w ZF i z tego co mi się wydaje to w Symfony podobnie.
Oczywiście mówie o klasach walidujących.

Pozdrawiam.
Go to the top of the page
+Quote Post
Spawnm
post
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




nie wiem jak z zf i symfony ale np kohana ma klasę valid i w niej jest wszystko smile.gif
i tak z ciekawości co masz w tych klasach ? jedna funkcja __construct ?
pokaż jakąś snitch.gif
Go to the top of the page
+Quote Post
pejott
post
Post #8





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Aktualnie nie mam dostępu do plików, ale są tam 3 metody, a nawet jeśli miałoby być samo __construct() to nie wiem w czym problem ?
Każdy ma swoje podejście, moje rozwiązanie wydaje się wygodne bo do wyświetlenia formularza kontaktowego wystarczy taka akcja.
Pisane z palca.

  1. <?php
  2. class displayContactForm extends dfAction {
  3.  
  4.    public function Execute() {
  5.  
  6.       $objView = new dfView('XHTML');
  7.  
  8.        $objView->setLayout('defaultLayout', 'Core');
  9.  
  10.        $objForm = $this->getForm('contactForm');
  11.  
  12.        $objView->setTemplate('Content', 'displayContactForm');
  13.  
  14.        $objView->setData('contactForm', $objForm);
  15.  
  16.        $objView->Render();
  17.  
  18.    }
  19.  
  20. }
  21. ?>


A walidacja tego formularza i wysłanie wiadomości, ogranicza się do tego.

  1. <?php
  2. class execContactForm extends dfAction {
  3.  
  4.     public function Execute() {
  5.  
  6.        $objForm = $this->getForm('contactForm');
  7.  
  8.        if($objForm->isValid()) {
  9.  
  10.        $objMsg = $this->getModel('Msg');
  11.  
  12.        $objMsg->addMsg($objForm->getData('msgTopic'), ...);
  13.  
  14.        $this->Forward(...);
  15.  
  16.        } else { $this->Forward(...); }
  17.  
  18.     }
  19.  
  20. }
  21. ?>

Pozdrawiam.

Ten post edytował pejott 15.05.2009, 15:54:45
Go to the top of the page
+Quote Post

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 Aktualny czas: 20.08.2025 - 08:38