Złożony Formularz

Mam tabelę zamówień i klientów, każde zamówenie przypisane do jednego klienta.

Robię właśnie formularz dodający zamówienie. Życzeniem zamawiającego jest, aby na jednym ekranie oprócz innych parametrów zamówienia można było wpisać dane klienta.

Powinna być możliwość wyszukiwania już istniejącego klienta w bazie jeśli wpiszemy część jego parametrów na tym samym ekranie.

Szkic formularza zamówienia

Opis zamówienia: …

– Klient —

Nazwa …

Telefon …

email …

Uwagi …

<Szukaj klienta>

Jeszcze o zamówieniu …

<Zapisz zamówienie>

Przycisk <Szukaj klienta> ma przeszukać tabelę klientów pod kątem wybranych, wpisanych parametrów i jeśli znajdzie dokładnie jeden rekord, to wypełnić odpowiednimi wartościami część formularza dot. klienta. I to ma być AJAX, bez przeładowywania reszty formularza. <Zapisz zamówienie> ma zapisywać zamówienie oraz klienta.

Nie mam problemu z kilkoma modelami na formularzu ale utknąłem na AJAX-ie. Zastosować ajaxSubmitButton czy też ajaxButton? Jak odświeżać formularz po uzupełnieniu? renderPartial? Jesli tak, to jak przekazać $model i $form do obsługi AJAX-a w kontrolerze? Czy da się to w ogółe zrobić bez pisania kodu po stronie klienta? Strasznie długo to schodzi, błądzę i pomyślałem, że może ktoś ma gotowca (szkielet) i się podzieli? Problem wydaje się być typowy dla aplikacji biznesowych.

Pozdrawiam tych, którzy doczytali dotąd :slight_smile:

Wydaje mi sie ze na tym ajaxSubmitButton powinienes dodac na successie wypelnienie formularza wartosciami poprzez jqeury na przyklad, cos w stylu :


if(data.result==="success"){

   $("#input_id").val(zmienna);

}

Tak obecnie robię, korzystam z ajaxSubmitButton, a po udanym wyszukiwaniu wypełniam pola klienta za pomocą JS, wcześniej atrybuty wyszukanego rekordu przesyłająć JSON’em. Ile mi to czasu zajęło, to lepiej nie pisać. Wolałbym to robić po stronie serwera, za pomocą renderPartial i klauzuli update w wywołaniu AJAX. Dlaczego? O tym później. Niestety nie wiem jak do widoku “partialnego” przekazać $form z kontrolera (akcji obsługującej AJAX). W widoku mam:


echo $this->renderPartial('..\customer\_insideform', array('model'=>$customerModel, 'form'=>$form));

Kompletnie nie wiem jak się dobrać do $form we wspomnianym kontrolerze. Any ideas?

Pokaz akcje kontrolera bo chyba nie do końca rozumiem w czym problem?

Problem z tym że nie możesz zmiennej z kontrolera wrzucic do widoku, czy problem w tym ze to Ajax ?

Zmienna $form inicjowana jest w standardowo w widoku, a następnie w tym samym pliku wywołuję renderPartial.




$form=$this->beginWidget('CActiveForm', array(

...

<div id="ajaxupdate">

echo $this->renderPartial('..\customer\_insideform', array('model'=>$customerModel, 'form'=>$form));

</div>



Jak widać przekazuję do _insideform $form w ostatnim parametrze. W _insideform mam "standardowo" :




echo $form->labelEx($model,'code'); 

echo $form->textField($model,'code',array('maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />); 

echo $form->error($model, 'code', null, disableAjaxValidation);



Wydzieliłem ten renderPartial, gdyż wyobrażałem sobie, że zwrócę ten fragment do #ajaxupdate z kontrolera.

W kontrolerze AJAX obsługuję przez:




public function actionCustomerSearch() {

  $modelCustomer = new Customer();

  $modelCustomer->attributes=$_POST['Customer'];

  $modelCustomer->code= "blabla";  // zmieńmy przykładowy atrybut

  $this->renderPartial('..\customer\_insideform',  array('model'=>$customerModel,  'form'=>$form));



Sposób jest opisany tu, ale bez użycia formularza:

http://www.yiiframework.com/wiki/49/update-content-in-ajax-with-renderpartial/

Zonk jest taki, że nie wiem jak dostać się do $form w kontrolerze bo przecież go tam nie ma :-).