Yii Framework Forum: [Risolto] Mostrare Su Una View I Dati Correlati Di 2 Tabelle - Yii Framework Forum

Jump to content

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

[Risolto] Mostrare Su Una View I Dati Correlati Di 2 Tabelle Rate Topic: ***** 1 Votes

#1 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 28 November 2012 - 02:01 PM

Ciao a tutti!!
Ho cercato in svariati forum italiano ed inglese e non sono riuscito a trovare nessuna risposta al mio problema.

Sto cercardo di collegare 2 tabelle per una sola view.

Ho 2 tabelle, argomento e domande.
All'interno di entrambe c'è un un id_argomento.
Vorrei che quando clicco sull'id dell'argomento sotto mi stampa le domande correlate quindi ho pensato di fare CGridView.

Ho iniziato inserendo le relazioni nel mio model

public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
          'id_argomento' => array(self::BELONGS_TO, 'Domande', 'id_argomento'),
        );
    }



Poi ho creato una nuova function search per tirare fuori le righe correlate a quell'id_argomento

public function search01()
        {
               
                $connection=Yii::app()->db;     
                $sql="SELECT * FROM domande where id_argomento ='$data->id_argomento'";
                $command=$connection->createCommand($sql);
                $dataReader=$command->query();
                $rows=$dataReader->readAll();
                $ans=array();
                foreach($rows as $data)
                {
                        $ans=$data['domanda'];
                }
                return $ans;
        
        }




e infine nella _view del mio argomento ho inserito il seguente codice

<?php $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$model->search01(),
        'filter'=>$model,
        'columns'=>array(
                'id_argomento',
                'domanda',
                array('header'=>'Domanda per questo argomento','value'=>array($model,'search01')),
                'id_argomento',
                array('class'=>'CButtonColumn',
                        'template'=>'{view}'),
                ),
)); ?>



Non riesco a capire perchè mi da il seguente errore!
Fatal error: Call to a member function getData() on a non-object in C:\xampp\htdocs\yii\framework\zii\widgets\CBaseListView.php on line 108

Per favore chiedo aiuto, sono nuovo con questo framework e con php.

Spero che qualcuno possa aiutarmi

GRAZIE MILLE!!!!
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 29 November 2012 - 02:43 AM

id_argomento è solo il nome della relazione, quando usi un CGridView, oltre al nome della relazione, devi indicare anche il nome del campo che vuoi vedere. Ad esempio 'id_relazione.nome'.
0

#3 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 29 November 2012 - 08:42 AM

Quindi dopo che l'ho richiamata dove la utilizzo?
Scusa la mia ignoranza ma sono in difficoltà.

Grazie
0

#4 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 29 November 2012 - 12:25 PM

View Postprova17, on 29 November 2012 - 08:42 AM, said:

Quindi dopo che l'ho richiamata dove la utilizzo?
Scusa la mia ignoranza ma sono in difficoltà.

Grazie


Prova con questo, sostituendo NOME_ATTRIBUTO con il nome del campo che vuoi mostrare.

<?php $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$model->search01(),
        'filter'=>$model,
        'columns'=>array(
                'id_argomento.NOME_ATTRIBUTO',
                'domanda',
                array('header'=>'Domanda per questo argomento','value'=>array($model,'search01')),
                'id_argomento',
                array('class'=>'CButtonColumn',
                        'template'=>'{view}'),
                ),
)); ?>


Poi dicci se sei hai risolto il tuo problema.
0

#5 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 30 November 2012 - 01:03 AM

Prima di tutto grazie per l'aiuto.

Ho provato come mi hai consigliato ma ricevo ancora lo stesso errore

<?php $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$model->search01(),
        'filter'=>$model,
        'columns'=>array(
                'id_argomento.domanda',
                'domanda',
                array('header'=>'Domanda per questo argomento','value'=>array($model,'search01')),
                'id_argomento',
                array('class'=>'CButtonColumn',
                        'template'=>'{view}'),
                ),
)); ?>


