Datenfeld für Layout Editor erzeugen

{{toc}}

Into / Begriffsklärung

Die Datenfelder für Layout Editor müssen in der Datenbank definert werden (layout_data). Dann muss Code (eine Layout-Filler Methode) geschrieben werden, der die gewünschten Daten ermittelt und ins Layout einfügt.

Was man in der Oberfläche bearbeitet sind Layout Dokumente (DB: layout_document), ein Beispiel ist der Abo Vertrag:

                         id: 147
                  schluessel: abocontract_original                         <---  Bezeichner
                 fillerclass: AboContract                                  <--   Name der Filler Klasse die zum holen der Daten Verwendet wird in App_Action_LayoutFiller
                  element_id: 28261                                        <--   Wurzel-Element in layout_element
                        type: abo_contract                                 <--   Kategorie (für select)
                   parent_id: 146                                          <--   Container Dokument bzw Dokumentgruppe (z.B. Abo Verträge ab 1.1.2042)
                datagroup_id: 3                                            <--   Zugehörige layout_datagroup, legt fest welche layout_data möglich sind

Die layout_elements bilden einen Baum der von den layout-fillern mit Daten befüllt und von den layout-renderern dann gerendert (nach xml/xsl-fo) wird. Das wird dann zu PDF kompiliert.

Datenbank

Konkretes Beispiel: wir wollen in den Abo Verträgen die Telefonnummer des Kunden als Datenfeld haben.

Step 1: Aktuelle Datenfelder ansehen:

Es gibt also zwei Container, in “Abo Vertrag” sind u.a. die Kundendaten

Step 2: den Container ermitteln

Das ist auch nur ein Datenfeld mit einer Translation also:

<code class="sql">
select * from layout_data d join layout_data_translation t on t.id=d.id where t.description = 'Abo Vertrag' and t.lang=1;
+-----+--------------+-----------+-------------------------+-------------+--------------+-----+-------------+------+
| id  | schluessel   | parent_id | dimensions              | exampledata | is_datatable | id  | description | lang |
+-----+--------------+-----------+-------------------------+-------------+--------------+-----+-------------+------+
| 127 | abo_contract |      NULL | {"width":30,"height":3} |             |            0 | 127 | Abo Vertrag |    1 |
+-----+--------------+-----------+-------------------------+-------------+--------------+-----+-------------+------+
</code>

Wir merken uns den (hoffentlich nur einmal auftauchenden) schluessel

Step 3: Die Datengruppe ermitteln

I.a. kennt man den schluessel aus layout_document, also :

<code class="sql">
select datagroup_id from layout_document where schluessel = 'abocontract_original' limit 1;
+--------------+
| datagroup_id |
+--------------+
|            3 |
+--------------+
1 row in set (0.001 sec)
</code>

Step 4: SQL Script zum anlegen des Datenelements erstellen

Uns zwar mit den infos von gerade z.B. so:

<code class="sql">
select @datagroup := datagroup_id from layout_document where schluessel = 'abocontract_original' limit 1;
select @container := id from layout_data where schluessel = 'abo_contract';

set @fieldname = 'abo_contract_customer_phone';

INSERT INTO layout_data (schluessel,parent_id,dimensions,exampledata,is_datatable) VALUES
  (@fieldname,@container,'{"width":20,"height":3}','044 567 89 12',0);
set @ldid = Last_Insert_Id();

INSERT INTO layout_data_datagroup (data_id,group_id) values(@ldid,@datagroup);

INSERT INTO layout_data_translation (id,description,lang) VALUES (@ldid,'Abo Vertrag | Kunde Telefon',1);     -- de
INSERT INTO layout_data_translation (id,description,lang) VALUES (@ldid,'{{Abo Vertrag | Kunde Telefon}}',4); -- fr
INSERT INTO layout_data_translation (id,description,lang) VALUES (@ldid,'{{Abo Vertrag | Kunde Telefon}}',5); -- it

</code>

Den LayoutFiller ergänzen

Im Beispiel geht es (siehe layout_document) um die Klasse App_Action_LayoutFiller_AboContract

In jedem Filler stehen nach Bedarf Daten zu Verfügung, welche kann man in der setData() Methode nachsehen.

Der Methodenname der Methode die zum Füllen eines Datenelements verwendet wird wird so gebildet (siehe App_Action_LayoutFiller_Base):

<code class="php">
 $func = "_fillLayout" . ucfirst($name);
</code>

d.h. in unserem Beispiel wäre das die Methode _fillLayoutAbo_contract_customer_phone
Die Methode bekommt als Argument die ID des Layout-Elements das gerade gerendert wird, sie ermittelt die benötigten Daten und setzt sie an den Schlüssel “daten” des jeweiligen Layout Elements($this->elementList[$elId][‘daten’])

Beispiel:

<code class="php">
 protected function _fillLayoutAbo_contract_customer_phone($elId) {
        $this->elementList[$elId]['daten'] = $this->frozenContract->customer_address_phone1;
    }
</code>

Das wars auch schon, das Datenelement kann jetzt verwendet werden.

-- AdminUser - 20 Oct 2019

This topic: Sandbox > WebHome > TestRedmineTextile
Topic revision: 20 Oct 2019, AdminUser
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Grips-Wiki? Send feedback