PHP Frage, Platzhalter in MySQL für PHP Ausgabe hinterlegen

Domi83

Rear Admiral
Registriert
Feb. 2010
Beiträge
5.203
Hallo Leute, ich hatte vor langer Zeit (ist bestimmt schon 10 Jahre her) für ein Projekt, Platzhalter in einem Text hinterlegen können um diese dann austauschen zu können. Damals waren Texte in einer MySQL Datenbank hinterlegt und mitten drin waren dann [platzhalter] hinterlegt. Da es aber schon so ewig lange her ist, ich es dann nie wieder brauchte ist es natürlich "aus den Augen, aus dem Sinn":(

Chef möchte gerne anhand unserer Datenbank Etiketten bedrucken. Dort kommen eigentlich handelsüblich Adressen drauf... Beispiel wäre wie folgt.
Code:
Anschrift:
Max Mustermann
Musterstr. 5
12345 Berlin

Platzhalter:
[Vorname] [Nachname]
[Anschrift]
[PLZ] [Ort]

Ich möchte nun in unserer MySQL Datenbank Vorlagen anlegen können und in einem ganz normalen Textfeld meine Platzhalter hinterlegen können. Mein Gedanke war, dass ganz simple mit Variablen ausgeben zu lassen, Chef möchte aber selbst anhand dieser Platzhalter die Ausgabe für die Etiketten bestimmen können. Eine Vorlage habe ich schon in der Datenbank hinterlegt die ganz simple (wie in meinem Beispiel) aufgebaut ist. Nun muss "eigentlich nur noch" durch ein 'replace' das [Vorname] in $vorname umgewandelt und dann mit den Daten aus der Datenbank gefüttert werden.

Wenn ich mich nicht irre, ist das machbar... aber es hapert gerade an der Umsetzung und alles was ich bis jetzt gesucht hatte, brachte mir Ergebnisse wie ich mit Platzhaltern in einer Datenbank suchen kann. Aber den 'LIKE' Befehl kenne ich schon und der hilft mir nicht wirklich weiter. Daher hoffe ich mal, dass mir einer sagen kann wie ich das am besten lösen könnte.

Schon mal vielen Dank im Voraus.
Gruß, Domi
 
Würde dafür TWIG nehmen. Einfach das TWIG-Template in der Datenbank speichern und beim Drucken das Template laden, rendern und das Ergebnis ausgeben.
 
Eine Template-Engine verwenden statt ~5 Zeilen PHP Code zu schreiben? Ist schon sehr verschwenderisch. Alternativ zu str_replace gibts auch noch strtr.
 
Das Rad neu erfinden (und sich ggf. Sicherheitslücken darüber einfangen) ist nicht gerade sehr Smart.
Am Ende ist das Ergebnis nämlich eine Template Engine. Und dann kann man auch etwas etabliertes, fertiges nehmen. Ist ja nicht so, dass TWIG nicht performant laufen würde...
 
Er will ja Vorlagen verwenden. Mit prinft müssen ja für alle Vorlagen entsprechender Code geschrieben werden damit die Reihenfolge passt. Dann braucht man die Vorlagen auch nicht in der Datenbank.
Ergänzung ()

Das Rad neu erfinden? Bei 5 Zeilen Code? Und Sicherheitslücken in ein str_replace zu packen, dafür braucht es schon ganz besonderes Talent.
 
Moin, und vielen Dank schon mal für die Rückmeldungen. Ich schaue nachher mal und war der Meinung das die handelsüblichen 'replace' Befehle nicht so funktionieren, weil ich ja die Platzhalter innerhalb eines String in Variable umwandeln will.

Was die Template Engine angeht, verwende ja schon tcPDF um die Vorlage für den Druck zu erstellen. Keine Ahnung ob sich das beißt, aber wenn dem so sei, wäre mir die selbst gebaute Variante lieber.

Was die Sicherheitslücken angeht, wie schon erwähnt... es geht vermutlich um ein ganz normales 'replace' und das auch noch von Daten die wir selbst (in einem geschlossenen System) eingeben. Und nicht wie in einem öffentlich zugänglichen Forum wie dieses wo jeder Hans und Franz oder jeder Skript-Kiddie mal etwas ausprobiere will ;)

Da ich allerdings bis jetzt noch nicht zum testen kam (bin IT Admin hier in der Firma), schaue ich mal dass ich das morgen ausprobieren kann.

Gruß, Domi
 
Du willst also tatsächlich aus:

Code:
[Vorname] [Nachname]
[Anschrift]
[PLZ] [Ort]
das hier bauen:
Code:
$vorname $nachname
$anschrift
$plz $ort
und dann die Variablen ersetzen?

Das würde mit eval gehen aber so was macht man nicht. Das ist Murks.
 
