Visualizzare Risultato Di Una Query

Buongiorno a tutti.

Sono abbastanza nuovo di Yii, nel senso che qualche tempo fa ho realizzato un’applicazione molto semplice, poi è passato del tempo, e adesso ho bisogno di realizzare un’applicazione sempre molto semplice, ma per la quale ho qualche problema che non sono riuscito a risolvere da solo, nemmeno cercando in rete per tutta la settimana.

In sostanza ho tre tabelle di DB, ognuna collegata all’altra da una chiave esterna, come nel file allegato

Ho bisogno di visualizzare il risultato della seguente query:

SELECT T1.ID, T2.C1, T2.C2, T2.C3, T3.CX

FROM T1, T2, T3

WHERE T2.Fk3 = T3.ID

AND T1.Fk2 = T2.ID

AND T1.ID = <acquisita dal form>

e ho pensato di operare nel modo seguente (Per migliorare la leggibilità ho messo il codice in un txt allegato):

  1. Scrivo il model MyForm (nel file allegato, eredita CFormModel), che contiene le variabili per accogliere il risultato

  2. Scrivo _form.php e _view.php adattando quelle che ho già sulle view generate da CRUD

  3. Scrivo due view (view.php e trova.php, nel file allegato)

  4. Scrivo il controller MyFormController.php (nel file)

A questo punto non so più che pesci prendere: mi rendo conto che devo fare qualcos’altro in getResult(), ma non capisco cosa. Se lancio l’applicazione e vado all’url http: //server/app/index.php?r=myform/trova il form di ricerca compare correttamente, ma se clicco va su una pagina vuota.

So che ho fatto un mare di boiate, ma non riesco a capire cosa e dove correggere.

Sono molto confuso, qualcuno potrebbe aiutarmi con questo codice o di indicarmi una strada migliore?

Grazie a tutti per l’attenzione, ciao!

Se clicchi dove? Che rotta ha la pagina vuota? Che dicono i log di Yii? Di Apache e di PHP?

Se sai che sono boiate, perché le hai fatte?

Se non ci mostri il tuo codice, come possiamo correggerlo noi?

Scusa, il codice era in un file txt che ero sicuro di aver allegato… incollo sotto.

Il button della pagina di ricerca http: //server/app/index.php?r=searchform/trova

http ://server/appindex.php?r=searchform/view&id=123456

Abilitati log direttamente sulla pagina: non dicono nulla, a parte i vari "Loading… application component"

Non ci avevo pensato… i log di Apache dicono che non trovano una funzione del controller, la indico nel codice…

Stavo cercando un modo di fare una cosa e leggendo i vari tutorial e altre cose penso di aver seguito la strada più corretta. Poi però mi sono impantanato, come capita spesso a chi è alle prime armi.

Eccolo. Grazie mille per l’interessamento… non pretendo che mi correggiate il codice, ma se magari qualcuno mi potesse dire se sto seguendo la strada giusta o darmi qualche altro suggerimento…


/*

[TABELLE DB]


T1

+-----+

| ID  |     T2

+-----+	   +-----+

| Fk2 |--->| ID  |     T3

+-----+    +-----+    +-----+

           | Fk3 |--->| ID  |

           +-----+    +-----+

           | C1  |    | CX  |

	   +-----+    +-----+

	   | C2  |

	   +-----+

	   | C3  |

	   +-----+

*/




		   

//[SearchForm.php]


class SearchForm extends CFormModel

{

    public $t1id;

    public $t2c1;

    public $t2c2;

    public $t2c3;

    public $t3cx;


    public function rules() 

    {

        return array(

            array('t1id', 'required'),

        );

    }

    

    public function attributeLabels()

    {

            return array(

                    't1id' => 'Label1',

                    't2c1' => 'Label2',

                    't2c2' => 'Label3',

                    't2c3' => 'Label4',

                    't3cx' => 'Label5',

            );

    }

}




		   

//[view.php]


<?php

$this->breadcrumbs=array(

	'SearchForms'=>array('index'),

	$model->t1id,

);

?>


<h1>#<?php echo $model->t1id; ?></h1>


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

	'data'=>$model,

	'attributes'=>array(

		't1id',

        't2c1',

        't2c2',

        't2c3',

        't3cx',

	),

)); 




		   

//[trova.php]


<?php

$this->breadcrumbs=array(

	'SearchForms'=>array('index'),

	'Trova',

);


?>

<?php $this->renderPartial('_form', array('model'=>$model)); ?>





		   


//[SearchFormController.php]


<?php

class SearchFormController extends Controller

