Yii Framework Forum: activeDropDownList i dane pobierane z tabeli - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

activeDropDownList i dane pobierane z tabeli Rate Topic: -----

#1 User is offline   robikon 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 17-October 11

Posted 28 January 2012 - 10:13 AM

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

1. tbl_program
- PK -> id_program (int)
- nazwa (txt)
- logo (blob)
- pozycja_stb (int)

2. 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)

3. 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.
0

#2 User is offline   Mariusz W. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 24
  • Joined: 15-December 11
  • Location:Poland/Warsaw

Posted 28 January 2012 - 11:03 AM

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ć.

2) 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 -->


3) 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,
		));
        }



4) Możesz użyć tego samego widoku formularza dla akcji update oraz dla akcji create :-)
Mam nadzieję, że wszystko dobrze napisałem... :)
Posted Image
Posted Image
0

#3 User is offline   robikon 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 17-October 11

Posted 30 January 2012 - 04:13 PM

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.
0

#4 User is offline   Mariusz W. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 24
  • Joined: 15-December 11
  • Location:Poland/Warsaw

Posted 31 January 2012 - 04:51 AM

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.
Posted Image
Posted Image
0

#5 User is offline   robikon 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 17-October 11

Posted 31 January 2012 - 06:35 AM

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

2. 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

3. 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.
0

#6 User is offline   Mariusz W. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 24
  • Joined: 15-December 11
  • Location:Poland/Warsaw

Posted 31 January 2012 - 06:53 AM

Spokojnie :-)
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.yiiframew...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',
        ),
)); 


2) 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.
Posted Image
Posted Image
0

#7 User is offline   robikon 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 17-October 11

Posted 31 January 2012 - 02:53 PM

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.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users