activeDropDownList i dane pobierane z tabeli

Witam.

Ano ugrzązłem troszkę, otóż ma 3 tabele:

  1. tbl_program
  • PK -> id_program (int)

  • nazwa (txt)

  • logo (blob)

  • pozycja_stb (int)

  1. tbl_spin (tabela łącząca tbl_program i tbl_pakiet bo tabele są w relacji wiele do wielu)
  • PK -> id_spin (int)

  • FK -> id_program (int)

  • FK -> id_pakiet (int)

  1. tbl_pakiet
  • PK -> id_pakiet (int)

  • nazwa (txt)

Gii ładnie wygenerowało modele, widoki i kontrolery dla tabel program i pakiet oraz dla tabeli spin gdzie w relacjach modelu jest kod:


return array(

			'pakiet' => array(self::BELONGS_TO, 'TblPakiet', 'pakiet_id'),

			'program' => array(self::BELONGS_TO, 'TblProgram', 'program_id'),

		);

Moje pytanie jest takie, jak dla widoku ‘spin’ podczas tworzenia nowego rekordu zrobić aby pola - FK -> id_program, FK -> id_pakiet używając CHtml::activeDropDownList pobierały dane z tabeli program i pakiet oraz zpisywały w tych polach odpowiednie id z tabel program i pakiet, ale żeby DropDownList wyświetlany był wg pól nazwa.

Próbowałem, ale mam problem z zakapowaniem tego.

  1. W modelu spin w rules musisz mieć określone pola id_program oraz id_pakiet jako "required"

Zapewne taki model został wygenerowany, ale możesz sprawdzić.

  1. W widoku (np. _form.php) tworzysz formularz np:



<div class="form">

<?php echo CHtml::beginForm(); ?>

 

    <?php echo CHtml::errorSummary($model); ?>

 

    <div class="row">

        <?php echo CHtml::activeLabel($model,'id_program'); ?>

        <?php echo CHtml::activeDropDownList($model,'id_program',CHtml::listData(Program::model()->findAll(), 'id_program', 'nazwa' ), array('prompt'=>'Wybierz program...')); ?>

    </div>


    <div class="row">

        <?php echo CHtml::activeLabel($model,'id_pakiet'); ?>

        <?php echo CHtml::activeDropDownList($model,'id_pakiet',CHtml::listData(Pakiet::model()->findAll(), 'id_pakiet', 'nazwa' ), array('prompt'=>'Wybierz pakiet...')); ?>

    </div>

 

    <div class="row submit">

        <?php echo CHtml::submitButton('Zapisz'); ?>

    </div>

 

<?php echo CHtml::endForm(); ?>

</div><!-- form -->



  1. Teraz w kontrolerze w akcji np. create



        public function actionCreate()

        {

            $model=new Spin;

            

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

                {

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

                    $model->save();

                }

          

          $this->render('_form.php',array(

			'model'=>$model,

		));

        }



  1. Możesz użyć tego samego widoku formularza dla akcji update oraz dla akcji create :slight_smile:

Mam nadzieję, że wszystko dobrze napisałem… :)

Dzięki, zastosowałem tylko w widoku i działa, ale napotkałem na następny problem w modelu Spin. Chodzi o dwa widoki: view i index.

Czy jest możliwe określenie dla widoku index innego zestawu danych tak aby wyświetlało mi dane z sql’a w postaci:

tbl_program.nazwa, tbl_program.logo, tbl_program.pozycja_stb, tbl_pakiet.nazwa (czyli złączenie pól z tabel) zamiast samych indeksów z tabeli tbl_spin.

Ta sama sytuacja dotyczy widoku view zamiast indeksów w polach tbl_spin.id_program i tbl_spin.id_pakiet wyświetlały sie powiązane z nimi pola odpowiedni tbl_program.nazwa i tbl_pozycja.nazwa.

Witaj,

Do widoku możesz przekazać dowolne dane.

Decyzję jakie dane przekazujesz do widoku podejmujesz w akcji kontrolera.

Napisałeś, że w modelu Spin masz takie relacje:




return array(

                        'pakiet' => array(self::BELONGS_TO, 'TblPakiet', 'pakiet_id'),

                        'program' => array(self::BELONGS_TO, 'TblProgram', 'program_id'),

                );



W takim razie w kontrolerze dajesz:




