如何从 yii2fullcalendar 生成 pdf?

如何解决如何从 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 操作上对其进行反序列化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-