Ma secondo te il ragionamento generale è giusto?
Oppure c'è un'altra soluzione con qualche cosa del framework Yii?

Thanks!
0

#6 User is offline   emafer 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 23-February 12
  • Location:Amandola

Posted 30 November 2012 - 04:22 AM

Ciao
secondo me, oltre a quanto segnalato da Sensorario, hai messo Yii in confusione, creando la relation con lo stesso nome di un attributo (id_argomento, id_argomento), perciò quando scrivi id_argomento credo che a Yii venga naturale usare l'attributo.
se rinomini la relation in "argomento" o comunque con un nome diverso da qualsiasi atributo definito nel model dovresti risolvere
0

#7 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 30 November 2012 - 08:38 AM

Sinceramente ci avevo pensato anche io ma ho modificato più volte i nomi ma sinceramente ancora non capisco bene la funzione relation.

Comunque sto provando con una nuova alternativa perchè questa mi sembra un po complessa.

Nel modello Argomento.php ho inserito la relations

public function relations()
{
    return array(
        'domanda'=>array(self::BELONGS_TO,'Domande','id_argomento'),
    );
}



Poi nel modello Domande.php ho inserito un'altra relation (collegando i due id_argomento)

   public function relations()
{                                       {
    return array(
        'argomento'=>array(self::HAS_MANY,'Argomento','id_argomento'),
                 
    );
}



Alla fine nella view dell'argomento ho inserito il seguente codice

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

    'dataProvider'=>new CActiveDataProvider('Domande',array(
        'criteria'=>array(
            'with'=>array( 
                'argomento'=>array(
                    'select'=> 'id_argomento',
                                        
                ),
            ),
        ),
    )),
));


In questa maniera sono riuscito a stampare tutte le domande che sono presenti nel DB ma a me servirebbero solo quelle collegato all' id_argomento che ho selezionato

Cosa posso modificare?
Oppure c'è un'altra soluzione?

Grazie a tutti per l'aiuto
0

#8 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 30 November 2012 - 11:04 AM

Mi hai confuso anche a me, sono sincero. Stai ragionando come se non avessi affatto un framework sotto mano. In genere non devi scrivere una riga di codice perché ha svolto tutto lo sporco lavoro il framework. Detto questo, ti chiedo di ripartire da capo astraendo il problema e senza parlare di soluzioni. Ti chiedo, quindi, di parlare come se fossi un cliente, ovvero una persona che non sa nemmeno dell'esisteza di php.
0

#9 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 30 November 2012 - 01:14 PM

Hai ragione chiedo scusa per la confusione che ho creato postando codice a destra e a sinistra.

Come già ho spiagato ho 2 tabelle (argomento e domande)

Tabella argomento:
-id_argomento
-titolo_argomento

Tabella domande:
-id
-domanda
-id_argomento

Dopo che ho inserito il mio argomento grazie al create del framework inserisco le domande facendo riferimento all'id_argomento che ho apppena inserito

es. In un argomento ci sono 8 domande.

Vorrei che quando entro nel dettaglio di un argomento ci siano stampate le righe delle domande correlate a quell'argomento.

Spero che qualcuno abbia qualche soluzione sennò mi sto perdendo nel codice e faccio confusione anche a voi.

GRAZIE ANCORA PER L'AIUTO
0

#10 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 01 December 2012 - 05:17 AM

