[Yii 1] Problema Con Whgridview E Tbrelationalcolumn

Salve!

Ho un problema con WhGridView e TbRelationColumn. Probabilmente mi potrebbe aiutare realtebo in quanto ho visto che in passato ha affrontato lo stesso problema con YiiBooster e TbGridView.

In pratica ho due WhGridView in cui la prima ha un TbRelationColum in cui clickando mi visualizza la seconda grid.

Quando faccio click sulla riga per visualizzare la sub grid, tutto ok viene visualizzata. Quando cambio l’ordinamento o la pagina della sub grid scompaiono ambedue le grid.

Da quello che ho capito bisognerebbe differenziare la classe css del pager e del sort della sub grid da quella della grid principale. Come fare questo nello specifico?

Questa è la view della grid principale:


$this->widget('yiiwheels.widgets.grid.WhGridView',array(

	'id'=>'masterGrid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

        'template' => "{summary}{items}<div class=\"row-fluid\"><div class=\"pull-right\">{pager}</div></div>",

        'type' => array(TbHtml::GRID_TYPE_BORDERED, TbHtml::GRID_TYPE_STRIPED),   

	'columns'=>array(

		array(

                    'class' => 'yiiwheels.widgets.grid.WhRelationalColumn',

                    //'name' => 'multiMembers.id',

                    'type' => 'raw',

                    'header' => 'Sub Items',

                    'url' => $this->createUrl('multiGroup/ajaxSubItems'),

                    'cacheData' => false,

                    'value' => "CHtml::tag('button',array('class'=>'btn btn-primary'),'Sub Items')",

                    'htmlOptions'=>array('style'=>'width:90px;'),

                    'cssClass' => 'showSubItems',

                ),            

		'id',

		'title',

		array(

			'class'=>'bootstrap.widgets.TbButtonColumn',

		),

	),

));



questa la sub grid:


    echo CHtml::tag('h3',array(),'Sub Items Group #"'.$id.'"');

    $this->widget('yiiwheels.widgets.grid.WhGridView', array(

        'id'=>'subGrid_'.$id,

        'type'=>array(TbHtml::GRID_TYPE_BORDERED, TbHtml::GRID_TYPE_STRIPED),

        'dataProvider' => $gridDataProvider,

        'template' => "{summary}{items}<div class=\"row-fluid\"><div class=\"pull-right\">{pager}</div></div>",

        'columns' => $gridColumns,

        ));

nel controller ho:


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new MultiGroup('search');

		$model->unsetAttributes();  // clear any default values

		if (isset($_GET['MultiGroup'])) {

			$model->attributes=$_GET['MultiGroup'];

		}


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

			'model'=>$model,

		));

	}


	public function actionAjaxSubItems()

	{

            $id = Yii::app()->getRequest()->getParam('id');

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

            if($model->numSubItems > 0) {

                $this->renderPartial('_child', array('id' => $id, 

                                                     'gridDataProvider' => $this->getGridDataProvider($id),

                                                     'gridColumns' => $this->getGridColumns()

                                                ), false, true);

            } else {

                echo 'Non ci sono Sub Items.';

            }

	}

        

        public function getGridDataProvider($id) {

            

            $sql = 'SELECT * FROM multi_member WHERE groupid = :groupid ORDER BY lastname,firstname';

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

            $cmd->bindParam(':groupid', $id, PDO::PARAM_INT);

            $result = $cmd->queryAll();

            

            $dataProvider = new CArrayDataProvider(

                        $result, array(

                            'sort' => array(

                                'attributes' => array('id','groupid','firstname','lastname','membersince'),

                                'defaultOrder' => array('lastname' => CSort::SORT_ASC, 'firstname' => CSort::SORT_ASC),

                                ),

                            'pagination' => array(

                                'pageSize' => 2,

                            ),

                          ));

            

            return $dataProvider;

            

        }

        

        public function getGridColumns() {

            

            return array('id', 'lastname', 'firstname', 'membersince');


        }

