{{toc}}
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.
Konkretes Beispiel: wir wollen in den Abo Verträgen die Telefonnummer des Kunden als Datenfeld haben.
Es gibt also zwei Container, in “Abo Vertrag” sind u.a. die Kundendaten
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
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>
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>
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.