2011-01-27 11 views
21

Po wysłaniu formularza posiadający dwa pola o nazwie „id” i „url” Mam następujący kod:CodeIgniter przepuszczenie 2 argumenty callback

$this->load->library('form_validation'); 
$this->form_validation->set_rules('id', 'id', 'trim|xss_clean'); 
$this->form_validation->set_rules('url', 'url|id', 'trim|xss_clean|callback_url_check'); 

Zapytanie db potrzebuje obu polach.

url_check function ($ str, $ id) nazywa, ale w tym przypadku 'id' zawsze ma wartość 0.

Gdybym tylko zrobić:

$this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check'); 

A nazywamy pracę url_check($str) Wszystko tak jak powinno.

Pytanie brzmi: jak przekazać dwie wartości do url_check($str, $id)?

+0

Nie możesz po prostu zaakceptować '$ str. $ Id;' i przekazać w ten sposób w celu zatwierdzenia. – Ross

Odpowiedz

35

Można użyć $ this-> input-> poczta bezpośrednio:

function check_url() { 
    $url = $this->input->post('url'); 
    $id = $this->input->post('id'); 

    // do some database things you need to do e.g. 
    if ($url_check = $this->user_model->check_url($url, $id) { 
     return TRUE; 
    } 
    $this->form_validation->set_message('Url check is invalid'); 
    return FALSE; 
} 
+1

Thorpe, to geniusz. Świetna sugestia, to się całkowicie sprawdzi. –

+0

Zrobiłem to bez oglądania tego wątku, a teraz szukam, jak to zrobić bez postu wewnątrz funkcji wywołania zwrotnego, ponieważ nie jest to wystarczająco ogólne (przynajmniej w mojej funkcji) – Limon

2

Jeśli poprawnie rozumiem prawidłowe sformułowanie, każda reguła (set_rules) jest dla jednego pola formularza, a wywołanie zwrotne sprawdza tylko jedno pole. W twoim przypadku wydaje się, że "id" jest poza zakresem. Zamiast tego można przekazać tablicę do funkcji set_rules i wykonać wywołanie zwrotne. Jeszcze tego nie próbowałem. http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray

+0

+1 to jest poprawne, CI's set_rules jest tylko dla jednego pola na regułę. Można użyć funkcji pomocniczej lub podobnej (lub sugerowanej w modelu) _, która nie jest idealna, ale tak jest w tym przypadku. – Ross

+0

Dziękujemy! Sprawdziłeś, o czym myślałem. – pigfox

8

To wydaje się działać również.

$id = 1; 

$this->form_validation->set_rules('username', 'Human Username', 'callback_username_check['.$id.']'); 

function username_check($str, $id) { 
    echo $id; 
    if ($str == 'test') { 
     $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"'); 
     return FALSE; 
    } 
    else { 
    return TRUE; 
    } 
} 
+0

To nie działa dla mnie –

+0

Jatin, parametry Callback wymagać co najmniej CI 2.1.0. –

28

Wystarczy zrobić to we właściwy sposób (przynajmniej dla CI 2.1+), jak opisano in the docs:

$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']'); 
// Later: 
function check_uri($field, $id){ 
    // your callback code here 
} 
+1

Parametry wywołania zwrotnego wymagają co najmniej CI 2.1.0. –

+3

Dlatego wspomniałem o tym w moim poście;) – Philipp

+0

Przepraszam, ominąłem to :) –

1

Tylko uwaga na temat korzystania z parametrów wywołania zwrotnego, jak sugerowano w innych odpowiedzi. Jeśli używasz app/config/form_validation.php do tworzenia reguł sprawdzania poprawności, składnia $this->input->post('parameter') nie będzie działać, ponieważ obiekt ten nie jest dostępny w programie ładującym CI w miejscu wykonywania, w którym odczytuje zawartość tego pliku. Będziesz musiał wykonać wywołanie w swojej procedurze oddzwonienia, np. :

public function _validate_user_signup($username, $password) { 
    $var = $this->input->post('password'); 

W tym przypadku drugi parametr przekazany do metody nie będzie zawierać hasło, ale $ var gdyby tworzyły po wywołaniu.

Mam nadzieję, że to jasne. Matt

+0

Możesz użyć 'get_instance()', aby uzyskać dostęp do głównego obiektu CI poza kontrolerami, modelami lub widokami, na przykład: '$ CI = & get_instance();', zobacz więcej [Tworzenie klas pomocniczych] (https://www.codeigniter.com/user_guide/general/ancillary_classes.html) –

0

Lepiej używać biblioteki sprawdzania poprawności formularzy, aby uzyskać dane, które są sprawdzane.

Nie zawsze twoje dane będą w $ _GET lub $ _POST (patrz https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post).

Najlepszy sposób można uzyskać dostęp do danych wewnątrz zwrotnego walidacji jest taka:

$this->form_validation->validation_data 

„validation_data” jest własnością publiczną w klasie CI_Form_validation.

Powiązane problemy