Przejdź do głównej treści

Tworzenie Pomocnika do znacznika w szablonie dokumentów

Ready_™ Developer TeamMniej niż 1 minuta

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;
    }
}