如何从 yii2fullcalendar 生成 pdf?

问题描述

我正在尝试使用 kartik-mpdf 从 philipfrenzel-yii2fullcalendar 的月视图和日视图生成 pdf 文件,但出现此错误

收到参数“事件”的无效数据。

为此,我在控制器中生成一个 actionIndexPdf($events) 方法一个 index_pdf.PHP 视图文件,其中 yii2fullcalendar 小部件接收 $events 作为参数。

问题出在动作的renderPartial。好像是事件数组有问题。

代码如下:

控制器 CalendarioController.PHP

public function actionIndex() {
        $calendario = Calendario::find()->all();
        $events = [];

        foreach ($calendario as $cal) {
            $event = new \yii2fullcalendar\models\Event();
            $event->id = $cal->id;
            $event->title = $cal->pedido->cliente->nombre;
            $event->id_pedido = $cal->pedido->id;
            $event->sector = $cal->pedido->cliente->sector;
            $event->direccion = $cal->pedido->cliente->direccion;
            $event->telefono = $cal->pedido->cliente->telefono;
            $event->textColor = '#302B16';
            switch ($cal->pedido->estado) {
                case 0:
                    $event->estado = 'Pendiente de entrega';
                    break;
                case 1:
                    $event->estado = 'Entregado sin deuda';
                    break;
                case 2:
                    $event->estado = 'Entregado con deuda';
                    break;
            }
            $event->start = $cal->pedido->fecha_solicitud;
            $event->end = $cal->pedido->fecha_entrega;
            $event->color = $cal->pedido->color;
            $event->allDay = false;
            $events[] = $event;
        }
        return $this->render('index',[
                    'events' => $events
        ]);
    }

public function actionIndexPdf($events) {
        die(var_dump($events));
        Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
        $formatter = \Yii::$app->formatter;
        $pdf = new Pdf([
            'mode' => Pdf::MODE_CORE,// leaner size using standard fonts
            'format' => Pdf::FORMAT_LETTER,'orientation' => Pdf::ORIENT_PORTRAIT,'destination' => Pdf::DEST_broWSER,//Se renderiza la vista "pdf" (que abrirá la nueva ventana)
            'content' => $this->renderPartial('index_pdf',['events' => $events]),'options' => [
            // any mpdf options you wish to set
            ],'cssFile' => '@vendor/kartik-v/yii2-mpdf/src/assets/kv-mpdf-bootstrap.min.css','cssInline' => 'body{
                font-size:12px;
              }',]);
        return $pdf->render();
    }

查看 index_pdf.PHP

<?PHP

/* @var $this yii\web\View */
/* @var $searchModel app\models\CalendarioSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Calendario de Pedidos';
$this->params['breadcrumbs'][] = $this->title;

?>
<p>
        <?= yii2fullcalendar\yii2fullcalendar::widget([
            'events' => $events,'id' => 'calendar','options' => [
                      'lang' => 'es',],'clientOptions' => [
                    'selectable' => false,'editable' => true,'droppable' => true,'header' => [
                        'left' => 'prev,next,today','center' => 'title','right' => 'month,listDay','height' => 'auto','displayEventTime' => false,]);
        ?>
    </p>

index.PHP 视图中的按钮

    <p>
        <?PHP 
            //Imprime el boton generar pdf
//        die(var_dump($events));
            echo Html::a('Generar PDF',['index-pdf','events' => $events],[
                    'class' => 'btn btn-success','target'=>'_blank','data-toggle'=>'tooltip',//    'title'=>'Will open the generated PDF file in a new window'
                ]);
        ?>
    </p>

解决方法

您正试图在此行上将一组数据作为 GET 参数传递:

echo Html::a('Generar PDF',['index-pdf','events' => $events],

我想传递事件数组对您来说不是必需的,在这种情况下,让两种方法都生成数组会容易得多。

由于您使用相同的代码来获取 indexindex_pdf 这两种方法上的事件,因此您可以提取该代码并在两种方法中调用它来获取 $events

您可以将代码移出控制器,例如移入帮助器类中,但为简单起见,我将仅添加使用同一控制器内的方法的示例。

private function getCalendarEvents() {
    $events = [];
    foreach (Calendario::find()->each() as $cal) {
        $event = new \yii2fullcalendar\models\Event();
        $event->id = $cal->id;
        $event->title = $cal->pedido->cliente->nombre;
        $event->id_pedido = $cal->pedido->id;
        $event->sector = $cal->pedido->cliente->sector;
        $event->direccion = $cal->pedido->cliente->direccion;
        $event->telefono = $cal->pedido->cliente->telefono;
        $event->textColor = '#302B16';
        switch ($cal->pedido->estado) {
            case 0:
                $event->estado = 'Pendiente de entrega';
                break;
            case 1:
                $event->estado = 'Entregado sin deuda';
                break;
            case 2:
                $event->estado = 'Entregado con deuda';
                break;
        }
        $event->start = $cal->pedido->fecha_solicitud;
        $event->end = $cal->pedido->fecha_entrega;
        $event->color = $cal->pedido->color;
        $event->allDay = false;
        $events[] = $event;
    }
    return $events;
}

然后在两个动作上调用它

public function actionIndex() {
    return $this->render('index',[
        'events' => $this->getCalendarEvents()
    ]);
}

public function actionIndexPdf() {
    $events = $this->getCalendarEvents();
    Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
    $formatter = \Yii::$app->formatter;
    $pdf = new Pdf([
        'mode' => Pdf::MODE_CORE,// leaner size using standard fonts
        'format' => Pdf::FORMAT_LETTER,'orientation' => Pdf::ORIENT_PORTRAIT,'destination' => Pdf::DEST_BROWSER,//Se renderiza la vista "pdf" (que abrirá la nueva ventana)
        'content' => $this->renderPartial('index_pdf',['events' => $events]),'options' => [
        // any mpdf options you wish to set
        ],'cssFile' => '@vendor/kartik-v/yii2-mpdf/src/assets/kv-mpdf-bootstrap.min.css','cssInline' => 'body{
             font-size:12px;
        }',]);
    return $pdf->render();
}

如果将事件数组作为参数传递一项要求,您可能需要对其进行序列化以生成链接,然后在 index_pdf 操作上对其进行反序列化。