Joomla 5 Mitteilung

Wir freuen uns mitteilen zu können, dass seit dem 29. Januar 2024 alle unsere Joomla Erweiterungen mit Joomla 5 kompatible sind.

Für alle die gerade noch von Joomla 3 auf 4 aktualisieren: Anleitungen für die Joomla 4 Migration gibt es hier:

Es gibt nun auch eine eigenständige Dokumentation für Visforms für Joomla 4 und für Visforms auf Joomla 5

Forum

Visforms Subscription Inhaber können in unserem Forum Fragen stellen. Bitte mit dem entsprechenden Benutzer anmelden.
Jeder kann lesend auf das Forum zugreifen.

Bitte stellen Sie nur 1 Frage pro Thema.

Wichtig Angaben für fast jede Frage:
V1: Welche Visforms-Version läuft?
V2: Welche Joomla-Version läuft?
V3: Welche PHP-Version läuft?

PDF Erstellung aus mehreren Tabellen

Mehr
1 Jahr 11 Monate her - 1 Jahr 11 Monate her #8688 von Administrator IV
Administrator IV antwortete auf 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 :-).
Letzte Änderung: 1 Jahr 11 Monate her von Administrator IV.
Folgende Benutzer bedankten sich: MaliRaj

Mehr
1 Jahr 1 Monat her #9736 von sek101079
sek101079 antwortete auf 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.

Mehr
1 Jahr 1 Monat her #9738 von MaliRaj
MaliRaj antwortete auf 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)
Folgende Benutzer bedankten sich: Administrator IV

Mehr
1 Jahr 1 Monat her #9739 von sek101079
sek101079 antwortete auf 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.

Mehr
1 Jahr 1 Monat her #9741 von MaliRaj
MaliRaj antwortete auf 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)
Folgende Benutzer bedankten sich: sek101079, Administrator IV

Mehr
1 Jahr 1 Monat her - 1 Jahr 1 Monat her #9743 von sek101079
sek101079 antwortete auf 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...
 
Letzte Änderung: 1 Jahr 1 Monat her von sek101079.

Moderatoren: Administrator AVAdministrator IV
Powered by Kunena Forum