Add PDF for Order Details on the account page
This commit is contained in:
@@ -58,6 +58,11 @@
|
|||||||
<default key="_controller">Thelia\Controller\Front\DefaultController::noAction</default>
|
<default key="_controller">Thelia\Controller\Front\DefaultController::noAction</default>
|
||||||
<default key="_view">account-password</default>
|
<default key="_view">account-password</default>
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
|
<route id="customer.order.pdf.delivery" path="/account/order/pdf/delivery/{order_id}">
|
||||||
|
<default key="_controller">Thelia\Controller\Front\OrderController::generateDeliveryPdf</default>
|
||||||
|
<requirement key="order_id">\d+</requirement>
|
||||||
|
</route>
|
||||||
<!-- end customer routes -->
|
<!-- end customer routes -->
|
||||||
|
|
||||||
<!-- customer address routes -->
|
<!-- customer address routes -->
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace Thelia\Controller\Front;
|
|||||||
|
|
||||||
use Symfony\Component\Routing\Router;
|
use Symfony\Component\Routing\Router;
|
||||||
use Thelia\Controller\BaseController;
|
use Thelia\Controller\BaseController;
|
||||||
|
use Thelia\Core\Template\TemplateHelper;
|
||||||
use Thelia\Model\AddressQuery;
|
use Thelia\Model\AddressQuery;
|
||||||
use Thelia\Model\ConfigQuery;
|
use Thelia\Model\ConfigQuery;
|
||||||
use Thelia\Model\ModuleQuery;
|
use Thelia\Model\ModuleQuery;
|
||||||
@@ -88,12 +89,65 @@ class BaseFrontController extends BaseController
|
|||||||
/**
|
/**
|
||||||
* @return ParserInterface instance parser
|
* @return ParserInterface instance parser
|
||||||
*/
|
*/
|
||||||
protected function getParser()
|
protected function getParser($template = null)
|
||||||
{
|
{
|
||||||
$parser = $this->container->get("thelia.parser");
|
$parser = $this->container->get("thelia.parser");
|
||||||
|
|
||||||
$parser->setTemplate(ConfigQuery::getActiveTemplate());
|
// Define the template that should be used
|
||||||
|
$parser->setTemplate($template ?: TemplateHelper::getInstance()->getActiveFrontTemplate()->getPath());
|
||||||
|
|
||||||
return $parser;
|
return $parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render the given template, and returns the result as an Http Response.
|
||||||
|
*
|
||||||
|
* @param $templateName the complete template name, with extension
|
||||||
|
* @param array $args the template arguments
|
||||||
|
* @param int $status http code status
|
||||||
|
* @return \Thelia\Core\HttpFoundation\Response
|
||||||
|
*/
|
||||||
|
protected function render($templateName, $args = array(), $status = 200)
|
||||||
|
{
|
||||||
|
return Response::create($this->renderRaw($templateName, $args), $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render the given template, and returns the result as a string.
|
||||||
|
*
|
||||||
|
* @param $templateName the complete template name, with extension
|
||||||
|
* @param array $args the template arguments
|
||||||
|
* @param null $templateDir
|
||||||
|
*
|
||||||
|
* @return \Thelia\Core\HttpFoundation\Response
|
||||||
|
*/
|
||||||
|
protected function renderRaw($templateName, $args = array(), $templateDir = null)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Add the template standard extension
|
||||||
|
$templateName .= '.html';
|
||||||
|
|
||||||
|
$session = $this->getSession();
|
||||||
|
|
||||||
|
// Prepare common template variables
|
||||||
|
$args = array_merge($args, array(
|
||||||
|
'locale' => $session->getLang()->getLocale(),
|
||||||
|
'lang_code' => $session->getLang()->getCode(),
|
||||||
|
'lang_id' => $session->getLang()->getId(),
|
||||||
|
'current_url' => $this->getRequest()->getUri()
|
||||||
|
));
|
||||||
|
|
||||||
|
// Render the template.
|
||||||
|
try {
|
||||||
|
$data = $this->getParser($templateDir)->render($templateName, $args);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
} catch (AuthenticationException $ex) {
|
||||||
|
// User is not authenticated, and templates requires authentication -> redirect to login page
|
||||||
|
Redirect::exec(URL::getInstance()->absoluteUrl($ex->getLoginTemplate()));
|
||||||
|
} catch (AuthorizationException $ex) {
|
||||||
|
// User is not allowed to perform the required action. Return the error page instead of the requested page.
|
||||||
|
return $this->errorPage($this->getTranslator()->trans("Sorry, you are not allowed to perform this action."), 403);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,9 @@
|
|||||||
namespace Thelia\Controller\Front;
|
namespace Thelia\Controller\Front;
|
||||||
|
|
||||||
use Propel\Runtime\Exception\PropelException;
|
use Propel\Runtime\Exception\PropelException;
|
||||||
|
use Thelia\Core\Event\PdfEvent;
|
||||||
|
use Thelia\Core\HttpFoundation\Response;
|
||||||
|
use Thelia\Core\Template\TemplateHelper;
|
||||||
use Thelia\Exception\TheliaProcessException;
|
use Thelia\Exception\TheliaProcessException;
|
||||||
use Thelia\Form\Exception\FormValidationException;
|
use Thelia\Form\Exception\FormValidationException;
|
||||||
use Thelia\Core\Event\Order\OrderEvent;
|
use Thelia\Core\Event\Order\OrderEvent;
|
||||||
@@ -34,6 +37,7 @@ use Thelia\Log\Tlog;
|
|||||||
use Thelia\Model\AddressQuery;
|
use Thelia\Model\AddressQuery;
|
||||||
use Thelia\Model\AreaDeliveryModuleQuery;
|
use Thelia\Model\AreaDeliveryModuleQuery;
|
||||||
use Thelia\Model\Base\OrderQuery;
|
use Thelia\Model\Base\OrderQuery;
|
||||||
|
use Thelia\Model\ConfigQuery;
|
||||||
use Thelia\Model\ModuleQuery;
|
use Thelia\Model\ModuleQuery;
|
||||||
use Thelia\Model\Order;
|
use Thelia\Model\Order;
|
||||||
use Thelia\Tools\URL;
|
use Thelia\Tools\URL;
|
||||||
@@ -242,4 +246,48 @@ class OrderController extends BaseFrontController
|
|||||||
|
|
||||||
return $order;
|
return $order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function generateInvoicePdf($order_id)
|
||||||
|
{
|
||||||
|
return $this->generatePdf($order_id, ConfigQuery::read('pdf_invoice_file', 'invoice'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateDeliveryPdf($order_id)
|
||||||
|
{
|
||||||
|
return $this->generatePdf($order_id, ConfigQuery::read('pdf_delivery_file', 'delivery'));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generatePdf($order_id, $fileName)
|
||||||
|
{
|
||||||
|
/* check customer */
|
||||||
|
$this->checkAuth();
|
||||||
|
|
||||||
|
$html = $this->renderRaw(
|
||||||
|
$fileName,
|
||||||
|
array(
|
||||||
|
'order_id' => $order_id
|
||||||
|
),
|
||||||
|
TemplateHelper::getInstance()->getActivePdfTemplate()->getPath()
|
||||||
|
);
|
||||||
|
|
||||||
|
$order = OrderQuery::create()->findPk($order_id);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$pdfEvent = new PdfEvent($html);
|
||||||
|
|
||||||
|
$this->dispatch(TheliaEvents::GENERATE_PDF, $pdfEvent);
|
||||||
|
|
||||||
|
if ($pdfEvent->hasPdf()) {
|
||||||
|
return Response::create($pdfEvent->getPdf(), 200,
|
||||||
|
array(
|
||||||
|
'Content-type' => "application/pdf",
|
||||||
|
'Content-Disposition' => sprintf('Attachment;filename=%s.pdf', $order->getRef()),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
\Thelia\Log\Tlog::getInstance()->error(sprintf('error during generating invoice pdf for order id : %d with message "%s"', $order_id, $e->getMessage()));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,7 +158,7 @@
|
|||||||
<td>{format_date date=$CREATE_DATE}</td>
|
<td>{format_date date=$CREATE_DATE}</td>
|
||||||
<td>{format_number number=$TOTAL_TAXED_AMOUNT} {loop type="currency" name="order.currency" id={$CURRENCY}}{$SYMBOL}{/loop}</td>
|
<td>{format_number number=$TOTAL_TAXED_AMOUNT} {loop type="currency" name="order.currency" id={$CURRENCY}}{$SYMBOL}{/loop}</td>
|
||||||
<td><span class="label-delivered">{loop type="order-status" name="order.status" id={$STATUS}}{$TITLE}{/loop}</span></td>
|
<td><span class="label-delivered">{loop type="order-status" name="order.status" id={$STATUS}}{$TITLE}{/loop}</span></td>
|
||||||
<td><a href="#" class="btn btn-order-details" data-toggle="tooltip" title="{intl l="View order %ref as pdf document" ref={$REF}}"><span class="icon-cloud-download"></span> {intl l="Order details"}</a></td>
|
<td><a href="{url path="/account/order/pdf/delivery/$ID"}" class="btn btn-order-details" data-toggle="tooltip" title="{intl l="View order %ref as pdf document" ref={$REF}}"><span class="icon-cloud-download"></span> {intl l="Order details"}</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{/loop}
|
{/loop}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user