OK, dann mache ich es fragend... Wenn es murks ist, wie macht man es dann besser?

Es gibt ein Eingabemaske (form, textarea), in diesem "Textarea" werden (wie in deinem ersten Code Teil) die Variablen gesetzt, so wie sie Chef haben will, in der MySQL Datenbank gespeichert und hinterher wenn er sich das PDF generieren will, wählt er seine Vorlage die er über das Textarea erstellt hat und dann wird das PDF gefüttert.

Eins hab ich noch vergessen... statisch von mir vorgegeben ist nicht erwünscht. Denn das ist aktuell der Fall... er will selbst über ein textarea (er sagt Eingabefeld) die Formatierung bestimmen können.
 
Wie in den vorigen Posts genannt mit str_replace oder strtr. Indem du direkt den Platzhalter durch den gewünschten Wert ersetzt.

Beispiel:
PHP:
$kundendaten = [
        'vorname' => 'Max',
        'nachname' => 'Mustermann',
        'anschrift' => 'Musterstraße 1',
        'plz' => '12345',
        'ort' => 'Musterhausen',
];

$vorlage = <<<EOL
[Vorname] [Nachname]
[Anschrift]
[PLZ] [Ort]
EOL;

$etikett = $vorlage;

foreach ($kundendaten as $key => $value)
        $etikett = str_ireplace('[' . $key . ']', $value, $etikett);

echo $etikett . PHP_EOL;

Habe hier mal str_ireplace verwendet um die Groß-Kleinschreibung in der Vorlage zu ignorieren. Ist Chefs schwer beizubringen, kenne ich aus eigener Erfahrung.
 
Oh, sorry.... dann war die Aussage "das ist murks" auf das 'eval' bezogen, korrekt? Dann hatte ich das falsch verstanden.

Gruß, Domi
 
Alles klar, dann hab ich mich da vertan. Ich dachte das ganze geplante Szenario wäre murks. Aktuell hat er ja eine Eingabe Maske für die erste Zeile (unser Absender) und eine weitere Zeile die im PDF nur auftaucht, wenn sie befüllt ist.

Anschließend wird das PDF ganz normal durch eine 'foreach()' Schleife mit den Adressdaten gefüttert. Irgendwo hat er aber gesehen, dass man solche Felder auch individuell hinterlegen und anpassen kann. Ich hatte ihm zwar angeboten, die "Vorlagen" selbst anzulegen und ihm zur Verfügung zu stellen... wollte er aber nicht :rolleyes:

Daher dieses etwas komische Szenario... bin gespannt wann er das so nutzt wie er das haben will und was es wird. Aber er sorgt dafür das regelmäßig Geld auf dem Konto landet, dann tue ich ihm den Gefallen und wenn er auf ein "warum brauchst du das?" keine Antwort geben will, nehme ich das mal so hin :D
 
Ich sehe den Chef schon:

"Hier, schauen Sie sich das mal an: Ich will, dass bei Firmen zusätzlich immer automatisch der Ansprechpartner eingefügt wird. Das funktioniert aber alles nicht!"

Und deswegen erfindet man das "Rad" einfach nicht neu, sondern verwendet eine fertige Template Engine, die 1. Dokumentiert ist und 2. funktioniert ;)
 
Kurze Frage, wie installiert man TWIG, geschweige denn den composer, wenn man einen shared-hoster hat? Wir haben zwar unsere eigenen Server, aber es geht um das "was wäre wenn?";)

Nachtrag: Mir fällt jetzt auch noch ein, dass ich mich Anfang des Jahres mal mit jemandem über composer und "Projekte die damit aufgebaut werden" unterhalten habe. Damit muss man sich dann auch erst einmal befassen, einarbeiten etc. und das ganze Projekt nur wegen einer Template Engine umbauen dauert noch mal mehr Zeit.

Ist halt nicht böse gemeint, deine Tipps sind bestimmt gut, aber es würde mir jetzt sofort, nicht wirklich helfen. Oder sehe ich das falsch? Ich lasse mich da gerne erleuchten...
 
Es ist eine Glaubensfrage. Einige schwören darauf überall fertiges Zeug zu nehmen. Ich kenne auch genug Leute die ein Wordpress für eine Visitenkartenhomepage nutzen. Das muss jeder für sich entscheiden.

Bei fertigen Lösungen muss man aber eben auch bedenken, dass die auch gepflegt werden müssen also regelmäßig Updates einspielen. Die foreach Schleife mit str_ireplace wird so vermutlich auch in 10 vielleicht sogar 20 Jahren noch funktionieren da es absolute Basisfunktionen von PHP sind.

Es ist immer die Frage welche Funktionalitäten man tatsächlich braucht.
 
