Joomla 5 Notice

We are pleased to announce that as of January 29, 2024, all of our Joomla extensions are compatible with Joomla 5.

For all who are still updateing from Joomla 3 to Joomla 4: Joomla 4 Migration instructions are available here:

There is now a separate Documentation for Visforms for Joomla 4 and for Visforms for Joomla 5!

Forum

Visforms Subscription user can ask questions in our forum. Please log in with the relevant user first.
Everybody can access the forum for reading.

Please only ask 1 question per topic.

Important information for almost every question:
V1: Which Visforms version is running?
V2: Which Joomla version is running?
V3: Which PHP version is running?

PDF Erstellung aus mehreren Tabellen

More
1 year 11 months ago - 1 year 11 months ago #8688 by Administrator IV
Replied by Administrator IV on topic PDF Erstellung aus mehreren Tabellen
Hallo Sven,

dein SQL-Statement und auch der HTML-Teil scheinen mir beide nicht so ganz geheuer zu sein.
Ich habe deine Anforderung in einem kleinen lauffähigen Beispiel umgesetzt.
Es ist eigentlich ganz einfach und es sind nur 3 Dinge die wirklich wichtig sind (siehe unten), damit es grundsätzlich mal funktioniert.

Hiermit habe ich meine zweite Tabelle 'links' erzeugt:
Code:
drop table if exists links; create table links (id text, url text); insert into links (id, url) VALUES ('21', 'https://cdn.pixabay.com/photo/2015/07/27/20/16/book-863418__340.jpg'), ('22', 'https://cdn.pixabay.com/photo/2015/06/02/12/59/book-794978__340.jpg'), ('23', 'https://cdn.pixabay.com/photo/2014/09/05/18/32/old-books-436498__340.jpg'), ('24', 'https://cdn.pixabay.com/photo/2016/09/10/17/18/book-1659717__340.jpg'), ('25', 'https://cdn.pixabay.com/photo/2015/11/19/21/10/glasses-1052010__340.jpg'), ('26', 'https://cdn.pixabay.com/photo/2015/12/19/20/32/paper-1100254__340.jpg'), ('27', 'https://cdn.pixabay.com/photo/2015/12/05/08/25/fantasy-1077863__340.jpg'), ('28', 'https://cdn.pixabay.com/photo/2016/04/30/13/12/sutterlin-1362879__340.jpg'), ('29', 'https://cdn.pixabay.com/photo/2014/08/16/18/17/book-419589__340.jpg'), ('30', 'https://cdn.pixabay.com/photo/2017/06/10/16/22/coffee-2390136__340.jpg'), ('31', 'https://cdn.pixabay.com/photo/2017/02/26/21/39/rose-2101475__340.jpg'), ('32', 'https://cdn.pixabay.com/photo/2018/05/22/14/00/girl-3421489__340.jpg'), ('33', 'https://cdn.pixabay.com/photo/2015/09/05/21/51/reading-925589__340.jpg'), ('34', 'https://cdn.pixabay.com/photo/2016/09/08/22/43/books-1655783__340.jpg'), ('35', 'https://cdn.pixabay.com/photo/2018/01/04/09/39/love-story-3060241__340.jpg'), ('36', 'https://cdn.pixabay.com/photo/2018/03/19/18/20/tea-time-3240766__340.jpg'), ('37', 'https://cdn.pixabay.com/photo/2016/02/16/21/07/books-1204029__340.jpg'), ('38', 'https://cdn.pixabay.com/photo/2015/09/05/07/28/writing-923882__340.jpg'), ('39', 'https://cdn.pixabay.com/photo/2016/11/29/02/56/blonde-1866951__340.jpg'), ('40', 'https://cdn.pixabay.com/photo/2016/03/27/19/32/book-1283865__340.jpg');

Die PDF-Beispiele installieren:

Ich gehe davon aus, dass du die PDF-Beispiele installiert hast.
Die PDF-Beispiele installierst du ganz einfach durch einen Button-Klick im Visforms Dashboard.
Es wird unter anderen das PDF-Beispiel-Formular 'register' mit Daten und 2 PDF-Templates angelegt.

