问题描述
我正在尝试使用 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],
我想传递事件数组对您来说不是必需的,在这种情况下,让两种方法都生成数组会容易得多。
由于您使用相同的代码来获取 index
和 index_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
操作上对其进行反序列化。