Come posso fare?

grazie…

Ciao, complimenti per l’analisi e +1 per il tag di versione.

Chiuse le chiacchiere …

mi hai fatto ricordare che effettivamente si trattava di differenziare TUTTE le classi css e TUTTI gli id, che ovviamente avrai già verificato che siano diversi, tra le due tabelle intendo, è però passato tantissimo tempo ed ho abbandonato YiiBooster, passando invece ad una sempre più spinta estensione e quindi personalizzazione delle classi CGridView, CDataColumn, CLinkColumn, etc…

… questo per dirti che la strada e la motivazione sono quelle, ma la soluzione è ben lontana dalla mia memoria.

Tra l’altro, sappi che io alla fine ho rinunciato, anche se credo sia stato per volontà del cliente che non sapeva come usarla :(

Quello che potresti fare è: usando webdeveloper extension su firefox, verificare che il sorgente GENERATO dopo aver aperto la sotto tabella NON contenga classi ‘doppie’ ne tantomeno id doppi, quindi, sempre con FF, usare firebug ed una estensione (non ricordo il nome…) che ti dice quali eventi ‘avvengono’ in un certo periodo di tempo, insomma un pesante debug del javascript.

Aggiungo: ero persino andato su stackoverflow a chiedere aiuto: http://stackoverflow.com/questions/14497501/yii-booster-how-to-render-a-cgridview-inside-a-relation-table-row

Questa l’unica risposta che avevo ricevuto

@realtebo

innanzitutto grazie x la risposta.

Avevo già visto il tuo post su stack overflow. Per questo speravo avessi risolto e di potere approfittare della tua esperienza. Non sono un programmatore professionista, ma solo amatoriale. Mi occupo di Yii e di programmazione web solo da poco tempo. Prima programmavo solo in delphi…

Chiederò anche sul forum internazionale e su stack overflow. chissà forse qualcuno ha affrontato il problema.

p.s. bella Ferrara…

grazie a te per la pazienza, se trovi una soluzione, per favore, postala anche qui nell’italiano, almeno il link al post ‘risolutivo’, così è utile per i posteri

Aggiornamento sulla situazione.

Ho fatto un post sia sul forum internazionale, che in Stack Overflow, ma ancora non ho avuto risposta.

Per il momento ho sostituito la seconda Whgridview di dettaglio con una tabella fatta con tablesorter (http://www.yiiframework.com/extension/tablesorter/) e sembra che per il momento funzioni tutto.

Devo solo sistemare l’aspetto della tabella e la lingua.

Studierò il componente per eventuali configurazioni…

io l’ho utilizzata e in effetti aveva questo tipo di problemi, nella mia configurazione però avevo sia il summary che la pagination disattivata, la cosa che non andava era la TbuttonColumn, con un pò di debug sono riuscito a rintracciare l’errore che era appunto quello che dicevate voi, le classi o gli id con cui yii andava a scrivere il codice js che venivano duplicati nella pagina.

io ho risolto con:




'options'=>array('class'=>'update_att-'.uniqid()),



per ogni bottone della column e andando a disattivare a livello di controller tutti i js che yii cercava di ricaricare quando faceva l’update della grid.

Per debuggare la cosa ho usato l’inspector di chrome che è ottimo per vedere quali js vengono richiamati dopo la richiesta ajax e comunque ha anche la sua console di debug js.

se questo tipo di errore risiede anche nelle classi del paginatore, ti invito ad estendere la grid e a riscriverti partendo da quello offerto di default, il paginatore ed evitare questo tipo di problema.

Grazie st4nny,

sto ricevendo più assistenza qui che sul forum interzionale.

Ho capito cosa intendi, ma sto studiando Yii da poco e non ho ancora le competenze richieste per fare ciò, magari in futuro ci riuscirò.

Nel frattempo cercherò metodi alternativi…