如何使用Yii2和mpdf将当前搜索条件打印/显示为PDF?

时间:2016-11-10 04:36:53

标签: php yii2 yii2-advanced-app mpdf

我一直试图通过Yii2高级模板在搜索功能上实现MPDF,但似乎没有给出我想要的结果。

我想要的是当我将值放在textField(sales_id)中时,我应该能够使用MPDF扩展来操作打印按钮,其中条件是mpdf中显示的数据应该只在其字段中包含类似的sales_id值,如下图所示:

view example

我在我的控制器中制作了这样的方法:

public function actionPrintPerSales()
    {
        // trying to get the sales_id post value
        $request = Yii::$app->request;
        $sales_id = $request->post('sales_id');
        $model = new PiutangCustomer();



    // Your SQL query filter here
    $dataProvider = new ActiveDataProvider([
        'query' => PiutangCustomer::find()
            ->where(['status_piutang' => '0'])
            ->andWhere(['sales_id'] => $sales_id)
            ->orderBy(['customer_id' => SORT_ASC])
    ]);

    $content = $this->renderPartial('_print-per-sales', ['model', 'dataProvider' => $dataProvider]);

    // setup kartik\mpdf\Pdf component
    $pdf = new Pdf([
    // set to use core fonts only
    'mode' => Pdf::MODE_CORE,
    // A4 paper format
    'format' => Pdf::FORMAT_A4,
    // portrait orientation
    'orientation' => Pdf::ORIENT_PORTRAIT,
    // stream to browser inline
    'destination' => Pdf::DEST_BROWSER,
    // your html content input
    'content' => $content,
    // format content from your own css file if needed or use the
    // enhanced bootstrap css built by Krajee for mPDF formatting
    'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
    // any css to be embedded if required
    'cssInline' => '.kv-heading-1{font-size:18px}',
    // set mPDF properties on the fly
    'options' => ['title' => 'Cetak Laporan Piutang Menurut Customer'],
    // call mPDF methods on the fly
    'methods' => [
    'SetHeader'=>['Laporan Piutang - NAMA TOKO / PERUSAHAAN / CV'],
    'SetFooter'=>['Powered by PFSOFT | {PAGENO}'],
    ]
    ]);

    /*------------------------------------*/
    Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
    $headers = Yii::$app->response->headers;
    $headers->add('Content-Type', 'application/pdf');
    /*------------------------------------*/

    // return the pdf output as per the destination setting
    return $pdf->render();
    }

对于View我做了这样的事情:

<?php echo $this->render('_search-per-sales', ['model' => $searchModel]); ?>

子表单_search-per-sales查看:

<?php $form = ActiveForm::begin([
        'action' => ['print-per-sales'],
        'method' => 'post',
    ]); ?>

<?= $form->field($model, 'sales_id')->textInput() ?>

<div class="form-group">
    <?= Html::submitButton(Yii::t('app', 'PRINT'), ['class' => 'fa fa-print btn btn-warning']) ?>
</div>

<?php ActiveForm::end(); ?>

至于actionPrintPerSales(_print-per-sales)的渲染视图:

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            // 'customer_id',
            [
                'label' => 'Nama Customer',
                'value' => 'customer.first_name',
            ],
            [
                'attribute' => 'nilai_piutang',
                'contentOptions' => ['style' => 'text-align:right'],
                'format'=>['decimal',0],
            ],
            [
                'attribute' => 'total_bayar',
                'contentOptions' => ['style' => 'text-align:right'],
                'format'=>['decimal',0]
            ],
            [
                'attribute' => 'sisa_piutang',
                'contentOptions' => ['style' => 'text-align:right'],
                'format'=>['decimal',0]
            ],
            'faktur',
            [
                'attribute' => 'tanggal_jatuh_tempo',
                'contentOptions' => ['style' => 'text-align:center'],
                'format' => ['date', 'php:d-M-Y']
            ],
            'sales_id',
            [
                'label' => 'Nama Sales',
                'value' => function ($data){ return $data->kodeSales->nama; },
            ],  
        ],
    ]); ?>

我的SQL查询过滤器在控制器内部出现了问题。我可以告诉我的mpdf正在工作,因为当我注释掉where子句时:

// ->andWhere('sales_id' = $sales_id)

pdf正在运行,只显示所有数据而不过滤sales_id。

2 个答案:

答案 0 :(得分:1)

尝试使用

  ->andFilterWhere(['sales_id' => $model->sales_id ])

可能是您$sales_id = $request->post('sales_id');没有按预期加载值。

答案 1 :(得分:0)

由于使用了ActiveForm,变量会以modelName[salesid]而非sales_id的形式传递到您的帖子中。您可以使用load填充表单中的模型属性:

$model->load(Yii::$app->request->post());

然后您可以通过以下方式过滤值:

$dataProvider = new ActiveDataProvider([
    'query' => PiutangCustomer::find()
        ->where(['status_piutang' => '0'])
        ->andWhere(['sales_id'] => $model->sales_id)
        ->orderBy(['customer_id' => SORT_ASC])
]);

您需要将$model传递给renderPartial

$content = $this->renderPartial('_print-per-sales', ['model' => $model, 'dataProvider' => $dataProvider]);

然后将$model传递到您的表单中:

<?php echo $this->render('_search-per-sales', ['model' => $model]); ?>