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:
<?php class MyForm { protected $_action; protected $_method = 'GET'; protected $_html; public function setAction($value) { $this->_action = $value; } public function setMethod($value) { $this->_method = $value; } $optionsHtml = ''; foreach ($options as $key => $value) { $optionsHtml .= ' ' . $key . '="' . $value . '"'; } } $this->_html = '<form action="' . $this->_action . '" method="' . $this->_method . '"' . $optionsHtml . '>'; } public function endForm() { $this->_html .= '</form>'; } // wygenerowanie kodu HTML input/textarea/select itd. $this->_html .= $html; } public function render() { return $this->_html; } }
Formularz generuję w widoku, np.
<?php $form = new MyForm(); $form->setMethod('POST'); $form->startForm(); $form->createElement('text', 'login', 'Nickname'); $form->createElement('password', 'password', 'Password'); $form->createElement('submit', 'submit', null, 'Register new account'); $form->endForm(); ?> 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'