Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa]formularz
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Spawnm
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
Moli
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
Spawnm
//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
pejott
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.
Spawnm
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
pejott
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.
Spawnm
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
pejott
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.
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.