Экспорт сетки Yii2 в pdf с пользовательским шаблоном и отфильтрованными данными

Я безуспешно пытаюсь экспортировать свой gridview в pdf :(. Это часть кода моего контроллера:

class LntTripsController extends Controller
{
    protected $repquery; // my only idea is to pass query parameters via global variable
    .................
    public function actionIndex()
    {
        $searchModel = new LntTripsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        $this->repquery = Yii::$app->request->queryParams; // save request here
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
.............
//Here I do export with custom template: 

    public function actionReport() {

        $searchModel = new LntTripsSearch();
        $dataProvider = $searchModel->search($this->repquery); //restore request here

        $content = $this->render('report', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);

        $pdf = Yii::$app->pdf;
        $mpdf = $pdf->api;
        $mpdf->WriteHtml($content);
        return $pdf->render();
    }
}

Функция actionIndex() работает нормально, но actionReport() всегда выводит полную таблицу, даже если она была отфильтрована в actionIndex(). Переменная $this->repquery всегда NULL в actionReport().


person Vadzim Yatskevich    schedule 29.01.2016    source источник


Ответы (3)


когда вы вызываете actionReport, контроллер создается заново, а затем вы теряете сохраненные параметры запроса.

если вы хотите сохранить эти параметры, не сохраняйте их в контроллере, вы можете сохранить значение в

$session = Yii::$app->session;

см. этот документ для получения подробной информации об управлении сеансом http://www.yiiframework.com/doc-2.0/yii-web-session.html

http://www.bsourcecode.com/yiiframework2/session-handling-in-yii-framework-2-0/

person scaisEdge    schedule 29.01.2016
comment
но LntTripsSearch также недавно создан в actionReport() той же информации о потере данных. может есть другой способ передачи данных между действиями? - person Vadzim Yatskevich; 30.01.2016
comment
Вы можете передавать данные между действием, но не таким образом. Вы хотите сохранить queryParam и после получить это значение. для этого можно использовать сессию.. - person scaisEdge; 30.01.2016
comment
Как вы вызываете отчет?.. если вы вызываете отчет, вы знаете или можете знать queryParam, вы можете вызвать отчет, передав это значение.. - person scaisEdge; 30.01.2016

Вы не получите значения, используя $this->repquery, потому что $this относится к текущему объекту.
У вас есть два метода, и оба имеют разные объекты:

$searchModel = new LntTripsSearch();

Итак, вам нужно просто использовать $repquery вместо $this->repquery.

protected $repquery;

public function actionIndex()
{
    $searchModel = new LntTripsSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    $repquery = Yii::$app->request->queryParams;
    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

public function actionReport() 
{
    $searchModel = new LntTripsSearch();
    $dataProvider = $searchModel->search($repquery); 

    $content = $this->render('report', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);

    $pdf = Yii::$app->pdf;
    $mpdf = $pdf->api;
    $mpdf->WriteHtml($content);
    return $pdf->render();
}
person Insane Skull    schedule 30.01.2016
comment
тогда я получу переменную Undefined: исключение repquery - person Vadzim Yatskevich; 30.01.2016

Спасибо за ответы. Сессия - это решение в моем случае.

public function actionIndex()
{
    $searchModel = new LntTripsSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    $session = Yii::$app->session;
    // check if a session is already open
    if (!$session->isActive){
        $session->open();// open a session
    } 
    // save query here
    $session['repquery'] = Yii::$app->request->queryParams;

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}


public function actionReport() 
{

    $searchModel = new LntTripsSearch();
    // restore query using session
    $dataProvider = $searchModel->search(Yii::$app->session->get('repquery'));

    $content = $this->render('report', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
    // create pdf
    $pdf = Yii::$app->pdf;
    $mpdf = $pdf->api;
    $mpdf->WriteHtml($content);
    return $pdf->render();
}
person Vadzim Yatskevich    schedule 30.01.2016
comment
это несправедливо .. неправильно принять предложение того, кто вам поможет, и использовать эту информацию, чтобы дать себе (украденный) принять ответ ... - person scaisEdge; 01.02.2016