Overview
Read this article if you ...
- ...want to learn how to create custom PDF-Templates (using Hublify HTML-Template-Engine)
- ...and use those PDF-Templates within Hublify's standard List-Actions and Document-Handling functionalities (E-Mail Attachments, ...) .
- Examples of typical PDF-Templates, addressed here ...
- Invoice (PDF)
- Delivery Note (PDF)
- Offer / Quote (PDF)
- ...
Keep in mind: It is commonly expected that a (PDF-) "Document Template" is targeted to be used for a specific dataset and a dynamic record of that!
Templating
This is a very important part to regard: This describes how you get all your data you want to render and on what data Hublify already injects into your template render-process.
- Hublify provides in some way the Primarykey-Value for the specific dataset-record for which to render the PDF. This can be in one of those twig-variables (automatically initialized and injected ....
- data[<primarykey-var>] = "<primarykey-value>"
(Occurs most often in Hublify Flows contexts, e.g. E-Mail-Attachments, ...)
or - filter[<primarykey-var>] = "<primarykey-value>"
(Occurs most often in List-Action contexts)
- data[<primarykey-var>] = "<primarykey-value>"
- Since your template should be dataset-specific (e.g. for dataset "invoice") you then know (can look-up in Hublify Docs) the dataset's primarykey-var (e.g. "inv_id" for dataset "invoice").
So, it should be easy for you to detect the primarykey-value from the previously mentioned "data" or "filter" twig-Global-Vars. - Once you have "detected" the actual primarykey-value in your twig-template, you have everything you need to query more related data from Hublify which you want to render in your template.
For that use twig functions, such as: hublify.dataset()... and hublify.requireDatasetRecord()... .
Example
For "invoice"-dataset Document (PDF), twig template:
{# -------- Example INVOICE Template (HTML for PDF) -------- #}
{# ---- DEFINE which dataset-fields we want. #}
{% set fieldsWanted = [
'inv_id','inv_code',
'inv_gender','inv_title','inv_firstname','inv_lastname','inv_company',
'inv_street','inv_housenr','inv_addrextra','inv_zip','inv_town','inv_country',
'inv_txt_header','inv_txt_title',
'inv_amount','inv_currency','inv_amount_netto','inv_amount_brutto','inv_amount_vat','vat_sums',
'inv_time_invoice',
'orderid','o_time_ordered','o_pers_reftext','o_orderid_external',
'personid'
] %}
{# ---- DETECT: ...the primarykey-value and get/ensure all other record-fields we want! #}
{% if data['inv_id']>0 %}
{# DATA: Obviously, we have definitely the primarykey-value and
optionally some dataset-data provided. So, we can use performant
hublify.requireDatasetRecord(...) to query all other fields wanted - but only
if they are not already available!
#}
{% set data = hublify.requireDatasetRecord(
'invoice',
fieldsWanted,
data['inv_id'],
data)
%}
{% elseif filter|length>0 %}
{# FILTER: We have a filter-expression! Probably with the primarykey-var involved.
But we can NOT RELY on that! So, we simply use the filter with
hublify.dataset(...) as we were told and get that record!
#}
{% set data = hublify.dataset('invoice')
.filters(filter)
.fields(fieldsWanted)
.one() %}
{% else %}
{# Uh, ERROR! Missing necessary possibility to retrieve data! Handle... #}
{% set data = null %}
{% endif %}
{# --- RENDER here, your template! :-) --- #}
<html>
<body>
<h1>Invoice Number: {{ data.inv_code }}</h1>
...
(!) This simplified HTML source code is only to show the structure.
Please write better code yourself! ;-)
</body>
</html>