Świetne pytanie i takie, które zajęło mi dużo czasu, aby znaleźć najlepszy sposób rozwiązania.
CodeIgniter Form Validation library jest świetny, ale może być używany tylko z odpowiednimi widokami i kontrolerami, więc nie działa po wyjęciu z pudełka, gdy tworzysz przedni znacznik końcowy.
Zazwyczaj preferowanym sposobem przesłania formularza frontowego jest zarejestrowanie "akcji" w pliku upd.addon.php (Zgaduję, że zrobiłeś to dla swojej funkcji submit_form()
). Następnie zostaje mu przypisany numer, który możesz opublikować pod adresem URL: /index.php?ACT=37
lub coś podobnego. To dobry system, ponieważ oznacza to, że wiemy, że przesłanie formularza pochodzi z naszego modułu. Jednak w przypadku formularzy wejściowych jest to utrudnienie, ponieważ oznacza to, że nie możemy ponownie zaludnić pól wejściowych. Dlatego musisz skonfigurować formularz wejściowy, aby przesłać go z powrotem do bieżącego adresu URL, i poczekać, aż silnik szablonu spróbuje wyrenderować tag przed przystąpieniem do przesyłania formularza.
Najprostszym i najbrzydszym sposobem na osiągnięcie tego celu jest użycie $this->EE->output->show_user_error(FALSE, array_of_errors)
. Możesz go użyć w akcji lub w kodzie modułu. Wyświetla standardową szarą wiadomość EE, którą wszyscy znamy i której nienawidzimy.
Przy takim wstępie zapewne wiesz, że rozwiązanie nie będzie takie proste, prawda? Oto szkielet funkcji znacznika, który implementuje inline sprawdzanie błędów:
function my_form()
{
// load default tag variables
$tag_vars = array();
$tag_vars[0] = array(
'first_name' => '',
'error:first_name' => '',
'last_name' => '',
'error:last_name' => ''
);
// handle a form submission
if ($this->EE->input->post('my_form_hidden') == '1'))
{
// load POST data into tag
$tag_vars[0]['first_name'] = $this->EE->input->post('first_name', TRUE);
$tag_vars[0]['last_name'] = $this->EE->input->post('last_name', TRUE);
// use CI validation library to check submission
$this->EE->load->helper('form');
$this->EE->load->library('form_validation');
$this->EE->form_validation->set_rules('first_name', 'lang:first_name', 'required');
$this->EE->form_validation->set_rules('last_name', 'lang:first_name', 'required');
$valid_form = $this->EE->form_validation->run();
if ($valid_form)
{
// probably save something to database, then redirect
}
else
{
$form_errors = array();
foreach (array('first_name', 'last_name') as $field_name)
{
$field_error = form_error($field_name);
if ($field_error)
{
$form_errors[] = $field_error;
$tag_vars[0]['error:'.$field_name] = $field_error;
}
}
if ($this->EE->TMPL->fetch_param('error_handling') != 'inline')
{
// show default EE error page
return $this->EE->output->show_user_error(FALSE, $form_errors);
}
}
}
// parse and output tagdata
$out = $this->EE->functions->form_declaration(array(
'action' => $this->EE->functions->fetch_current_uri(),
'hidden_fields' => array('my_form_hidden')));
$out .= $this->EE->TMPL->parse_variables($tagdata, $tag_vars);
return $out.'</form>';
}
ten sposób projektant może określić error_handling="inline"
w znaczniku, jeśli chcą błędy inline, w przeciwnym razie będą one po prostu przekierowany do standardowego formularza błędu. Jeśli robią zażądać inline obsługę błędów, będą one po prostu trzeba upewnić się ich wejścia wyglądać następująco:
<input type="text" name="first_name" value="{first_name}" />
{error:first_name}
Uwaga ukryte pole możemy przesłać wraz z formularzem, pozwala nam zapewnić możemy obsłużyć tylko przedstawienie ten formularz, a nie inne formularze na stronie, takie jak formularz logowania lub coś takiego. Jeśli masz więcej niż jedną instancję formularza na stronie (np. Wewnątrz pętli wpisów w kanale lub coś w tym stylu), musisz zaimplementować sztuczkę, aby upewnić się, że obsługujesz tylko formularz, który został przesłany, na przykład przesyłając id_wpisu również jako pole ukryte.
Cieszę się, że wszystko udokumentowane, mam nadzieję, że będzie to przydatne także dla innych programistów EE!
Wielkie dzięki, Adrian!Trochę kłopotów, ale teraz wiem. Wygląda na to, że przejście do widoku, który pokazuje błędy za pomocą przycisku wstecz w celu poprawienia, nie byłoby wielkim problemem, gdybym również miał weryfikację JavaScript w czasie rzeczywistym, którą zobaczy większość użytkowników. –
Tak, tak naprawdę to całkiem sprytne rozwiązanie, jeśli dopiero tworzysz swoją własną stronę i wiesz, że będzie to walidacja JS na front-endie. Moje rozwiązanie jest prawdopodobnie bardziej przydatne, jeśli tworzysz moduł komercyjny i chcesz, aby projektant miał największą elastyczność. –
Dziękujemy! Wymyśliłem, jak przetworzyć formularz za pomocą akcji, ale walidacja mnie wyrzuciła. – juddlyon