Przekazywanie danych

Witam,

Zacznę od tego, że Yii dla mnie to nowość- generalnie frameworki. Nie zajmowałem się dotąd web developerką. Dostałem małego sampla od kolegi i mam kilka pytań:

Będąc w widoku stworzyłem CHtml::dropDownList(‘imieNazwiskoList’,’’, $imieNazwiskoList) jak przekazać wartość zaznaczonego pola listy, do modelu- do gotowej metody bez dodawania kolejnych argumentów metody?

Jeśli coś niejasne, to dopowiem.

Z góry dziękuję i pozdrawiam

Droga wygląda następująco:

Model --> Controller --> View [ tutaj jest render Twoich danych ],

View --> Controller --> Model [ tutaj masz droge zapisania danych po submicie i save ]

teraz poniżej prosty przykład renderowania __form [ np do tworzenia rekodru ]:


public function actionCreate()

    {


        $model = new ClientData();

        

        if ($model->load(Yii::$app->request->post() & $model->save()){


                    return $this->redirect(['index']);

        } 

        

        return $this->render('create', [

        'model' => $model,

        ]);

    }

Teraz tak renderujemy widok:


<?php $form = ActiveForm::begin(); ?>


    <?= $form->field( $model, 'clientId')

            ->dropDownList( $model->getClientList(), ['prompt' => '' ] ) 

        ?> 


    <div class="form-group">

        <?= Html::submitButton('Create', ['class' => btn btn-success']) ?>

    </div>


    <?php ActiveForm::end(); ?>

Teraz submit przesyła dane do controllera i zachowuje w bazie.

Oczywiście możesz samemu zdefiniować do jakieg kontrolera/metody submit odsyła forma.


<?php $form = ActiveForm::begin(); ?>


    <?= $form->field( $model, 'clientId')

            ->dropDownList( $model->getClientList()//getCLientList to metoda pobierająca liste klientów- czaje

             , ['prompt' => '' ] ) //po co to?

        ?> 


    <div class="form-group">

        <?= Html::submitButton('Create'//to 'create' odwołuje się do actionCreate w modelu tak?

        , ['class' => btn btn-success']) ?>

    </div>


    <?php ActiveForm::end(); ?>


public function actionCreate()

    {


        $model = new ClientData();

        

        if ($model->load(Yii::$app->request->post() & $model->save()){//sprawdza czy jest zapytanie dodania rekordu?


                    return $this->redirect(['index']);// po dodaniu przerzuca nas do indexu

        } 

        

        return $this->render('create', [// czemu służy to create?

        'model' => $model,// 'model' to odwołanie do którego modelu? w widoku?

        ]);

    }

Wybaczcie, że tak łopatologicznie, ale w ogóle nie czaje o co chodzi w tych "frameworkach" dlaczego niektóre rzeczy są w apostrofach? Całe życie i wszędzie to po prostu był tekst, ale tutaj są one formą wskaźników czy konektorów pomiędzy widokiem/kontrolerem/modelem?

Nie czaje, tego ale muszę to jakoś ogarnąć, projekt tego odemnie wymaga, a samo się nie zrobi ;)


<?php $form = ActiveForm::begin(); ?>


    <?= $form->field( $model, 'clientId')

            ->dropDownList( $model->getClientList()

             , ['prompt' => '' ] ) //żeby defaultowy wybór na liscie to był pusty tekst, opcjonalna opcja;

        ?> 


    <div class="form-group">

        <?= Html::submitButton('Create'// jeżeli nie zdefiniujesz innego URL, to defaultowo wybierany jest controller w którym sie znajdujesz;

        , ['class' => btn btn-success']) ?>

    </div>


    <?php ActiveForm::end(); ?>


public function actionCreate()

    {


        $model = new ClientData();

        

        if ($model->load(Yii::$app->request->post() & $model->save()){// Pierwsze sprawdza, czy w zapytaniu do kontrolera znajduje się coś w $_POST, jeżeli tak to ładuje to modelu wszystkie dane z formu, a drugie zapisuje dane uzsykane z poprzedniego, jeżeli zapis jest poprawny to zwraca true;


                    return $this->redirect(['index']);// tak jeżeli rekord został zapisany przeżuca nas do wskazanego kontrolera/akcji, tutaj jest pominięty kontroler, bo wybieramy akcje z kontrolera w którym się znajdujemy;

        } 

        

        return $this->render('create', [// jeżeli któryś z warunków w if jest false, to wyrenderuję Ci create.php a on wyrenderuje _form;

        'model' => $model,// 'model' // model to odwołanie do modelu do którego chcesz zapisać dane, do tego który zdefiniowany jest w pierwszej linijce akcji ($model = new ClientData()<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/wink.gif' class='bbc_emoticon' alt=';)' />;

        ]);

    }

edit. jakby coś było niejasne śmiało pytaj, jutro odpowiem.

Jak przechwycić wartość zaznaczonej opcji w droplist? bo chciałbym dynamicznie zaraz po zaznaczeniu pozycji, znaleźć szukaną i wygenerować dane- jak już wiem(chwała Ci za to). Tylko jak przechwycić tekst z dropdownlisty. Bo tego tam nie czaje. Chcę ją wrzucić do zmiennej w widoku.

Możesz przechwycić ją jQuery jak ‘on change state event’, następnie przesłać ajaxem do kontrolera, i odebrać dane i wy renderować je na widoku.

Napisz konkretnie chcesz zrobić to będę wstanie bardziej pomóc.


echo CHtml::dropDownList('dropdownlistID','', $imie_nazwisko_array);

z tej listy pobrać imie_nazwisko(jquery, mówisz?), znaleźć userid(DONE), dalej to jest przesyłane do komponentu (DONE), i z komponentu odpalana jest metoda z modelu Userów(DONE). W zasadzie jedyne co mi brakuje, to dosłownie wyciągnąć to co jest wybrane w dropDownList i będę miał to gotowe.


public static string dropDownList(string $name, string $select, array $data, array $htmlOptions=array ( ))

wg. dokumentacji, to $selected to pole które jest zaznaczone… ale oczywiście jak wrzucam tam zmienną to pusto :(

a żeby Ci pokazać dokładnie musiałbym rzucić całym projektem- a to trochę dużo ;)

Jeżeli chcesz to przekazać z odświeżeniem strony to najprościej submit button, który przekaże selected value do kontrolera i tam robisz co chcesz z tą zmienną dalej, np:

generujesz na jej podstawie jakiś view.

Jeżeli to ma być dynamic action, bez przeładowania strony to przekazujesz to do kontrolera za pomocą jQuery, sprawdź ID jakie ma twój input, i zbierz selected value on change event i przekaż Ajaxem do kontrolera.

Zbierz zwrotke i zrób z nią to co Ci potrzeba.

Jakoś tak mgliście to rozumiem, chyba zbyt dużo siedzenia już dziś w kodzie.

Ja to bym zrobił tak, renderuje sobie view w którym jest:


echo CHtml::dropDownList('dropdownlistID','', $imie_nazwisko_array);

przerzucam to sumbmitem, albo Ajaxem do kontrolera, tam wykonuje cały file search i renderuje dane na poprzedni widok, które mi są potrzebne.


		$form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array('enableAjaxValidation'=>false));

		echo CHtml::dropDownList(

			'dropdown', 

			'select',

			$this->getImieNazwisko_array(), 

			array('prompt' => 'Wybierz..' )

		);		

		echo '<br>';		

		echo CHtml::submitButton(

			'Wybierz',

			array(

			'class' => 'btn btn-success')// za pomocą tego chce pobrać wartość dropdownListy

		);

		echo '<br><br>';

		$this->endWidget();

	

?>

<?php	

	foreach(Yii::app()->user->getFlashes() as $key => $message) {

		echo '<div class="alert alert-'.$key.'"><button type="button" class="close" data-dismiss="alert">&times;</button>'.$message."</div>\n";

	}?>

	</div>

</div>

	<?php

		$this->widget( 'indexWidget', array('typGrupy' => 1, 'user' => //i wsadzić tą wartość tu- mogę przeładować stronę jeśli to wymaga.

) );

	?>

No to masz dwi opcje:

W kkntrolerze do ktorego przekieruje Cie submit grabnij posta i zwroc render([‘yourPage’, ‘wantedValue’ => $dropListPickedValue]), a w view daj:

If(isset($wantedValue){

Tutaj wrzuc zmienna w wybrane mijesce

}else{

Render bez zmiennej

}

Albo przekaz Ajaxem wynik forma do do kontrolera (chyba ze jedyna rzecza jaka ma to robic to zostac przekazane do ‘user’ =>…

To zrob jQuey bind na submit buttona, napisz preventDefault i przenies Sobie wartosc z wybranego forma do attr tego widgetu ii tyle.

Sorki za taki balagan, ale z tabletu pisze ;)

HA zrobiłem działa, w końcu czaję na jakiej zasadzie te dane wędrują między poziomami (widok/kontroler/model)… Cytując klasyka “Bo kto sie w PHP’ie połapie” ;) Dziękuję!