Für das PDF-Beispiel-Formular 'register' lege ich ein neues PDF-Template 'image' an.
Von den Feldern des Formulars 'register' verwende ich die 3 Felder mit den Alias-Namen 'first', 'last' und 'age'.
Das Feld 'age' ist im Formular vom Typ Zahl und wird als Verbindung zum Feld 'id' in der Tabelle 'links' verwendet.

Achtung:
Beide Felder 'age' und 'id' sind in der Datenbank allerdings vom Typ Text.
Visforms speichert alles seine Feldtypen in der Datenbank als Typ Text.

Im PDF-Template hat auf dem Reiter 'Dokument' das Dokument folgenden Inhalt:
Code:
<p style="text-align: center;"><span style="font-size: 14pt; text-align: center;"><strong>Bilderliste</strong></span></p> <table border="1" width="100%" cellpadding="4"> <tbody> <tr style="font-weight: bold; background-color: lightskyblue;"> <td colspan="1" align="center">Vorname</td> <td colspan="1" align="center">Nachname</td> <td colspan="1" align="center">Alter</td> <td colspan="1" align="center">Link</td> </tr> <tr class="loop"> <td colspan="1" align="left">${first}</td> <td colspan="1" align="left">${last}</td> <td colspan="1" align="left">${age}</td> <td id="link" class="sql" colspan="1" align="left"><img src="${link:url}" /></td> </tr> </tbody> </table>

Im PDF-Template hat auf dem Reiter 'SQL Statement' das erste SQL Statement 'link' folgende Einstellungen:
Code:
Referenzname = link Prozesstyp = Free Sql-Statement = select url from links where id = '${item:age}';

Die Screenshots:

Die Felder des PDF-Beispiel-Formulars 'register':
vi-solutions.de/forum-uploads/pdf-example-register_fields.png
PDF-Template Reiter 'Dokument' Editor aus:
vi-solutions.de/forum-uploads/pdf-exampl...ter_pdf-document.png
PDF-Template Reiter 'Dokument' Editor an:
vi-solutions.de/forum-uploads/pdf-exampl...cument_editor-on.png
PDF-Template Reiter 'SQL Statement':
vi-solutions.de/forum-uploads/pdf-exampl...f-sql-statements.png
PDF-Vorschau:
vi-solutions.de/forum-uploads/pdf-exampl...ster_pdf-preview.png

Nur 3 Dinge sind für die Funktion zentral:

1.
Code:
<tr class="loop">
Das Attribut class="loop" legt fest, dass nur dieses HTML-Element pro Formular-Datensatz kopiert und prozessiert wird.
Ohne class="loop" würde einfach das gesamte Dokument pro Datensatz kopiert und prozessiert werden.
Wir wollen aber jeweils nur eine Tabellenzeile pro Datensatz erzeugen.

2.
Code:
<td id="link" class="sql" colspan="1" align="left"><img src="${link:url}" /></td>
Das Attribut class="sql" legt fest, dass dieses HTML-Element an ein SQL Statement gebunden werden soll.
Das Attribut id="link" bindet diese HTML-Element an das SQL Statement 'link' von Reiter 'SQL Statement'.
Dieses HTML-Element wird pro Ergebnis-Datensatz kopiert und prozessiert.
Das ${link:url} referenziert auf das Ergebnis-Feld 'url' des SQL Statements 'link'.
Ein bloßes ${url} würde sich hingegen auf das Formular-Feld mit dem Alias 'url' beziehen.

3.
Code:
select url from links where id = '${item:age}';
Das ${item:age} referenziert das Formular-Feld mit dem Alias 'age' aus dem aktuell bearbeiteten übergeordneten Formular-Datensatz.
An dieser Stelle ist das Prefix 'item' unbedingt notwendig.
Das Prefix 'item' ist der statische Name für den Bezug auf den übergeordneten Formular-Datensatz.
Das Prefix 'link' ist der selbst vergebene Name für den Bezug auf das SQL Statement 'link' von Reiter 'SQL Statement'.