public function actionIndex($pakiet_id, $program_id)

{

   //ładujemy odpowiedni pakiet

   $pakiet=Pakiet::model->findByPk($pakiet_id);

   if($pakiet==null) 

     throw new CHttpException(400,"Podany pakiet nie istnieje");


   //to samo dla programu

   ....


   $this->render('index',array('program'=>$program,'pakiet'=>$pakiet));

}



A w widoku index.php wyświetlasz te dane, które przekazałeś w metodzie render.




<?php echo $program->nazwa; ?><br/>

<?php echo $program->logo; ?><br/>

<br/><br/>

<?php echo $pakiet->nazwa; ?><br/>



Nie do końca wyjaśniłeś co dokładnie chcesz pokazać w widoku view, a co w widoku index, dlatego mam nadzieje, że dobrze Cię zrozumiałem.

Może faktycznie niedokładnie opisałem o co mi chodzi - Model i Kontroler to Spin:

  1. Widok view.php zawiera kod:



...

<h1>View Spin #<?php echo $model->id_spin; ?></h1>


<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		'id_spin',

		'id_program',

		'id_pakiet',

	),

)); ?>



Czego jest wyświetlenie rekordu w postaci identyfikatorów które są w relacji do tabeli Program i Pakiet:

ID->1

Program->1

Pakiet->1

a chciałbym aby było:

ID->1

Program->Polsat

Pakiet->DTV

  1. Widok inedx.php zawiera kod:



...

<h1>Spins</h1>


<?php $this->widget('zii.widgets.CListView', array(

	'dataProvider'=>$dataProvider,

	'itemView'=>'_view',

)); ?>



czyli ciągnie dane z widoku częściowego _view.php i podobnie jak wyżej dane są wyświetlane w formie identyfikatorów plus chciałbym dołożyć do rekordu aby wyświetlał także dodatkowe informacje z powiązanych tabel Program i Pakiet, np:

ID->1

Program->Polsat

Logo->{obrazek}

Pozycja STB->002

Pakiet->DTV

  1. Jeżeli takie dane dałoby radę wcisnąc do widoku index.php to w jaki sposób zaimplementować funkcje wyszukiwania, która jest dostepna w widoku admin.php

Dopiero startuje w tym frameworku, do tej pory robiłem to czystym php i sam określałem co gdzie i jak a tu mam problem z załapaniem.

Spokojnie :slight_smile:

Też zacząłem nie dawno pracę na tym frameworku i jest to mój pierwszy framework.

Szczerze mówiąc cieszę się, że zacząłem właśnie od niego, ponieważ nie dawno widziałem jak mój znajomy robił coś w Zendzie i jest tam więcej pracy (tak na pierwszy rzut oka).

Język angielski jest podstawowym językiem dla programistów. Dlatego warto szukać swoich problemów w google wpisując angielskie wyrażenia - często ludzie opisują ogólne problemy na swoich blogach czy mini tutorialach.

Warto też dokładnie przeczytać ogólne informacje o frameworku, które są również dostępne w języku polskim.

  1. Widok view

Przeczytaj o leniwej i zachłannej konkretyzacji (http://www.yiiframework.com/doc/guide/1.1/pl/database.arr)

W tym przypadku warto użyć zachłannej konkretyzacji

także w kontrolerze model pobieramy w taki sposób:




public function actionView($id_spin)

{

   $model=Spin::model()->with('TblPakiet','TblProgram')->findByPk($id_spin);

   .....

}



A w widoku:




$this->widget('zii.widgets.CDetailView', array(

        'data'=>$model,

        'attributes'=>array(

                'id_spin',

                'TblPakiet.nazwa',

                'TblProgram.nazwa',

        ),

)); 



  1. Co do index…

Zasada ta sama, tylko że $dataProvider, który przekazujesz do widoku jest tworzony za pomocą CDbCriteria.

I tam należy użyć:

$criteria->with=array(‘TblPakiet’,‘TblProgram’);

a w widoku częściowym _view.php odwołać się po tych relacjach do konkretnych pól.

Poradziłem sobie ze wszystkim, nawet paginację dodałem ups…, ale czy można zaadoptować taki sam mechanizm wyszukiwania jaki jest stosowany w widoku admin.php.

Update.

No i dorobiłem taki sam mechanizm wyszukiwania.