Осы бетте
PalmOrder баспа пішімдері Chunk Templates үлгі тілін қолданады. Chunk деректерді қояды, мәндерді пішімдейді, шарттарды тексереді және құжат жолдарын қайталайды. Ол PDF жасауға арналған HTML үлгілерінде де, принтерге арналған .prn үлгілерінде де жұмыс істейді. PDF пішімінде HTML мен CSS құжаттың көрінісін, ал Chunk көрсетілетін деректерді анықтайды.
Үлгіні дайын PDF мысалынан бастап жасауға болады. Файлдарды құрылғыға жіберу тәртібі Басып шығаруды баптау бетінде берілген.
Негізгі синтаксис
| Жазылуы | Мақсаты |
|---|---|
{$doc.number} | Өріс мәнін қою. |
{$doc.customer_name|html} | Арнайы таңбаларды HTML мәтініне сай түрлендіріп қою. |
{$row.price|decimal} | Санды ондық бөлгіштен кейін екі таңбамен көрсету. |
{% if (…) %}…{% endif %} | Үлгінің бөлігін шарт орындалғанда көрсету. |
{% loop in $table as $row %}…{% endloop %} | Үлгінің бөлігін құжаттың әр жолы үшін қайталау. |
{!-- Түсініктеме --} | Нәтижеде көрінбейтін түсініктеме қосу. |
Тегтерден тыс мәтін мен HTML сақталады. Өріс пен пәрмен атауларында бас және кіші әріптер ажыратылады. Мысалы, doc.number мен doc.Number — екі түрлі атау.
Өрістер мен деректер топтары
Нүкте деректер тобын өріс атауынан ажыратады.
<h1>№ {$doc.number|html} тапсырыс</h1>
<p>Күні: {$doc.date_localized|html}</p>
<p>Клиент: {$doc.customer_name|html}</p>
| Тапсырыс деректерінің тобы | Мазмұны |
|---|---|
doc | Құжаттың бас бөлігіндегі өрістер. Мысалы, number, customer_name, sum және discount. date_localized — тіл мен аймаққа сай пішімделген күн. |
doc.customer | Клиент анықтамалығының өрістері. Мысалы, doc.customer.code. |
we | Компания деректемелері. company, address, registration, billing және comment. |
table | Циклде оқылатын құжат жолдары. |
row | as $row деп белгіленген циклдің ағымдағы жолы. |
row.product | Ағымдағы жолдағы тауардың анықтамалық өрістері. |
Өріс атауларын өз деректер схемаларыңыздан алыңыз. Мысалы, {$doc.customer.address|html} қолжетімді болуы үшін анықтамалықта address өрісі және құжатқа сәйкес клиент жазбасы болуы керек. we тобындағы деректемелерді Settings → Print → Business details бөлімінде толтырыңыз.
Жоқ және бос мәндер
Өріс жоқ болса, нәтижеде {$doc.some_field} сияқты тег сол күйінде қалуы мүмкін. Қос нүктеден кейін әдепкі мәтінді жазыңыз немесе тегті жасыру үшін қос нүктеден кейін ештеңе жазбаңыз.
<p>Ескертпе: {$doc.info|html:Көрсетілмеген}</p>
<p>{$doc.info|html:}</p>
onempty өріс жоқ кезде де, бос жол болған кезде де алмастыру мәтінін көрсетеді.
<p>Ескертпе: {$doc.info|onempty(Көрсетілмеген)|html}</p>
Абзацты атауымен бірге жасыру үшін шарт қолданыңыз.
Сүзгілер және пішімдеу
Сүзгінің алдына тік сызық (|) қойылады. Сүзгілер солдан оңға қарай орындалады. {$doc.info|onempty(Ескертпе жоқ)|html} алдымен әдепкі мәтінді қояды, содан кейін оны HTML-ге дайындайды.
| Сүзгі | Мысал | Нәтиже |
|---|---|---|
html | {$row.name|html} | &, <, > және тырнақша сияқты таңбалар HTML-де мәтін ретінде көрсетіледі. |
decimal | {$row.price|decimal} | Ондық бөлгіштен кейін екі таңба. Мысалы, 42,50. |
number | {$row.count|number} | Соңындағы артық нөлдерсіз, ондық бөлгіштен кейін алты таңбаға дейін. Мысалы, 2,5. |
onempty(мәтін) | {$doc.info|onempty(Көрсетілмеген)|html} | Жоқ немесе бос мәннің орнына мәтін қояды. |
trim | {$doc.customer_name|trim|html} | Мәтіннің басы мен соңындағы бос орындарды жояды. |
uc | {$we.company|uc|html} | Мәтінді бас әріптерге түрлендіреді. |
lc | {$doc.customer.code|lc|html} | Мәтінді кіші әріптерге түрлендіреді. |
decimal және number — PalmOrder сүзгілері. Сандағы бөлгіштер құрылғының тіл және аймақ баптауларына тәуелді. HTML пішіміндегі мәтіндік өрістерге html сүзгісін қосыңыз. Мәтіндік .prn үлгісінде бұл сүзгі қажет емес.
Сандық өрісте {$row.count_display} сияқты _display тегі де болуы мүмкін. Оның дәлдігі құрылғыдағы баған баптауларынан алынады.
Мәтін мен сандарды туралау
HTML және CSS арқылы PDF пішімін туралау
text-align стиліне сол жақ үшін left, орта үшін center, оң жақ үшін right мәнін қойыңыз. Мысалда тақырып ортаға, тауар атауы солға, саны мен сомасы оңға тураланады.
<h1 style="text-align: center;">№ {$doc.number|html} тапсырыс</h1>
<table style="width: 100%;">
<tbody>
{% loop in $table as $row %}
<tr>
<td style="text-align: left;">{$row.name|html}</td>
<td style="text-align: right;">{$row.count|number}</td>
<td style="text-align: right;">{$row.sum|decimal}</td>
</tr>
{% onEmpty %}
<tr>
<td colspan="3">Тапсырыста тауарлар жоқ</td>
</tr>
{% endloop %}
</tbody>
</table>
Бірнеше ұяшыққа ортақ стильдерді <style> ішіндегі кластарға шығарыңыз. Оның мысалы дайын HTML үлгісінде бар.
sprintf арқылы мәтіндік пішімді туралау
Chunk тіліндегі sprintf сүзгісі .prn файлдарында бағандарды туралау үшін бос орын қосады.
| Пішім | Мысал | Нәтиже |
|---|---|---|
%20s | {$row.name|sprintf(%20s)} | Ені кемінде 20 таңба болатын өрісте мәтін оңға тураланады. |
%-20s | {$row.name|sprintf(%-20s)} | Ені кемінде 20 таңба болатын өрісте мәтін солға тураланады. |
%-20.20s | {$row.name|sprintf(%-20.20s)} | Мәтін солға тураланып, 20 таңбамен шектеледі. Қысқа мәтін бос орынмен толықтырылады. |
%10s | {$row.sum|decimal|sprintf(%10s)} | Екі ондық таңбасы бар сома ені кемінде 10 таңба болатын өрісте оңға тураланады. |
%20s ішіндегі 20 ең аз енді, s мәтіндік мәнді білдіреді. Минус таңбасы мәнді солға туралайды. .20 бөлігі мәтіннің ұзындығын шектейді. Шек қойылмаса, ұзын мән келесі бағандарды ығыстыруы мүмкін.
{% loop in $table as $row %}
{$row.name|sprintf(%-20.20s)} {$row.count|number|sprintf(%8s)} {$row.sum|decimal|sprintf(%10s)}
{% onEmpty %}
Тапсырыста тауарлар жоқ
{% endloop %}
«Су» тауарының саны 2,5, сомасы 125,00 болса, нәтиже төмендегідей көрінеді.
Су 2,5 125,00
Алдымен санды пішімдеп, содан кейін туралаңыз. Сонда ен көрсетілетін мән бойынша есептеледі. Таңбаларының ені бірдей қаріпті пайдаланыңыз. Жол ұзындығы принтердің таңдалған режимде бір жолға сыйғызатын таңба санынан аспауы керек.
Шарттар
Жеңілдігі бар тапсырыста doc.has_discount мәні 1 болады.
{% if ($doc.has_discount == 1) %}
<p>Жеңілдік: {$doc.discount|decimal} UAH</p>
{% else %}
<p>Жеңілдік жоқ</p>
{% endif %}
else тармағы міндетті емес. Кей үлгілерде шартты жабу үшін {% /if %} қолданылады.
| Оператор | Мағынасы |
|---|---|
== | Мәндер тең. |
!= | Мәндер әртүрлі. |
&& | Екі шарт та орындалады. |
|| | Кемінде бір шарт орындалады. |
!$field | Өріс мәні жоқ. |
Салыстырылатын мәтінді қос тырнақшаға алыңыз. Шарттарды топтау үшін жақша қолданыңыз. Теңдік мәндердің мәтіндік жазылуын салыстырады. Сондықтан 1 және 1.0 әртүрлі. Шарттарда >, <, >= және <= сияқты сандық салыстыру операторлары қолданылмайды.
Бірнеше тармақ және кірістірілген шарттар
Бірнеше нұсқаны тексеру үшін elseIf қолданыңыз. Бірінші сәйкес тармақ орындалады.
{% if ($we.company && $we.company != "") %}
<p>Жеткізуші: {$we.company|html}</p>
{% elseIf ($we.registration && $we.registration != "") %}
<p>Жеткізушінің тіркеу немесе салық нөмірі: {$we.registration|html}</p>
{% else %}
<p>Жеткізуші деректемелері толтырылмаған</p>
{% endif %}
Әр кірістірілген шартты жеке жабыңыз.
{% if ($we.company && $we.company != "") %}
<p>{$we.company|html}</p>
{% if ($we.address && $we.address != "") %}
<p>{$we.address|html}</p>
{% endif %}
{% endif %}
Бос өрістерді жасыру
{% if ($we.billing && $we.billing != "") %}
<p>Банк деректемелері: {$we.billing|html}</p>
{% endif %}
$we.billing мәннің барын тексереді. $we.billing != "" бос жолды алып тастайды. Қарапайым if ($field) шарты бос жол немесе нөл болғанда да орындалады. Жеңілдік белгісі үшін == 1 салыстыруын қолданыңыз.
Циклдер және құжат жолдары
Цикл table ішіндегі әр жазба үшін өз бөлігін қайталайды. as сөзінен кейінгі атау ағымдағы жазбаны білдіреді. counter=$num,1 жазбаларды 1-ден бастап нөмірлейді. Жазбалар болмаса, onEmpty бөлігі көрсетіледі.
<table>
<thead>
<tr>
<th>№</th>
<th>Тауар</th>
<th>Саны</th>
<th>Сомасы</th>
</tr>
</thead>
<tbody>
{% loop in $table as $row counter=$num,1 %}
<tr>
<td>{$num}</td>
<td>{$row.name|html}</td>
<td>{$row.count|number}</td>
<td>{$row.sum|decimal}</td>
</tr>
{% onEmpty %}
<tr>
<td colspan="4">Тапсырыста тауарлар жоқ</td>
</tr>
{% endloop %}
</tbody>
</table>
Санауыш міндетті емес. Жазбалар болмағанда көрсетілетін мәтінді onEmpty бөлігіне жазыңыз. Ол болмаса, Chunk кестенің бос екені туралы қате хабарын шығарады. Цикл ішінде құжаттың бас бөлігіндегі өрістерді және шарттарды қолдануға болады. Жеңілдік бағанын жасыру үшін оның тақырыбы мен жол ұяшығына бірдей шарт қойыңыз.
Бірінші және соңғы жол
first_last=true параметрі бірінші жолда $first, соңғы жолда $last белгісін береді. Бір ғана жол болса, екі белгі де бар. Олар тауарлардың бүкіл тізіміне қатысты.
{% loop in $table as $row first_last=true %}
{% if ($first) %}
<p>Тауарлар тізімі:</p>
{% endif %}
<p>{$row.name|html}</p>
{% if ($last) %}
<p>Тізімнің соңы</p>
{% endif %}
{% onEmpty %}
<p>Тапсырыста тауарлар жоқ</p>
{% endloop %}
Жазбалар арасындағы бөлгіш
divider жазбалардың арасына бөлгіш қояды. Соңғы жазбадан кейін бөлгіш шықпайды.
<p>
{% loop in $table as $row %}
{$row.name|html}
{% divider %}, {% enddivider %}
{% onEmpty %}—
{% endloop %}
</p>
Үлгі бөліктерін қайта пайдалану
Үлгі бөлігін {#name} және {#} арасына жазып, include арқылы кірістіріңіз. Анықтаманың өзі нәтижеде көрінбейді. Кірістірілген бөлік сол орында қолжетімді өрістерді пайдалана алады.
{#company_details}
<p>{$we.company|html}</p>
{% if ($we.address && $we.address != "") %}
<p>{$we.address|html}</p>
{% endif %}
{#}
{% include #company_details %}
<h1>№ {$doc.number|html} тапсырыс</h1>
{% include #company_details %}
Ортақ бөлікті бірнеше пішімде қолдану үшін common.chtml сияқты бөлек файлға сақтаңыз.
{#signature}
<p>Жіберген: ____________________</p>
<p>Қабылдаған: ____________________</p>
{#}
Негізгі HTML үлгісінде оны төмендегі пәрменмен кірістіріңіз.
{% include common#signature %}
common.chtml файлын негізгі үлгімен бірдей алмасу профилі арқылы құрылғыдағы әдепкі орынға жүктеңіз. include ішінде common атауын кеңейтімсіз жазыңыз. PalmOrder үлгілерді жүктегенде .chtml кеңейтімін өзі қосады. pdf_forms.xml файлының <file> элементінде негізгі HTML үлгісінің атауы қалады.
Есептеулер
Қарапайым есептеулер үшін PalmOrder ұсынған po_calc сүзгісін қолданыңыз. Өрнек ішіндегі өріс атаулары $ таңбасынсыз жазылады. +, -, *, / амалдары мен жақшалар қолданылады. Нәтижені decimal немесе number сүзгісімен пішімдеуге болады.
<p>Соманың жартысы: {$doc.sum|po_calc(doc.sum/2)|decimal} UAH</p>
Қорытындыларды көрсету үшін doc.sum, doc.discount және жол сомаларын пайдаланыңыз. Бұл мәндерде қосымша есептеген жеңілдіктер мен дөңгелектеу ескерілген.
Түсініктемелер
Chunk түсініктемесі ішіндегі тегтермен бірге алынып тасталады.
{!-- Мұнда компания деректемелері көрсетіледі. --}
<p>{$we.company|html}</p>
Үлгіні тексеру
Өзгертілген үлгіні құрылғыға жүктеп, пішімді қайта жасаңыз. Деректемелері толтырылған және бос, жеңілдігі бар және жоқ, бір және бірнеше тауары бар тапсырыстарды қарап шығыңыз.
| Белгісі | Нені тексеру керек |
|---|---|
{$…} тегі қалып қойған | Өріс атауы және деректерде бар-жоғы. Міндетті емес өріске әдепкі мән немесе шарт қосыңыз. |
| Атауы көрсетілген, мәні бос | Шарт абзацты атауымен бірге қамти ма. |
| Нөлдік жеңілдік көрінеді | Шарт doc.has_discount мәнін 1 мәнімен салыстыра ма. |
| Тауар жолдары қайталанбайды | Ұяшықтар цикл ішінде ме және ағымдағы row өрістерін қолдана ма. |
& немесе < таңбалары қате көрсетіледі | HTML үлгісіндегі html сүзгісі. |
| Ондық таңбалар саны дұрыс емес | decimal, number немесе тиісті _display тегі. |
| Үлгі бөлігі табылмады | include ішіндегі атау, {#…} анықтамасы және .chtml файлының жүктелуі. |
Ағымдағы орында қолжетімді тегтердің атауларын көру үшін HTML үлгісіне уақытша {% tagStack(html) %} пәрменін қосыңыз. Оны цикл ішінде де қолдануға болады. Тексергеннен кейін пәрменді өшіріңіз.
Тілдің қосымша мүмкіндіктері Chunk Templates құжаттамасында берілген. decimal, number және po_calc — PalmOrder қосқан сүзгілер.
