2011-03-15 13 views
5

Czy jest możliwe wyświetlenie błędów i ponowne wypełnienie pól w formularzu, który jest zakodowany w szablonie? Do tej pory tylko zorientowałem się, jak wyświetlić błędy w widoku modułu , ale nie szablon.Jak używać klasy sprawdzania poprawności formularza ExpressionEngine w module do ponownego wypełnienia formularza w szablonie?

W oparciu o logikę ExpressionEngine, przypuszczam, że muszę jakoś pokazać błędy walidacji widoczne przez tag w moim module, lub nawet wygenerować cały formularz z modułu, ale nie jestem pewien, jak najlepiej podejdź do tego.

Oto, co mam teraz.

function submit_form() 
{   
    $this->EE->load->helper('form'); 
    $this->EE->load->library('form_validation'); 

    $this->EE->form_validation->set_rules('first_name', 'First Name', 'required'); 
    $this->EE->form_validation->set_rules('last_name', 'Last Name', 'required'); 
    $this->EE->form_validation->set_rules('address', 'Address', 'required'); 
    $this->EE->form_validation->set_rules('city', 'City', 'required'); 
    $this->EE->form_validation->set_rules('province', 'Province', 'required'); 

    if ($this->EE->form_validation->run() == FALSE) 
    { 
     return $this->EE->load->view('form_errors'); 
    } 
    else 
    { 
     // success 
    } 
} 

I do testowania, widok po prostu zawiera:

echo validation_errors(); 

Czy ktoś może pomóc?

Odpowiedz

10

Ś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!

+0

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. –

+0

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ść. –

+0

Dziękujemy! Wymyśliłem, jak przetworzyć formularz za pomocą akcji, ale walidacja mnie wyrzuciła. – juddlyon

Powiązane problemy