Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa generująca formularz - dobre praktyki
Turson
post 24.08.2014, 11:22:41
Post #1





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Hej,
mam małą zagwozdkę logiczną w tworzeniu klasy generującej formularz. Teoretycznie takową klasę napisałem, ale mam kilka wątpliwości.
Od razu dodam, że aplikacja oparta jest o MVC.
Skrócony kod klasy:
  1. <?php
  2. class MyForm {
  3.  
  4. protected $_action;
  5. protected $_method = 'GET';
  6. protected $_html;
  7.  
  8. public function setAction($value) {
  9. $this->_action = $value;
  10. }
  11.  
  12. public function setMethod($value) {
  13. $this->_method = $value;
  14. }
  15.  
  16. public function startForm(array $options = array()) {
  17. $optionsHtml = '';
  18. if (count($options)) {
  19. foreach ($options as $key => $value) {
  20. $optionsHtml .= ' ' . $key . '="' . $value . '"';
  21. }
  22. }
  23. $this->_html = '<form action="' . $this->_action . '" method="' . $this->_method . '"' . $optionsHtml . '>';
  24. }
  25.  
  26. public function endForm() {
  27. $this->_html .= '</form>';
  28. }
  29.  
  30. public function createElement($type, $name, $label = null, $value = null, array $values = array(), array $options = array()) {
  31. // wygenerowanie kodu HTML input/textarea/select itd.
  32. $this->_html .= $html;
  33. }
  34.  
  35. public function render() {
  36. return $this->_html;
  37. }
  38.  
  39. }


Formularz generuję w widoku, np.
  1. <?php
  2. $form = new MyForm();
  3. $form->setMethod('POST');
  4. $form->startForm();
  5. $form->createElement('text', 'login', 'Nickname');
  6. $form->createElement('password', 'password', 'Password');
  7. $form->createElement('submit', 'submit', null, 'Register new account');
  8. $form->endForm();
  9. echo $form->render();
  10. ?>
  11. Jakiś dalszy tekst


Tutaj mam taką rozkminę, czy formularz lepiej generować w widoku jak powyżej, czy w osobnej klasie, np. application/forms/RegisterForm.php
Pierwsze rozwiązanie widziałem w Yii, a drugie w Zendzie.

A teraz sprawa najważniejsza. Posiadam osobną klasę walidującą pola formularza wg. zasad ustalonych w modelu. Tego nie będę pokazywał, bo nie ma związku. Chcę mieć dostęp do informacji o wszystkich walidujących polach w klasie walidacyjnej.
Kontroler:
Jeżeli naciśnięto przycisk, zbieram dane z formularza, pobieram reguły walidacji i przekazuję to do klasy walidującej np. $this->validate($data, $rules)
$data zawiera tablicę $_POST. W klasie walidacyjnej następuje sprawdzenie poprawności przesłanych danych wg. $rules. W tejże klasie muszę mieć dostęp do tego jaki dane pola ma $label - i to jest cały problem. Nie mam za bardzo pomysłu jak się do tego dostać. Podejrzewam, że w klasie MyForm i metodzie createElement() muszę zapisywać dane każdego tworzonego pola i zapisywać np. w statycznej własności klasy $formData. To nie jest problem. Tylko odwołanie się do np. MyForm::$formData z klasy walidacyjnej przecież nie pobierze tych danych, bo już ich tam nie "będzie".
A po co mi wiedzieć jaki label ma dane pole? Ano po to, że jak nie przejdzie walidacji to do tablicy KlasaWalidacyjna->errors mogę dodać $label.' can not be empty'

Ten post edytował Turson 24.08.2014, 11:23:12
Go to the top of the page
+Quote Post

Posty w temacie
- Turson   Klasa generująca formularz - dobre praktyki   24.08.2014, 11:22:41
- - Pyton_000   Wypluwasz errory w tablicy z kluczami z name pola ...   24.08.2014, 19:01:59
- - Turson   Z walidacją i wyświetleniem komunikatów nie mam pr...   25.08.2014, 07:59:42
- - Pyton_000   A na co Ci to? Do reguł validujących dodajesz sobi...   25.08.2014, 08:10:40
- - Turson   To jest jakieś rozwiązanie, ale chciałbym, żeby w ...   25.08.2014, 08:14:59
- - Pyton_000   No to dodajesz sobie w klasie Validującej odwołani...   25.08.2014, 08:27:21
- - Turson   Tablicę rules mam zbudowaną w sposób: [PHP] pobier...   25.08.2014, 08:36:06
- - Pyton_000   No to jedno rozwiązanie z ... : - Robisz sobie In...   25.08.2014, 08:42:54
- - Turson   Dobrze rozumiem? [PHP] pobierz, plaintext <?php...   25.08.2014, 08:58:03
- - Pyton_000   Cos w ten deseń Tylko zamiast false zwracaj albo ...   25.08.2014, 09:08:59
- - Turson   Już próbowałem już takiego rozwiązania i jak z kla...   25.08.2014, 09:12:43
- - Pyton_000   Czysta bo to kolejny request a więc dane nie są zn...   25.08.2014, 09:58:55
- - Turson   Pisanie własnego komunikatu o błędzie dla każdej r...   25.08.2014, 10:09:44
- - memory   Może coś w ten deseń [PHP] pobierz, plaintext $r...   25.08.2014, 11:10:01
- - Turson   @memory, ale co z "{label}" ? Nie stosuj...   25.08.2014, 13:56:49
- - RiE   Może zamiast metody z 6 argumentami lepiej będzie ...   25.08.2014, 14:24:24
- - memory   [PHP] pobierz, plaintext miało być {attribute...   25.08.2014, 14:52:52
- - kayman   imo klasa generująca formularz to w ogóle zła prak...   25.08.2014, 15:27:59
- - Pyton_000   A wystarczyłoby [PHP] pobierz, plaintext new Inpu...   25.08.2014, 15:39:23
- - Turson   Co myślicie o rozwiązaniu: w $form->create...   8.09.2014, 14:21:52
- - aniolekx   moim zdaniem możesz sobie tworzyć formularze dynam...   9.09.2014, 11:37:35
- - Turson   To jakie rozwiązanie, żeby budować formularz obiek...   9.09.2014, 11:42:13


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: 27.06.2025 - 03:37