对prestashop PDF生成过程感到困惑。处理逻辑的代码在哪里?

问题描述 投票:4回答:2

我想深入了解prestahop内部结构并修改一些部分。我停在PDF中。我想找不到用于处理Admin Pdf的控制器并生成Delivery Slip PDF

    {if $order->delivery_number}
      <a class="btn btn-default _blank" href="{$link->getAdminLink('AdminPdf')|escape:'html':'UTF-8'}&amp;submitAction=generateDeliverySlipPDF&amp;id_order={$order->id}">
      <i class="icon-truck"></i>
    </a>
   {/if}

谁能帮我搞清楚内部流程?我找不到处理generateDeliverySlipPDF的方法。

prestashop tcpdf prestashop-1.6
2个回答
4
投票

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的格式。你可以在$format找到有关this place的信息

此代码尚未经过测试,但应按预期工作。如果您遇到任何问题,请告诉我。

添加这些覆盖后,您需要删除/cache/class_index.php以清除Prestashop内部类路径缓存。


0
投票

谢谢你这个话题,

我想问你前面生成pdf的情况?

即这是history.tpl的一部分

 `{if $order.details.invoice_url}
    <a href="{$order.details.invoice_url}"><i class="material-icons">&#xE415;</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 .= '&amp;secure_key='.$order->secure_key;
            }
        }

getPageLink使用“pdf-invoice”,我看一下getPageLink方法,看看“pdf-invoice”是一个控制器......麻烦的是我不知道这个控制器在哪里?请帮忙

© www.soinside.com 2019 - 2024. All rights reserved.