Hinweis 1:
An allen anderen Stellen ist das Prefix 'item' optional und kann auch weggelassen werden.
Außerdem wird eine alte Schreibweise aus Kompatibilitätsgründen weiterhin unterstützt.
Alle folgenden Parameter-Namen-Variationen sind daher als Platzhalter gleichbedeutend:
Code:
<td colspan="1" align="left">${first}</td> <td colspan="1" align="left">${item:first}</td> <td colspan="1" align="left">[FIRST]</td> <td colspan="1" align="left">[First]</td> <td colspan="1" align="left">[first]</td>

Hinweis 2:
In dem SQL-Statement schließe ich den Parameter Platzhalter in einfache Hochkommas ein:
Code:
select url from links where id = '${item:age}';
Das ist notwendig weil das Tabellen-Feld 'id' vom Typ Text ist.
Wäre das Tabellen-Feld 'id' vom Typ Zahl, dann müssen die Hochkommas entfallen.

Liebe Grüße, Ingmar

:idea: I recommend you the new and up-to-date documentation for Joomla 4:
docs.joomla-5.visforms.vi-solutions.de/en/docs/
Most of this also applies retrospectively to Joomla 3.
Please only ask 1 question per topic :-).

:idea: Ich empfehle Dir die neue und aktuelle Dokumentation für Joomla 4:
docs.joomla-5.visforms.vi-solutions.de/docs/
Das meiste gilt rückwirkend auch für Joomla 3.
Bitte immer nur 1 Frage pro Thema stellen :-).
Last edit: 1 year 11 months ago by Administrator IV.
The following user(s) said Thank You: MaliRaj

More
1 year 1 month ago #9736 by sek101079
Replied by sek101079 on topic PDF Erstellung aus mehreren Tabellen
Hallo Ingmar,

vielen Dank für die ausführliche Antwort und entschuldige, dass ich auf diese Angelegenheit erst jetzt zurückkomme, da ich einige andere Baustellen hatte.

Soweit habe ich deine Erläuterungen, so glaube ich, verstanden. Das Problem ist aus meiner Sicht aber etwas differenzierter.

Hintergrund:

Die Tabelle aus deinem Beipiel "links" ist bei mir ebenfalls eine Visforms-Tabelle. In dieser Tabelle gibt es ein Upload-Feld, mit welchem ich die Bild-Dateien hochladen. Die Daten in dieser Spalte beinhalten demnach nicht nur den reinen Pfad (URL) wie in der Spalte url deines Beispiels, sondern sehen eher so aus:

{"folder":"tmp","file":"filename.jpg"}

Das bedeutet, ich habe in meiner Tabelle nicht die gleiche Struktur, wie du im Beispiel "links" und das wird wohl auch der Grund sein, warum die Bilder nicht ausgegeben werden.

Also nochmal etwas genauer zu meiner Ist-Situation:

Ich habe 2 Tabellen.

Tabelle 1: #_visforms_5
Tabelle 2: #_visforms_8

Die überwiegend benötigten Daten für das PDF kommen aus der Tabelle 8 (Das funktioniert auch prima!). Das PDF ist auch für Tabelle 8 erstellt.

Aus Tabelle 5 benötige ich den Pfad zu den Bild-Dateien aus Spalte F73. Die Inhalte in F73 sehen wie oben beschrieben aus:

{"folder":"tmp","file":"filename.jpg"}

Folgende Parameter brauche ich im Statement für eine valide Abfrage:

#_visforms_5 -> Spalte F73 mit dem Pfad

#_visforms_5 -> Spalte F74 beinhaltet als Text die Info "Bilddatei", sodass er erkennt, Achtung Bilddatei

#_visforms_5 -> Spalte F249 mit einer Nummer im Textfeld, welches mit #_visforms_8 verglichen werden muss

#_visforms_8 -> Spalte F248 mit einer Nummer im Textfeld, welches mit #_visforms_5 verglichen werden muss