Wenn du composer nicht global auf dem Server installieren kannst reicht es auch die composer.phar herunterzuladen, irgendwo speichern und ausfuehrbar zu machen (chmod +x composer.phar).
Im Projekt muss nicht unbedingt alles umgestellt werden.

composer.phar require "twig/twig:^2.0"

PHP:
<?php
require __DIR__ . '/vendor/autoload.php';

$loader = new Twig_Loader_Array(array(
    // hier dann ggf. die Templates aus der Datenbank laden
    'anschrift' => "{{ vorname }} {{ nachname }}\n{{ anschrift }}\n{{ plz }} {{ ort }}",
));
$twig = new Twig_Environment($loader);

$kundendaten = [
        'vorname' => 'Max',
        'nachname' => 'Mustermann',
        'anschrift' => 'Musterstraße 1',
        'plz' => '12345',
        'ort' => 'Musterhausen',
];

echo $twig->render('anschrift', $kundendaten);

https://getcomposer.org/doc/00-intro.md
https://twig.symfony.com/doc/2.x/intro.html
 
Ich werde mir das heute Abend oder morgen mal genauer anschauen, habe mir eben über Youtube mal das eine oder andere Video zu Composer angeschaut, bin dann zu "Laravel" gekommen und dort habe ich auch erst einmal einen Stop eingelegt.

Natürlich ist das immer eine Glaubensfrage was man verwenden will / möchte. Ich persönlich verwende Notepad++ zum bearbeiten von PHP Dateien, da er kostenfrei und schön klein gehalten ist. Bietet dadurch vielleicht nicht so viele Features wie ein anderer Editor, unter anderem wurde mir auch PHP Storm ans Herz gelegt... aber der wäre für die Arbeit eigentlich wieder kostenpflichtig, bringt ganz schön viel mit und da ist die Frage ob ich das dann brauche.

Selbst die aktuell gebauten Projekte sind (falls der Begriff passt) Old-School aufgebaut. Es gibt eine (oder mehrere) PHP Dateien, darin gibt es 'include' für die eine oder andere Datei, dann gibt es ganz simple das "css" sowie "inc" Verzeichnis worin sich bestimmte Dateien befinden. Ist ein Schema welches ich seit Jahren so verwende und sollte ich mal im Urlaub sein, wissen die Kollegen gleich wo sie meine Dateien finden und wie man damit umgehen kann. Natürlich sind da auch "class.bob.php" Dateien drin die entsprechende Klassen Daten / Informationen enthalten.

Vorteil ist (finde ich) das es bis jetzt überall lief. Bestes Beispiel sind CMS, Wordpress ist da noch relativ simple gehalten. Aber als wir auf einem anderen Server ein Update gemacht hatten, lief das Projekt von einem Bekannten von Chef nicht mehr weil sein CMS mit dem PHP Update nicht mehr klar kam.

Ich selbst betreue einen Bekannten der einen Online Shop betreibt... Dieses Rad neu erfinden, würde ich nicht wollen, aber die Shop-Software fand das Update von PHP 5.3 auf 5.4 (glaube die Versionen waren das) auch nicht so toll. Eigentlich gab es da keine großen Änderungen innerhalb dieser 5er Version, aber wir mussten von heute auf morgen viel umstellen weil Umlaute kaputt waren. Zum testen haben wir den Shop mal auf einen Server mit installierter älterer PHP Version installiert und schon ging es wieder :)

Nun holte ich leider etwas weiter aus, aber wollte mal ein wenig Informationen vermitteln. Vielleicht wird ja das eine oder andere somit klarer... auch wenn das nicht mehr so zum Thema passt.

Ich wünsche zumindest schon mal dem einen oder anderen (wenn es soweit ist) einen entspannten Feierabend.

Gruß, Domi
 
Composer muss nicht auf dem Server installiert werden, sondern auf deiner Entwicklermaschine.

Für Windows gibt es da ein einfaches Installationsprogramm, was auch die Abhängigkeiten prüft (PHP als CLI ausführbar in der globalen Umgebung)
Anschließend erzeugt man zunächst unter Windows im Entwicklungspfad das Projekt, wie es oben schon steht, mit composer require "twig/twig:^2.0"

Den Rest erledigt Composer von alleine (twig herunter laden, Abhängigkeiten laden, /Vendor und autoload.php anlegen)

Dieses erzeugte Verzeichnis "vendor" + Deinen Code lädt man dann auf dem Zielserver, das ist auch schon alles. Das kann man dann auch schon zur Entwicklung machen, falls auf deiner Maschine kein kompletter Webserver läuft oder laufen soll.

Composer erleichtert es dabei einfach die freien Projekte im Netz sauber herunter zu laden und in sein eigenes Projekt einzubinden.

Du kannst Twig ansonsten auch manuell bei Github herunter laden und entsprechend einbinden.
 
Zurück
Oben