{

    public $layout='//layouts/column2';

    public function filters()

    {

            return array(

            );

    }

    public function actionTrova()

    {

        $model = new SearchForm;

        

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

        {

            

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

            

            if ($model->validate())

            {

                $this->redirect(array('view','id'=>$model->t1id));

            }

        }

        

        $this->render('trova',array(

             'model'=>$model, // Model is passed to create.php View!

         ));

       

    }

    public function actionView($id)

    {

            $this->render('view',array(

                    'model'=>$this->loadModel($id),

            ));

    }

    

//**********************ERRORE APACHE********************

    public function loadModel($id)

    {

        $model=getResult($id); //APACHE MI DA ERRORE QUI (Call to undefined function)

        if ($model === null) {

            throw new CHttpException(404, 'The requested page does not exist.');

        }

        return $model;

    }


    public function getResult($t1id)

    {

        $query="SELECT T1.ID, T2.C1, T2.C2, T2.C3, T3.CX

			FROM T1, T2, T3

			WHERE T2.Fk3 = T3.ID

			AND T1.Fk2 = T2.ID

			AND T1.ID = :t1id";

        $cmd = Yii::app()->db->createCommand($query);

        $cmd->bindParam(":t1id",$t1id,PDO::PARAM_STR);

        return $cmd->execute();

        

        //<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />

    }

}



dovrebbe essere




$model=$this->getResult($id);



Secondo me stai seguendo la strada sbagliata =). Nel senso che MyForm non ti fa capire di che form si tratta. Oppure, peggio ancora: t1id, t2c1, t2c2, … che cosa sono? Perché devo fare lo sforzo di ricordarmi che cosa significano e non posso concentrarmi solo sulla lettura di quello che effettivamente sono? Se una cosa è un campo due della tabella due, chiamalo tranquillamente campoDueTabellaDue. Io forse ci ho preso, ma poteva anche dire tendineDueCiabatteUno. Cerca di scrivere codice leggibile.

Grazie, proverò…

T1 = tabella 1

C1 = colonna 1

Comunque ho fatto lo schema del DB…

Si scusa, però i nomi che gli ho dato nella realtà non sono molto più significativi di questi :(

E poi in che senso MyForm non mi farebbe capire di che form si tratta?

Nel senso che in un’applicazione web ci sta che non ci sia una sola form, e se inizi a chiamarle MyForm MyForm1 MyForm2, sicuramente non riuscirai a distanza di giorni a revisionare il codice con facilità. Di solito i nomi si danno associandoli all’entità che descrivono.

Si hai ragione, e infatti la vera applicazione ha nomi che per me sono significativi, ma che mi sembrava stupido replicare in una richiesta d’aiuto, così qui li ho cambiati.

Non so, mi sembrava più facile da leggere se mettevo nomi generici… magari mi sbaglio, boh,

E’ il form di My. Se sichiamasse RegistrationForm sapremmo tutti che si tratta del form di registrazione. Se si chiamasse NewsletterForm sapremmo che si tratta del form per una Newsletter. E così via.

Va bene, adesso correggo MyForm in SearchForm…

Meglio?

Scusa se ti rispondo solo adesso, ma ho ripreso in mano l’applicazione solo ora.

Non aiuta molto…

Comunque non ho ancora capito se sto seguendo una strada "buona" oppure mi devo orientare verso un altro approccio.

Nel secondo caso lo scopo è semplicemente quelli di visualizzare il risultato della query, che in sostanza è una funzione di ricerca all’interno del DB a partire dalla chiave.

Così sembra veramente molto semplice, in PHP puro ci si mette un secondo, non posso credere che sia così complicato realizzarlo con il framework…

no infatti, se provi ad usare gii per generarti le crud di un tuo model, potresti avere del codice con cui prendere dimestichezza con le funzionalità del framework:

ecco qui un loadModel




public function loadModel($id)

	{

		$model=SearchForm::model()->findByPk($id);

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}



Se provo a generare il controller con gii dopo aver scritto il model, dice che non me lo fa fare perché il model deve estendere CActiveRecord, mentre il mio estende CFormModel…

Quindi dovrei sovrascrivere il metodo findByPk in modo da fargli restituire il risultato della mia query? Uhm…

non un usare $model=SearchForm::model()->findByPk($id);

ma $model=TuoModel::model()->findByPk($id); con TuoModel il model interessato, quello che si riferisce alla tabella in cui vai a ricercare i risultati.

Ok, grazie per i suggerimenti.

Non appena riesco a metterli in pratica ti faccio sapere…