Yii custom sql CGridView hiba

Yii custom sql CGridView hiba
2021-11-02T18:05:55+01:00
2021-11-03T10:42:07+01:00
2022-10-15T21:20:57+02:00
christem2
Sziasztok,

Egy csomó forumot megnéztem és egyszerűen nem értem mi lehet a hiba. A jelenség a következő:
Szeretném egy saját SQL eredményét megjeleníteni egy CGridViewban Yii 1 framework alatt.

Model:
public function test()
    {
        $count = Yii::app()->db->createCommand()
                ->select('count(*)')
                ->from('departments')
                ->queryScalar();

        $dataProvider = new CSqlDataProvider("SELECT * from departments", array(
            'totalItemCount'=>$count,
            'pagination'=>array(
                'pageSize'=>10,
            ),
        ));

        return $dataProvider;
    }

Controller:


public function actionAdmin()
{
        $model = new Departments('test');
        $model->unsetAttributes();  // clear any default values
        if(isset($_GET['Departments']))
            $model->attributes=$_GET['Departments'];

        $this->render('admin',array(
            'model'=>$model,
        ));
}

View: admin.php
$this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'departments-grid',
        'dataProvider'=>$model->test(),
        'filter'=>$model,
        'columns'=>array(
            'id',
            'department_type_id',
            'name',
            'content_hun',
            'content_eng',
            'isactive',
            array(
                'class'=>'CButtonColumn',
            ),
        ),
    ));

Amikor futtatom a következő hibaüzenet jelenik meg és nem tudom mit csinálok rosszul.
Trying to get property 'primaryKey' of non-object

Stack trace csatolva.

Előre köszönök minden segítséget!

Mutasd a teljes hozzászólást!
Csatolt állomány
Íme másfél óra nyomozásom eredménye:

Van egy különbség a CActiveDataProvider::getData és a CSqlDataProvider::getData metódusának a visszatérési értéke között, és a valós szintaktika így nézhet ki:
array[array] CSqlDataProvider::getData()
array[CActiveRecord] CActiveDataProvider::getData()

Ez két ok miatt lényeges információ:
1) A CButtonColumn forráskódja alapján: "Type of the <code>$data</code> depends on {@link IDataProvider data provider} which is passed to the {@link CGridView grid view object}.". Továbbá, a létrehozott gombok URL-je valójában egy string, ami egy PHP kifejezést tartalmaz, amit majd az örökölt CComponent::evaluateExpression(string) fog majd végrehajtani. Ez pedig így néz ki:

public $viewButtonUrl='Yii::app()->controller->createUrl("view",array("id"=>$data->primaryKey))';
Tehát ez CActiveDataProviderrel fog együtt működni csak, mivel a CActiveRecord-nak van primaryKey propertyje.

2) Mivel a fentebbi string-ként tárolt PHP kifejezés nem értelmezhető array[array] esetben, ez "Trying to get property 'primaryKey' of non-object" E_NOTICE szintű hibaüzenetet fog eredményezni.

A lehetséges megoldások:
1) Adj a CGridView-nak CActiveDataProvider adatforrást. Ez performance-t illetően nem biztos, hogy a legjobb választás, már ha ez a szempont fontos.
2) A View-ben kicsit meg kell faragni a gombok URL PHP kifejezését:

$this->widget('zii.widgets.grid.CGridView', array( 'id'=>'departments-grid', 'dataProvider'=>$model->test(), 'filter'=>$model, 'columns'=>array( 'id', 'department_type_id', 'name', 'content_hun', 'content_eng', 'isactive', array( 'class'=>'CButtonColumn', 'template' => '{view}{update}{delete}', 'buttons' => array( 'view' => array( 'url' => 'Yii::app()->controller->createUrl("view",array("id"=>$data["id"]))', ... ), ... ) ), ), ));
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd