Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CodeIgniter]form_validate->callback
Forum PHP.pl > Forum > PHP > Frameworki
acidm
Jak ustwawić regułe w form_validation żeby w własnej funckji walidacji mieć dostęp do danych z dwóch pól jednocześnie?

  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. class Login extends CI_Controller
  3. {
  4.  
  5.  
  6.  
  7.  
  8. public function index()
  9. {
  10.  
  11.  
  12.  
  13. $this->load->library('form_validation');
  14.  
  15.  
  16. $this->form_validation->set_rules('login', 'użytkownik', 'required|min_length[6]|max_length[20]|alpha_dash|callback_checkuser');
  17. $this->form_validation->set_rules('pass', 'hasło','required|min_length[6]|max_length[20]|alpha_dash');
  18.  
  19.  
  20.  
  21. if ($this->form_validation->run() == FALSE)
  22. {
  23. $this->load->view('login_form');
  24. }
  25. else
  26. {
  27. //tu wlaściwe operacje
  28.  
  29. }
  30.  
  31.  
  32. }
  33.  
  34.  
  35. public function checkuser($str)
  36. {
  37. //tu potrzebuje dostepu do pola login i pass jednocześnie żeby sprawdzić je w bazie
  38. }
  39.  
  40.  
  41.  
  42. }
  43. ?>


Jak dodam do drugiej reguły 'callback_checkuser' to 'checkuser' wywoływane jest dwa razy po jenym parametrze,ja potrzebuje jednego wywołania z dwoma parametrami.

edit Mogłbym ładować w metodzie 'checkuser' dane drugiego pola bezpośrednio z input ale wydaje mi się to jakoś mało eleganckie.
webmaniak
Wg mojej wiedzy(mogę się mylić oczywiście) nie da się zrobić tak jak chcesz, dlatego że jako callback podajesz jedynie nazwę funkcji, bez parametrów. Możesz utworzyć drugą metodę dla callback. Nic nie stoi na przeszkodzie by utworzyć dodatkową metodę, jako parametry podać login i hasło i sprawdzasz co chcesz. Później sprawdzasz obok form_validation także tą drugą metodę.
markonix
Własne callback mogą przyjmować argumenty przez nawias kwadratowy [] i można bym tam na upartego wsadzić drugą, pożądaną wartość.

Druga opcja to kontroler + metoda sprawdzająca, tu nie ma zbyt dużo ograniczeń.

Trzeba to walidacja w modelu i zwrócenie dodatkowych errorów.
acidm
Ale ja je potrzebuje jednocześnie, w jednej metodzie .Na razie robię to tak ze mój callback dopisuje do drugiej reguły więc metoda ta jest wywoływana gdy warunki pierwszej reguły są spełnione ,spełnione są warunki drugiej reguły(te przed callback).W samej metodzie callbackowej jeden parametr mam , drugi pobieram poprzez $this->input->post() , choć wygląda to trochę nieelegancko.
W zasadzie operację sprawdzania użytkownika i hasła w bazie mógłbym zrobić później ale jak przekazać wiadomość błędu do formularza skoro '$this->form_validation->set_message()' przypożądkowana jest do reguły.

Cytat(markonix @ 11.03.2013, 19:04:50 ) *
Własne callback mogą przyjmować argumenty przez nawias kwadratowy [] i można bym tam na upartego wsadzić drugą, pożądaną wartość.


Możesz zademonstrować jakoś?
Edit Już nie trzeba obczaiłem o co chodzi:)
Lion
Ja to zawsze robiłem przez zrobienie własnej klasy MY_Form_validation i tam metody przyjmującej dwa parematry, np:

Kod
class MY_Form_validation extends CI_Form_validation {

    function __construct()
    {
        parent::__construct();
    }

        function date_later($date, $datepoint) {
            $CI =& get_instance();
            $CI->form_validation->set_message('date_later',
                'Data zakończenia nie może być wcześniejsza od '.$datepoint.'.');
            $exploded = explode('/', $date);
            if ( count($exploded) == 3 )
                list($d1, $m1, $y1) = $exploded;
            else return false;
            $exploded = explode('/', $datepoint);
            if ( count($exploded) == 3 )
                list($d2, $m2, $y2) = $exploded;
            else return false;
            $time1 = mktime(0, 0, 0, $m1, $d1, $y1);
            $time2 = mktime(0, 0, 0, $m2, $d2, $y2);
            if ( $time1 < $time2 ) return false;
            else return true;
        }

}


W kontrolerze przekazuje drugi parametr z input->post():

Kod
        if ( $this->input->post('pollStop') )
            $this->form_validation->set_rules(
                'pollStop',
                'koniec ankiety',
                'trim|valid_date|date_later['.$this->input->post('pollStart').']'
            );

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.