问题描述
我正在尝试通过按 eventView.PHP 中的打印按钮将 html 视图 eventView.PHP 导出并下载到 pdf,使用 mPDF。即使加载速度很慢,我现在也可以转换为 pdf,但现在我可以关于我试图在 pdf 上获取的数据出现错误。基本上我无法转换动态数据,你能帮我如何获取它们吗?
我使用以下方法下载了 mPDF:
作曲家需要 mpdf/mpdf
$config['composer_autoload'] = TRUE;
Incident.PHP 控制器
function get_pdf_test($id)
{
$data['incidents'] = $this->incidents_model->getByIdPdf($id);
$data['incidents_history'] = $this->incidents_model->getById_historyPdf($id);
$data['company_name'] = $this->incidents_model->getAllCompanyNamePdf();
require_once (APPPATH. 'vendor/autoload.PHP');
$path = '/tmp/mpdf';
if (!file_exists($path)) {
mkdir($path,0777,true);
}
$mpdf = new \Mpdf\Mpdf(['tempDir' => $path]);
$html = $this->load->view('admin/incidents/incidentsPdf',[],true);
$mpdf->WriteHTML($html);
$mpdf->Output();
$mpdf->Output('incidentsPdf.pdf','D');
}
incidentPdf.PHP 视图
<div class="TaskView" >
<h2 class="heading" ><?PHP echo "ASGB_IN".str_pad($incidents->incidents_id,'4','0',STR_PAD_LEFT);?></h2>
<!-- <form action="<?PHP echo base_url('get_pdf_test/'.$incidents->id);?>" method="post" > -->
<div class="row">
<div class="form-group col-md-4">
<label for="email">Incidents ID</label>
<input type="text" class="form-control" id="T_id" placeholder="Name" name="T_id" value="<?PHP echo "ASGB_IN".str_pad($incidents->incidents_id,STR_PAD_LEFT);?>" readonly>
</div>
<div class="form-group col-md-4">
<label for="email">Incidents Name</label>
<input type="text" class="form-control" id="Tname" placeholder="Name" name="Tname" value="<?PHP echo $incidents->incident_name;?>" readonly>
</div>
<div class="form-group col-md-4">
<label for="pwd">Company Name</label>
<input type="text"class="form-control" id="Cname" name="Cname" value="<?PHP echo $incidents->company_name;?>"readonly>
</div>
<div class="form-group col-md-4">
<label for="pwd">Project Name</label>
<input type="text" class="form-control" id="Pname" name="Pname" value="<?PHP echo $incidents->project_name;?>" readonly>
</div>
事件模型.PHP
function getById_history_pdf($id)
{
$query=$this->db->query("SELECT incidents_id FROM incidents WHERE id = $id");
$get_row = $query->row();
$incident_id = $get_row->incidents_id;
$this->db->select('*');
$this->db->where(array('incidents.incidents_id'=>$incident_id));
$this->db->join('incident_status','incidents.id = incident_status.incident_id');
return $this->db->get('incidents')->result_array();
}
function getAllCompanyNamePdf()
{
$query = $this->db->get('company_details');
$query = $this->db->query('SELECT company_name FROM company_details where delete_flag =0');
return $query->result_array();
}
function getByIdPdf($id)
{
return $this->db->get_where('incidents',array('id'=>$id))->row_array();
}
供应商位置
解决方法
您正在使用
require_once __DIR__ . '/vendor/autoload.php';
在您的控制器文件中。 __DIR__
计算为使用它的文件的目录。由于这是一个控制器文件,您正在尝试加载
/opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin/vendor/autoload.php
作为 __DIR__
评估为 /opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin
这不是正确的路径。
正确的代码是
require_once __DIR__ . '/../../vendor/autoload.php';
更好的解决方案是使用 APPPATH
,这样您就不必知道相对路径。
require_once APPPATH.'vendor/autoload.php';
你也可以
$config['composer_autoload'] = true;
您可以找到更多信息here.
最后,在 GitHb readme.md 中你可以看到这一点。
建议通过 tempDir 配置变量设置自己的临时目录。对于使用 mPDF(通常是 cli、webserver、fpm)的用户,该目录必须具有写入权限(建议使用模式 775)。
这意味着您需要一个可写的文件夹来进行临时操作。您可以将临时位置初始化为您喜欢使用的任何位置
$mpdf = new \Mpdf\Mpdf(['tempDir' => '/tmp']);
/tmp
始终可写。但是,您可以将任何文件夹和路径作为参数作为参数,如
$path = '/tmp/mpdf'; // You should change this as prefered.
if (!file_exists($path)) {
mkdir($path,0777,true);
}
$mpdf = new \Mpdf\Mpdf(['tempDir' => $path]);
,
确保您的 composer/manual mpdf 安装位于目录中
application\vendor
在你的 config\config.php 中设置
$config['composer_autoload'] = true;
或在您的控制器中使用:
require_once (APPPATH. 'vendor/autoload.php');
根据安装的 mpdf 版本,您可以使用命名空间 (V.7+),例如:
$mpdf = new \Mpdf\Mpdf();
其他版本(V.6.x)使用:
$mpdf = new mPDF();
所以只需像这样更改您的功能:
function DownloadPdf()
{
//require_once (APPPATH. 'vendor/autoload.php'); //-> you don't need this line if set in config.php
$mpdf = new mPDF();
$mpdf->WriteHTML('<h1>Hello world!</h1>');
$mpdf->Output();
}
,
只需运行 composer dump-autoload
以更新自动加载器...然后 \Mpdf\Mpdf
应该会被知道。如果这不起作用,请检查并修复文件系统权限,然后重试(虽然无法写入 vendor/autoload.php
,但显然无法将其添加到自动加载程序中)。
对于 Linux 上的 XAMPP,所有权应该是(不需要 777
,也不推荐):
chown -R daemon:daemon /opt/lampp/htdocs
并且通过将另一个用户添加到组 daemon
,他们将共享该组的权限。
从截图来看,问题似乎不是 mPDF,它似乎是数据。 错误 1:您有未定义的事件,这会导致创建 PDF 的问题。
错误 2:您正在传递一个对象,但是,mPDF 要求您传递一个数组。您将需要使用 asArray 或简单地使用模型的数组返回类型来转换模型返回数据。
参考:https://codeigniter4.github.io/userguide/models/model.html
此外,您不需要在控制器中明确定义自动加载。 从屏幕截图中需要注意的另一件事是它正在创建 PDF,但是,由于抛出错误,您无法正确查看 PDF。
更新:潜在问题可能是数据根本没有传递到视图。以下代码必须传递空数据
$html = $this->load->view('admin/incidents/incidentsPdf',[],true);
这里的 [] 传递的是空数据,因此即使在控制器中设置了视图,它也可能不会接收任何数据。