Tworzenie Pomocnika do znacznika w szablonie dokumentów
Tworzenie Pomocnika do znacznika w szablonie dokumentów
Nazwa klasy pomocnika musi posiadać postfiks TemplateHelper oraz dziedziczyć po klasie AbsTemplateHelper
.
Dla przykładu posłużymy się pomocnikiem odpowiedzialnym z wydrukowaniem nam w formie tekstowej formy płatności.
Nazwa klasy: VatNoteFormPaymentTemplateHelper
Nazwa pliku: VatNoteFormPaymentTemplateHelper.inc
Listing klasy:
<?php
class VatNoteFormPaymentTemplateHelper extends AbsTemplateHelper {
/**
* @var string Opis pomocnika
*/
public static $desc = '';
/**
* Metoda zwraca dane do wydrukowania w szablonie dokumentu zamiast znacznika
*
* @return null|string
*
*/
public function fetch() {}
/**
* Domyślna wartość jeżeli fetch zwróci null
*
* @return null|string
*
*/
public function renderDefault() {}
}
Gotową klasę umieszczamy w katalogu public_html\apps\edokumenty\classes\Templates\helpers
. Następnie, aby skrypt był dostępny do użycia w znaczniku, należy dodać wpis do bazy danych. Wpis umieszczamy w tabeli template_helper
:
- kolumna
dscrpt
zawiera opis pomocnika - kolumna
thclnm
zawiera nazwę pliku z klasy bez postfiksu TemplateHelper
INSERT INTO template_helper (dscrpt, thclnm) VALUES ('Dokument faktury: forma płatności', 'VatNoteFormPayment');
Po przelogowaniu ujrzymy go na liście pomocników podczas tworzenia znaczników.
Pomocnik drukujący tekst
Korzystając z poprzedniego przykładu, uzupełnijmy go o brakujące elementy.
Pomocnik zwracający formę płatności
<?php
/**
* Class VatNoteFormPaymentTemplateHelper
* Created by PhpStorm.
*
* @createDate 2020-11-04
* @version 0.0.1
* @author <>
* @copyright (c) eDokumenty Sp. z o.o.
*/
class VatNoteFormPaymentTemplateHelper extends AbsTemplateHelper {
/**
* @var string
*/
public static $desc = 'Dokument faktury: forma płatności';
/**
* fetch
*
* @return null|string
*
*/
public function fetch() {
if ( !isset($this->context['documents'][$this->index]) || !$this->context['documents'][$this->index]) {
return NULL;
}
$doc_id = $this->context['documents'][$this->index];
/** @var VatNote $vatnoteBean */
$vatnoteBean = Document::getInstance($doc_id);
$bean = new \FormOfPayment($vatnoteBean->fop_id);
$v = explode(' ',$bean->form__);
$value = $v[0];
if (strtolower($value) == 'przelew') {
$value .= ' bankowy';
}
return $this->toUTF8($value);
}
/**
* renderDefault
*
* @return null
*
*/
public function renderDefault() {
return null;
}
}
Uwaga
Wartość zwracana w metodzie VatNoteFormPaymentTemplateHelper::fetch()
czy VatNoteFormPaymentTemplateHelper::renderDefault()
musi być przepuszczona przez $this->toUTF8($valueToReturn);
tak samo jako to jest w powyższym przykładzie.
Pomocnik drukujący tabelkę
Poniższy przykład drukuje nam tabelkę w dokumencie rtf lub docx. Dokumentacja obiektu $this->writer
, czyli pomocnik do drukowania uzależniony od typu szablonu (rtf,docx,html), została opisana tutaj.
Pomocnik zwracający tabelkę produktów
<?php
/**
* Class OrderProductsListSummaryTableTemplateHelper
* Created by PhpStorm.
*
* @createDate 2020-11-04
* @version 0.0.1
* @author <>
* @copyright (c) eDokumenty Sp. z o.o.
*/
class OrderProductsListSummaryTableTemplateHelper extends AbsTemplateHelper {
/**
* @var string
*/
public static $desc = 'Dokument zamówienia: sumaryczna lista produktów';
/**
* fetch
* @return null|string
*/
public function fetch() {
if ((!isset($this->context['documents'][$this->index])) OR (!$this->context['documents'][$this->index])) {
return NULL;
}
require_once(LIB_PATH.'util/Money.inc');
require_once(MOD_PATH.'Evidence/services/FKElementsService.inc');
require_once(MOD_PATH.'Depository/services/DepositoryService.inc');
$db = PgManager::getInstance();
$productsList = $db->select('doc_products_list_summary_view', '*', 'is_del IS NOT TRUE AND doc_id = '.$this->context['documents'][$this->index].' AND clsnam = \'DOCUMENT\' ORDER BY prior_ ASC', FALSE, PGSQL_ASSOC);
if ((!is_array($productsList)) OR (empty($productsList))) {
return NULL;
}
$this->writer->setTableHeaderColor(149, 165, 166);
$this->writer->paperWidth = 10500; // szerokość
$this->writer->tableHeaderRowDefaultHeight = 700;
$this->writer->tableRowDefaultHeight = 400;
$this->writer->tablePrettyFooter = 4;
$this->writer->tableBorderSize = 2;
$format = $this->getFormat();
$lp = 1;
$out = [];
$footerSumArr = [];
foreach ($productsList as $element) {
$cursmb = $element['cursmb'];
if (!isset($footerSumArr[$cursmb])) {
$footerSumArr[$cursmb]['nettoValueSum'] = 0;
$footerSumArr[$cursmb]['discntNettoSum'] = 0;
}
$dd = FKElementsService::calculate($element, FALSE);
$quantm1 = explode('.', str_replace([
',',
' ',
], [
'.',
'',
], (rtrim(number_format((float)$element['quantm'], EvidenceConfig::CALCULATE_PRECISION, '.', ''), 0))));
$ff = max(2, min(strlen(end($quantm1)), EvidenceConfig::NETTO_PRICE_ROUND_VALUE));
$out[] = [
$lp,
str_replace("\n",' EDOK_LBR ',$element['depnam']),
//towar/usluga
$element['unitsm'],
//jm
number_format($element['quantm'], $ff, MONEY_DEC_SEP, MONEY_THOUSANDS_SEP),
//ilosc
Money::format($element['netto_'], NULL, FALSE),
//cena netto
$element['cursmb'],
//waluta
Money::format(str_replace(' ', '', $dd['dvneto']), NULL, FALSE),
//wartośc netto
];
$footerSumArr[$cursmb]['nettoValueSum'] += str_replace(' ', '', $dd['dvneto']);
$lp++;
}
$footer = [];
foreach ($footerSumArr as $cursmb => $value) {
$footer[] = [
NULL,
NULL,
NULL,
NULL,
'Razem',
'-',
Money::format($value['nettoValueSum'], $cursmb, FALSE),
];
}
$this->writer->setFooter($footer);
return $this->writer->getTable2($out, $format);
}
/**
* renderDefault
* @return null
*/
public function renderDefault() {
return NULL;
}
/**
* getFormat
* @return array
*/
protected function getFormat() {
$tplTableFontSize = 10;
$tplTableHeaderFontSize = 12;
$format = [
[
'title' => Translator::translate('Lp'),
'align' => WRITER_ALIGN_CENTER,
'width' => '5',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danych
],
[
'title' => Translator::translate('Towar/Usługa'),
'align' => WRITER_ALIGN_LEFT,
'width' => '',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danych
],
[
'title' => Translator::translate('Jm'),
'align' => WRITER_ALIGN_LEFT,
'width' => '8',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danych
],
[
'title' => Translator::translate('Ilość'),
'align' => WRITER_ALIGN_CENTER,
'width' => '10',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danych
],
[
'title' => Translator::translate('Cena netto'),
'align' => WRITER_ALIGN_RIGHT,
'width' => '12',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danych
],
[
'title' => Translator::translate('Waluta'),
'align' => WRITER_ALIGN_RIGHT,
'width' => '10',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danych
],
[
'title' => Translator::translate('Wartość netto'),
'align' => WRITER_ALIGN_RIGHT,
'width' => '14',
'headerFontSize' => $tplTableHeaderFontSize,
// wielkość czcionki headera
'headerBolder' => TRUE,
'dataFontSize' => $tplTableFontSize,
// wielkość czcionki danychh
],
];
return $format;
}
}