Ładowanie pól formularza w zależnosci od dropDownList

Witam,

mam problem przy formularzu rejestracji. Mianowicie w serwisie może zarejestrować się osoba fizyczna jak i również firma. W dropDownList mam do wyboru "Osoba fizyczna", "Firma". Różni się to tym, że gdy zostanie wybrana osoba fizyczna należy podać imię i nazwisko, gdy firma, nazwę firmy i nip. Dane ładuje ajaxem i pola formularza mi się zmieniają w zależności od tego co wybiorę. W bazie danych te cztery wymienione wyżej pola(imię, nazwisko, firma, nip) są jako null. Po prostu mam dwa scenariusze dla validate, gdy osoba fizyczna imię i nazwisko ustawione na required, gdy firma, nazwa firmy i nip ustawione na required. Jednak gdy zmienie jedno na drugie, wchodzi mi do validacji i wyskakują błędy, że trzeba wypełnić wszystkie pola formularza i pola podświetlają sie na czerwono. Jest taka metoda jak clearErrors z tym, że wtedy gdy już użytkownik chcę się rejestrować(wybrał już czy jest osobą fizyczną czy firmą) to nie wyskakują żadne błędy bo za kązdym razem clearErrors czyści.

Macie jakieś wskazówki odnośnie tego jak ładować formularze z jednego modelu w zależnosci od jakiejś opcji(u mnie z dropDownList).

Oto kod z controllera z akcji o której piszę:




if( empty($_POST['Registration']['type'] ))

	$_POST['Registration']['type'] = 0;	


if( $_POST['Registration']['type'] == 0)

	$model=new User('client');

else

	$model=new User('company');

		

if(isset($_POST['User']))

{

   .... tutaj validacja danych i zapisanie do bazy danych

}


$this->render('create',array(

	'model'=>$model,

	'type'=>$_POST['Registration']['type'],

));




$_POST[‘Registration’][‘Type’] to pole z dropDownList określające czy to ma być formularz dla osoby fizycznej czy dla firmy. Z góry dzięki za wszystkie wskazówki.

Ja zrobiłem to za pomocą własnego walidatora użytego zamiast wbudowanego "required". W modelu wygląda to mniej więcej tak:

w rules:




array('nip, name', 'companyRequire'),



walidator:


	

public function companyRequire($attribute, $params) {

		if($this->type && empty($this->{$attribute})) {

			$this->addError($attribute,'Dla firm pole jest wymagane.');

		}

	}



Dzięki za odopowiedź. Sęk w tym, że to mi działa. Gdy wczytuję się strona, domyślnie jest ustawione na osobę fizyczna(za pomocą dropDownList zmieniam osoba fizyczna czy firma) i jest imię i nazwisko. Zmieniam na firmę i wczytuje się poprawnie firma, nip, ale od razu podświetlone wszystkie pola formularza na czerwono, że albo pole takie i takie jest wymagane, albo że nie spełnia innych kryterii, a w tym momencie to nie miało być sprawdzane tylko ładowane(bez przeładowania strony) inne pola tego samego formularza i tak się dzieje, tylko te błędy. Jakoś nie mogę tego obejść, ale postaram się jakoś to zrobić.

Czyli chodzi o walidacje ajaxową? To można wyłączyć w CActiveForm.




'enableAjaxValidation'=>false



No właśnie chce, żeby w momencie tej zmiany z osoby fizycznej na firmę nie było żadnego sprawdzania poprawności danych wejściowych. To co napisałeś nie pomaga, ale dzięki za zainteresowanie. Pozdrawiam.

Eee… Jesteś pewien, że problem nie leży gdzie indziej? Z tego, co ja się orientuję to podświetlanie pól na czerwono w standardowym formularzu Yii to właśnie walidacja AJAXowa. Jeśli ją wyłączysz w sposób, w jaki opisał Ci to gadd33, to nie ma siły, żeby cokolwiek się sprawdzało PRZED wysłaniem formularza (i uruchomieniem Twojego validatora).

W widoku mam zdeklarowany dropDownList w ten sposób:

<?php echo $form->dropDownList($model,‘typ’,Lookup::items(‘TypHardware’)); ?>

Kontrolerze chcę uzyskać wartość wyboru z dropDownList, jak go uzyskać? Po przez $_POST[‘typ’]?

@kkozlowski

Moze wczytaj sobie caly formularz dla firmy i osoby prywatnej, a w zaleznosci od ustawionej wartosci w selectcie ukrywaj odpowiednie wiersze formularza? Scenario do walidacji rozroznisz po odpowiednio ustawionej zmiennej


$_POST['Registration']['type']

.

Dodatkowo upewnij sie, ze w regulach walidacji masz odpowiednio ustawiony ‘on’ przy walidatorze ‘required’ i kazdym innym, ktorego uzywasz. Jesli go brakuje to model user bedzie walidowal wszystko co ma required(lub dowolny inny) i nie ustawiony ‘on’. Byc moze tez stad te bledy w swiezo ladowanych polach formularza z Twojego modelu?

@mnivo

Jeśli $model dla przykladu jest obiektem klasy ‘MojModel’, a atrybut do ktorego sie odnosisz to ‘typ’, to w $_POST znajdziesz go pod


$_POST['MojModel']['typ']

Poza tym, myślę że zwykly


print_r($_POST);

w kontrolerze rozjasnilby Ci sprawe.

pozdr