对 prestashop PDF 生成过程感到困惑。处理逻辑的代码在哪里?
Confused about prestashop PDF generated process. Where is the code to handle the logic?
想深入了解一下prestahop的内部结构,修改一些地方。我在 PDF 中停了下来。我想找不到用于处理 AdminPdf 和 generateDeliverySlipPDF
的控制器
{if $order->delivery_number}
<a class="btn btn-default _blank" href="{$link->getAdminLink('AdminPdf')|escape:'html':'UTF-8'}&submitAction=generateDeliverySlipPDF&id_order={$order->id}">
<i class="icon-truck"></i>
</a>
{/if}
谁能帮我弄清楚里面的流程?我找不到处理 generateDeliverySlipPDF 的方法。
AdminPdfController
位于 /controllers/admin/AdminPdfController.php
。
url 的 submitAction=generateDeliverySlipPDF
部分将调用此控制器内部的方法 processGenerateDeliverySlipPDF()
。
这是这个方法:
public function processGenerateDeliverySlipPDF()
{
if (Tools::isSubmit('id_order')) {
$this->generateDeliverySlipPDFByIdOrder((int)Tools::getValue('id_order'));
} elseif (Tools::isSubmit('id_order_invoice')) {
$this->generateDeliverySlipPDFByIdOrderInvoice((int)Tools::getValue('id_order_invoice'));
} elseif (Tools::isSubmit('id_delivery')) {
$order = Order::getByDelivery((int)Tools::getValue('id_delivery'));
$this->generateDeliverySlipPDFByIdOrder((int)$order->id);
} else {
die(Tools::displayError('The order ID -- or the invoice order ID -- is missing.'));
}
}
在此 Controller 中,您会找到与此方法一样的其他方法来生成发票、订单...和其他 PDF。
如果您需要更多信息,请随时询问。
编辑:
如果您想以正确的方式更改格式,则必须覆盖那些 类:
/override/classes/pdf/PDFGenerator.php
:
<?php
/**
* @since 1.5
*/
class PDFGenerator extends PDFGeneratorCore
{
/**
* @param bool $use_cache
* @param string $orientation
* @param string $format
*/
public function __construct($use_cache = false, $orientation = 'P', $format = 'A4')
{
TCPDF::__construct($orientation, 'mm', $format, true, 'UTF-8', $use_cache, false);
$this->setRTL(Context::getContext()->language->is_rtl);
}
}
/override/classes/pdf/PDF.php
:
<?php
/**
* @since 1.5
*/
class PDF extends PDFCore
{
/**
* @param $objects
* @param $template
* @param $smarty
* @param string $orientation
*/
public function __construct($objects, $template, $smarty, $orientation = 'P', $format = 'A4')
{
parent::__construct($objects, $template, $smarty, $orientation);
$this->pdf_renderer = new PDFGenerator((bool)Configuration::get('PS_PDF_USE_CACHE'), $orientation, $format);
}
}
/override/controllers/admin/AdminPdfController.php
:
<?php
class AdminPdfController extends AdminPdfControllerCore
{
public function generatePDF($object, $template)
{
switch($template) {
case PDF::TEMPLATE_DELIVERY_SLIP:
$format = array(210, 50000); // Replace with your desired size
break;
default:
$format = 'A4';
}
$pdf = new PDF($object, $template, Context::getContext()->smarty, 'P', $format);
$pdf->render();
}
}
现在您可以为每个 PDF 指定格式。
您将在 this place
找到有关 $format
的信息
此代码尚未经过测试,但应该可以按预期工作。如果您遇到任何问题,请告诉我。
您需要在添加这些覆盖后删除 /cache/class_index.php
以清除 Prestashop 内部 类 路径缓存。
谢谢你的这个话题,
想请教一下前面生成pdf的情况?
即
这是 history.tpl
的一部分
`{if $order.details.invoice_url}
<a href="{$order.details.invoice_url}"><i class="material-icons"></i></a>`
我发现 $order.details.invoice_url 在 OrderPresenter.php 中定义
和 OrderPresenter 使用 HistoryController 获取 invoice_url.
所以我看一下 historyController
if ((bool) Configuration::get('PS_INVOICE') && OrderState::invoiceAvailable($order->current_state) && count($order->getInvoicesCollection())) {
$url_to_invoice = $context->link->getPageLink('pdf-invoice', true, null, 'id_order='.$order->id);
if ($context->cookie->is_guest) {
$url_to_invoice .= '&secure_key='.$order->secure_key;
}
}
getPageLink 使用 "pdf-invoice" ,我查看了 getPageLink 方法,发现 "pdf-invoice" 是一个控制器...
问题是我不知道这个控制器在哪里?
请帮忙
想深入了解一下prestahop的内部结构,修改一些地方。我在 PDF 中停了下来。我想找不到用于处理 AdminPdf 和 generateDeliverySlipPDF
的控制器 {if $order->delivery_number}
<a class="btn btn-default _blank" href="{$link->getAdminLink('AdminPdf')|escape:'html':'UTF-8'}&submitAction=generateDeliverySlipPDF&id_order={$order->id}">
<i class="icon-truck"></i>
</a>
{/if}
谁能帮我弄清楚里面的流程?我找不到处理 generateDeliverySlipPDF 的方法。
AdminPdfController
位于 /controllers/admin/AdminPdfController.php
。
url 的 submitAction=generateDeliverySlipPDF
部分将调用此控制器内部的方法 processGenerateDeliverySlipPDF()
。
这是这个方法:
public function processGenerateDeliverySlipPDF()
{
if (Tools::isSubmit('id_order')) {
$this->generateDeliverySlipPDFByIdOrder((int)Tools::getValue('id_order'));
} elseif (Tools::isSubmit('id_order_invoice')) {
$this->generateDeliverySlipPDFByIdOrderInvoice((int)Tools::getValue('id_order_invoice'));
} elseif (Tools::isSubmit('id_delivery')) {
$order = Order::getByDelivery((int)Tools::getValue('id_delivery'));
$this->generateDeliverySlipPDFByIdOrder((int)$order->id);
} else {
die(Tools::displayError('The order ID -- or the invoice order ID -- is missing.'));
}
}
在此 Controller 中,您会找到与此方法一样的其他方法来生成发票、订单...和其他 PDF。
如果您需要更多信息,请随时询问。
编辑:
如果您想以正确的方式更改格式,则必须覆盖那些 类:
/override/classes/pdf/PDFGenerator.php
:
<?php
/**
* @since 1.5
*/
class PDFGenerator extends PDFGeneratorCore
{
/**
* @param bool $use_cache
* @param string $orientation
* @param string $format
*/
public function __construct($use_cache = false, $orientation = 'P', $format = 'A4')
{
TCPDF::__construct($orientation, 'mm', $format, true, 'UTF-8', $use_cache, false);
$this->setRTL(Context::getContext()->language->is_rtl);
}
}
/override/classes/pdf/PDF.php
:
<?php
/**
* @since 1.5
*/
class PDF extends PDFCore
{
/**
* @param $objects
* @param $template
* @param $smarty
* @param string $orientation
*/
public function __construct($objects, $template, $smarty, $orientation = 'P', $format = 'A4')
{
parent::__construct($objects, $template, $smarty, $orientation);
$this->pdf_renderer = new PDFGenerator((bool)Configuration::get('PS_PDF_USE_CACHE'), $orientation, $format);
}
}
/override/controllers/admin/AdminPdfController.php
:
<?php
class AdminPdfController extends AdminPdfControllerCore
{
public function generatePDF($object, $template)
{
switch($template) {
case PDF::TEMPLATE_DELIVERY_SLIP:
$format = array(210, 50000); // Replace with your desired size
break;
default:
$format = 'A4';
}
$pdf = new PDF($object, $template, Context::getContext()->smarty, 'P', $format);
$pdf->render();
}
}
现在您可以为每个 PDF 指定格式。 您将在 this place
找到有关$format
的信息
此代码尚未经过测试,但应该可以按预期工作。如果您遇到任何问题,请告诉我。
您需要在添加这些覆盖后删除 /cache/class_index.php
以清除 Prestashop 内部 类 路径缓存。
谢谢你的这个话题,
想请教一下前面生成pdf的情况?
即 这是 history.tpl
的一部分 `{if $order.details.invoice_url}
<a href="{$order.details.invoice_url}"><i class="material-icons"></i></a>`
我发现 $order.details.invoice_url 在 OrderPresenter.php 中定义 和 OrderPresenter 使用 HistoryController 获取 invoice_url.
所以我看一下 historyController
if ((bool) Configuration::get('PS_INVOICE') && OrderState::invoiceAvailable($order->current_state) && count($order->getInvoicesCollection())) {
$url_to_invoice = $context->link->getPageLink('pdf-invoice', true, null, 'id_order='.$order->id);
if ($context->cookie->is_guest) {
$url_to_invoice .= '&secure_key='.$order->secure_key;
}
}
getPageLink 使用 "pdf-invoice" ,我查看了 getPageLink 方法,发现 "pdf-invoice" 是一个控制器... 问题是我不知道这个控制器在哪里? 请帮忙