[Risolto] Mostrare Su Una View I Dati Correlati Di 2 Tabelle

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!!!!

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

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.

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!

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

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

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.

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

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; ?>



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

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',

            )  

        ));



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.

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]

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.

Fatto!!!

Thanks ;)