Mi sono creato un database simile al tuo per fare una prova:
CREATE TABLE IF NOT EXISTS `argomento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titolo` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `domande` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `domanda` varchar(50) NOT NULL,
  `argomento_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Quindi ho creato i due Model ed i relativi CRUD. Dopodichè, a manina, sono andato nel model Argomento ed ho aggiunto una relazione HAS_MANY con le domande:
class Argomento extends CActiveRecord {
        public function relations()
        {
                return array(
                        'domande' => array(self::HAS_MANY, 'Domande', 'argomento_id'),
                );
        }
}


Ultimo, ma non meno improtante, sono andato nella pagina views/argomento/view.php ed ho aggiunto questa riga in fondo al file:
<?php foreach($model->domande as $domanda) : ?>
        <?php echo $domanda->domanda; ?><br />
<?php endforeach; ?>

1

#11 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 01 December 2012 - 09:33 AM

Perfetto funziona alla grande Grazie MILLE! ;)

Per chi è interessato ho trovato un altro modo per la stampa dei risultati.
Per pura informazione!

Dopo aver creato la relation nella view ho inserito il seguente codice.

$domanda=Domande::model()->findAll("id_argomento='$model->id_argomento'");

$dataProvider = new CArrayDataProvider($domanda);
$id_argomento='id_argomento';
$dataProvider->keyField=$id_argomento;

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
                        
     'columns'=>array(
	       'id',
	       'domanda' ,
		   
  )  
));


Spero che possa servire a qualcuno!

GRAZIE ANCORA A TUTTI PER L'AIUTO! :D
0

#12 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 01 December 2012 - 01:41 PM

Va bene, ma sei completamente fuori standard. Yii è un framework MVC. Se impari ad usare il framework MVC tutto diventerà più semplice.

MVC sta per (Model View Controller).

Model è la parte di codice che si occupa dei dati. In pratica tutto ciò che si trova all'interno della cartella protected/models è codice che agisce SOLO sui dati.

View è la parte che si occupa solo della visualizzazione dei dati. Le due parti, in genere, non comunicano tra di loro. View si occupa solamente del css e dell'HTML.

Controller, prende il model e la view e li assembla.

Il tuo codice non è sbagliato, ma non è standard. E tu mi dirai: "E perché se non è sbagliato lo devo scrivere in un altro modo?". Lo devi fare perché se un domani passi il tuo lavoro ad un altro sviluppatore, saprà dove cercare le cose. Lo devi fare perché quando ci chiederai aiuto, in futuro, prima di risolvere il tuo problema dovremo cercare di reinterpretare da capo il tuo codice (non standard).

Come ti dicevo, nel controller carico i dati e li renderizzo insieme alla view:
class ArgomentiController
{
    public function actionView ()
    {
        $domanda = Domande::model()->findAll("id_argomento='$model->id_argomento'");
        $dataProvider = new CArrayDataProvider($domanda);
        $dataProvider->keyField = $id_argomento;

        $this->render('view', array(
            'dataProvider' => $dataProvider
        ));
    }
}


E nella view...
<?php
        $this->widget('zii.widgets.grid.CGridView', array(
            'dataProvider'=>$dataProvider,
            'columns'=>array(
                'id',
                'domanda',
            )  
        ));

1

#13 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 01 December 2012 - 01:43 PM

PS. Quando ricevi risposte valide da qualcuno in questo forum, dovresti fare anche due cose. La più importante è aggiungere "[RISOLTO]" al titolo del thread che hai aperto. In questo modo sarà più semplice cercare qualcuno che ha bisogno di aiuto. La seconda, meno importante, è cliccare sul "+" verde in basso a destra. Quello serve per dare punteggi alle risposte migliori e per far si che chi da migliori risposte abbia un migliore punteggio.
0

#14 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 02 December 2012 - 07:00 AM

Grazie mille di nuovo!!! Come ti dicevo non sono ancora pratico del framework ma sto imparando piano piano.
Imparo dai miei errori e dai vostri consigli!

GRAZIE!! ::)

P.S.: Sembrerò un tonto ma non so come modificare il titolo con [RISOLTO]
0

#15 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 03 December 2012 - 01:25 AM

Nessuno è tonto =). Clicca sul tuo messaggio dove trovi il pulsante "Edit", quindi cerca "Use Full Editor" per poter modificare anche il titolo. E benvenuto nella community.
0

#16 User is offline   prova17 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-November 12

Posted 03 December 2012 - 04:11 AM

Fatto!!!
Thanks ;)
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