yii CGridView dataprovider और फिल्टर




(2)

मुझे पता है कि हम एक मॉडल के साथ एक ग्रिडव्यू दिखा सकते हैं और यह खोज पद्धति है और परिणाम को फ़िल्टर कर सकता है, लेकिन क्या हम किसी अन्य डेटाप्राइवर के साथ एक ग्रिडविवेयर बना सकते हैं और इस तरह के दूसरे मॉडल को और इसके परिणाम फ़िल्टर कर सकते हैं? क्या फिल्टर को डीटाप्रोवाइडर का एक हिस्सा होना चाहिए?

$attr = Yii::app()->request->getParam($name);

$model = new User('search');
$model->unsetAttributes();
$model->setAttributes($attr);

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $myDataProvider,
'filter' => $model,
'columns' => array(
    array(
        'name' => 'username',
        'type' => 'raw',
        'value' => 'CHtml::encode($data->username)'
    ),
    array(
        'name' => 'email',
        'type' => 'raw',
    ),
),

));

उपरोक्त कोड काम नहीं करता है और मुझे पूर्व में बनाई गई डेटा प्रदाता पर एक फ़िल्टर जोड़ने की आवश्यकता है।

बीटीडब्लू $attr पास एक वैध डेटा है, लेकिन ग्रिड को फ़िल्टर नहीं किया गया है।


$model $myDataProvider को प्रभावित नहीं करता है क्योंकि डेटा प्रदाता इस मॉडल का उपयोग नहीं किया गया है।

$model->search() CActiveDataProvider $model->search() एक CDbCriteria उदाहरण देता है जिसमें एक CDbCriteria होता है। अलग CDbCriteria जोड़ा जा सकता है mergeWith() तो अगर आप चाहते हैं कि डेटा $model से मूल्यों का उपयोग करके फ़िल्टर्ड किया जाए

...
$model->setAttributes($attr);

$newDataProvider=$model->search();
$myDataProvider->criteria->mergeWith($newDataProvider->criteria);

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

फ़िल्टर को डेटाप्राइवर का एक हिस्सा बनने की ज़रूरत नहीं है, लेकिन अगर आप फ़िल्टरिंग के लिए इसका उपयोग करना चाहते हैं तो डेटा प्रदाता को मॉडल को ध्यान में रखना होगा।

यह डिफ़ॉल्ट रूप से किया जाता है जिस तरह से आपके मॉडल पर search पद्धति का उपयोग करके डेटा प्रदाता बनाना है, जो मॉडल मानों के आधार पर आपके डेटा प्रदाता की स्थितियां सेट करता है, जैसे:

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

उदाहरण के लिए, आपको अलग-अलग डेटा प्रदाता बनाने से कुछ भी नहीं रोकता है:

'dataProvider' => $model->createAnotherDataProvider()

और आपके यूजर मॉडल में:

public function createAnotherDataProvider() {
{
    // create your second data provider here 
    // with filtering based on model's attributes, e.g.:

    $criteria = new CDbCriteria;
    $criteria->compare('someAttribute', $this->someAttribute);

    return new CActiveDataProvider('User', array(
        'criteria' => $criteria,
    ));
}