Two Submit Buttons On View Page


(Marcinrogut) #1

Czesc !

Mam kolejny orzech do zgryzienia.

Postaram sie prosto wytlumaczyc na czym polega moj problem.NAjpier jednak przyblize na czym polega projekt.

Mam strone z przepisami kulinarnymi. Do tworzenia nowego przepisu uzywam kontrolera create ktory sprawdza czy zostala stworzona lista skaldnikow, jesli nie wyswietla view z dodawaniem skladnikow, z view wracam do tego kontrolera create i sprawdzam znowu czy lista jest, jesli tak wyswietla sie inny view z modelem juz samego przepisu. po nacisnieciu CHtml::submitButton konroler wykonuje ostateczna validacje i zapisuje mopdel. Na stronie przepisu jednak jest drugi przycisk subbmit ktory odpowiada za update listy skaldnikow - submit button ktory wraca do konrolera create i wyswietla znowu liste skaldniow, jednakze gubi mi model bo zrobiny jest w klasycznym stylu z ukrytym polem.

Pytanie:

Jak wstawic dwa przyciksi CHtml::submitButton tak abym za kazdym razem byl w stanie przeslac model ale mogl jednoczesnie rozpoznac ktry z submit buttons zostal przycisniety ?

Dzieki ogromne i pozdrawiam!

Marcin.


(Grzegorz Wiktorowski) #2

np:

  1. widok

[html]

<input type="submit" name="akcja" value="akcja1" />

<input type="submit" name="akcja" value="akcja2" />

[/html]

  1. kontroler

if ($_POST['akcja'] == 'akcja1') {

    //kod akcji 1

} else if ($_POST['akcja'] == 'akcja2') {

    //kod akcji 2

} else {

    //brak akcji

}



  1. widok

[html]

<input type="submit" name="akcja1" value="akcja1" />

<input type="submit" name="akcja2" value="akcja2" />

[/html]

  1. kontroler

if (isset($_POST['akcja1')) {

    //kod akcja1

} else if (isset($_POST['akcja2'])) {

    //kod akcja2

} else {

    //brak akcji

}




(Marcinrogut) #3

Czesc Viktor, dzieki za szybka odpowiedz. Taki tradycyiny sposob wykorzystuje obecnie ale tym sposobmem nie przekazuje zmiennej $model ktora jest typu array wiec nie moze byc przekazana przez POST. Moglbym uzyc metody implode ale $model jest zbyt skomplikowany. Tak wiec jedynym sposobem jaki widzie jest uzycie CHtml::submitButton, dzieki ktoremu bede w stanie przeslac $model, Dzieki!


(Grzegorz Wiktorowski) #4

Dałem Ci tylko "wzorzec projektowy :)", wydaje mi się, że nie ma żadnych przeszkód żeby przesyłać array przez POST, bo tak właśnie jest przesyłany model w YII, dla pewności bo nie do końca rozumiem o co chodzi, wklej, widok, kontroler i model (jak nie tajemnica):

  1. w widoku (public static string submitButton(string $label=‘submit’, array $htmlOptions=array ( )))



//proste użycie

echo CHtml::submitButton(string $label='submit', array ('name'='akcja', value='akcja' ))

//dołączenie do modelu

echo CHtml::submitButton(string $label='submit', array ('name'='nazwa_modelu[akcja]', value='akcja' ))



  1. kontroler

if ($_POST['nazwa_modelu']['akcja'] == 'akcja1') {

    //kod akcji 1

} else if ($_POST['nazwa_modelu']['akcja'] == 'akcja2') {

    //kod akcji 2

} else {

    //brak akcji

}

3.Dla pewności przed wypełnieniem modelu:


unset($_POST['nazwa_modelu']['akcja']);

$model->attributes=$_POST['Comment'];


(Marcinrogut) #5

Dzieki wielkie za wsparcie.

Chodzilo mi o przslanie zmiennej $model jako jedna z inputow, ze sie tak wyraze

np.:

<input type="hidden" name="model" value="<?php if(isset($model)) echo $model; ?>">

W takim wypadku nie bedzie to mozliwe, nie moge przeslac calego modelu.

Wpadlem jednak na pomysl ze wszytskie znaczace zmienne modelu wylistuje i uzyje implode, wtedy bede mogl przeslac jako string i po drugiej stronie uzyje explode zeby powrocic do array.

chyba sie uda taki workaround :)

Dzieki ogromne za pomoc.

Pozdrawiam!

Marcin.


(Grzegorz Wiktorowski) #6

Zainteresuj się raczej tym http://www.yiiframework.com/doc/guide/1.1/pl/topics.auth:




Yii::app()->user->twoj_model = $twoj_model



user jest zawsze dostępny, bo jest inicjowany automatycznie (jeżeli nic nie zmieniałeś), więc za pomocą "setState" możesz do niego wrzucić dowolny model lub zmienną i w każdej chwili ją odczytać, można użyć tego mechanizmu do przechowywania modelu między różnymi formularzami.

Lub zaimplementować użycie sesji session (dane dostępne dla użytkownika w jednej sesji praktycznie to samo co user setState) lub state persister (dane dostępne między wszstkimi żądaniami i sesjami)

http://www.yiiframework.com/doc/guide/1.1/pl/basics.application

Twój pomysł z implode i explode jakoś do mnie nie przemawia :)


(Marcinrogut) #7

Sprawdze to, bardzo dziekuje. Metoda z implode tez niezbyt mi sie podoba, ale jestem juz bliski skonczenia projektu i to sa ostateczne poprawki ktore odktylem tesutjac a deadline sie zbliza…

Dzieki za pomoc!


(Marcinrogut) #8

Dzieki ogormne, dziala! if(isset($model)) Yii::app()->user->setState(‘model’, $model);

moge przeslac caly model z view do kontorolera bez uzycia formularza. Dziekuje bardzo za pomoc!!!

Pozdrawiam!

Marcin.


(Afnwork) #9

Nie prościej przekazać id modelu składników np w url?


(Marcinrogut) #10

Dzieki za podpowiedz. Troche chaotycznie wytllumaczylem moj problem. Mianowicie, tak to wyglada.

Strona jest o przepisach kulinarnych. zarejestrowany urzytkonik moze stworzyc nowy przpis. Kazdy przpis posiada oczywisice liste skladnikow. Od strony bazy danych sa miedzy innymi 3 tablice: tablica w ktorej przechowywane sa przepisy zawierajaca min. id przepisu (PrimaryKey), druga tablica zawierajaca wszystkie mozliwe skladniki z id skaldnika (PK) i trzecia tablica laczaca przepisy z skaldnikami ( nazwana listaskaldnikow), tablica ta zawiera 4 kolumny: id przpisu (ForeginKey), id skaldnika(FK), ilosc, typ ilosci(FK). W momemcie towrzenia przpisu dane zapisaywane sa do dwoch tabel, mianowcie jeden record do tabeli przepisow, oraz kilka rekordow do tablicy listaSkladnikow w zaleznosci ile skldnikow posiada przepis. Moj problem polegal na tym ze nie chcialem miec sytucji w ktorej tworzy sie przepis bez listy skladnikow, w sytuacji gdy uzytkownik w pewnym momencie zamknie przegladareke i nei dokonczy procesu. Rozwiazalego uzywajac tylko jedenej metody actionCreate ktora w zaleznosci od postepu wyswietla inne widoki. Jezlie wszytsko ok to zapisuje do bazy danych calosc. Kolejny problem byl natury wyswietlania listy skladnikow do zaznaczenia. Chcialem to zrobic z lista checkbosow + dwa text pola przy kazdym checkbosie dla ilosci i typu i tutaj wlasnie nie moglem nigdzie znalezc jak to zrobic z yii. liste checkboxow moge wyswietlic ale nie moglem/nie potrafilem dodac pola textowego + dropdown list przy kazdym checkbosie no i pozniej zapisanie tego do bazy danych jako modelu, bo to jest wielokrotne zaspytanie w zaleznosci o ilosci wybranych skladnikow. Workaround do tego to zrobienie tej listy w tradycyjny sposob bez uzycia yii i tutaj wlasnie gubilem model danych dla przepisow.

Tak czy siak juz dziala. To jest projekt na prace dyplomowa, od instalacji systemu operacyjnego, do dzialajacej aplikacji. Mam czas do konca czerwca zeby to oddac a jeszcze musze opisac caly prcess, tak wiec sprezarka :) Dzieki ogromne za pomoc.

Mam juz kolejne pytanie, wiec zara zaczne watek :)

Pozdrawiam.