F249 aus 5 sowie F248 aus 8 sind quasi "id" und "age" aus deinem Beispiel.

Daraus habe ich dann folgendes SQL Statement gebaut, welches im Test auch value 4 zurückgibt, was richtig wäre.

SELECT F73 FROM #_visforms_5 AS bilder, #_visforms_8 WHERE bilder.F74 = 'Bilddatei' AND bilder.F249 = #_visforms_8.F248

Referenz des Statements: Dokumente
Prozesstyp: Free

Ich benötige also wahrscheinlich lediglich die Info, wie ich aus dem Inhalt aus Feld F73 einen Pfad herstelle, den ich im <img> verwenden kann. So zumindest meine Vermutung, warum das ganze noch nicht funktioniert.

More
1 year 1 month ago #9738 by MaliRaj
Replied by MaliRaj on topic PDF Erstellung aus mehreren Tabellen
Dein Feld F73 (Dateiupload) ist im JSON-Format. Du musst dich also mit JSON auseinander setzen.

Freundliche Grüße aus PM
Heinz
(Joomla 5.1.2 / Visforms+Subscription 5.12 / PHP 8.2)
The following user(s) said Thank You: Administrator IV

More
1 year 1 month ago #9739 by sek101079
Replied by sek101079 on topic PDF Erstellung aus mehreren Tabellen

Dein Feld F73 (Dateiupload) ist im JSON-Format. Du musst dich also mit JSON auseinander setzen.

Vielen Dank.

Das Feld F73 JSON-Daten enthält, weiß ich. Mittels PHP wüsste ich auch, wie ich das mittels json_decode() nach dem auslesen konvertieren und nutzen könnte. Aber hier innerhalb Visform beim Erstellen des PDF bin ich völlig ratlos.

More
1 year 1 month ago #9741 by MaliRaj
Replied by MaliRaj on topic PDF Erstellung aus mehreren Tabellen
Ob du JSON in SQL nutzen kannst, hängt von deiner Version ab. Mit REGEXP kannst du den Dateinamen und Pfad auch extrahieren. Die Positionen innerhalb des Feldes sind ja bekannt.

Freundliche Grüße aus PM
Heinz
(Joomla 5.1.2 / Visforms+Subscription 5.12 / PHP 8.2)
The following user(s) said Thank You: sek101079, Administrator IV

More
1 year 1 month ago - 1 year 1 month ago #9743 by sek101079
Replied by sek101079 on topic PDF Erstellung aus mehreren Tabellen

Ob du JSON in SQL nutzen kannst, hängt von deiner Version ab. Mit REGEXP kannst du den Dateinamen und Pfad auch extrahieren. Die Positionen innerhalb des Feldes sind ja bekannt.

Vielen Dank für deine Hilfe.
Ich habe mich damit nun nochmal auseinandergesetzt und es anders gelöst. Die Abfrage sieht aktuell so aus:

SELECT concat(F73->>'$.folder','/',F73->>'$.file') as bilder FROM #_visforms_5 AS bilder, #_visforms_8 WHERE bilder.F74 = 'Bilddatei' AND bilder.F249 = #_visforms_8.F248

Damit werden mir die Bilder nun tatsächlich endlich ausgegeben!!! Allerdings von links nach rechts hintereinander bzw. nebeneinander weg. Ist auch logisch. Ich muss also jeden Pfad in ein eigenes IMG Tag innerhalb der Abfrage packen. Das ist mit noch nicht gelungen. Hast du vielleicht einen Tipp?

Mein Versuch sah so aus:

SELECT concat('<img src="',F73->>'$.folder','/',F73->>'$.file'," \>') as bilder FROM #_visforms_5 AS bilder, #_visforms_8 WHERE bilder.F74 = 'Bilddatei' AND bilder.F249 = #_visforms_8.F248

Das allerdings führte zu einer Fehlermeldung...
 
Last edit: 1 year 1 month ago by sek101079.

Moderators: Administrator AVAdministrator IV
Powered by Kunena Forum