Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.
Seiten: 1
#1 12. Juni 2015 19:15
- jeff1980
- Server-Pate
- Ort: Dortmund
- Registriert: 26. November 2010
- Beiträge: 630
[GELÖST] PHP - Aufwändiges Suchen und Ersetzen
Hallo zusammen,
ich hoffe, die Bastelstube ist ok für eine reine PHP-Frage, unabhängig von CMSms.
Folgende Situation:
Ein Dropdown (select) wird aus einem Array zusammen gesetzt. Nun sollen die einzelnen Optionen durch andere Werte ersetzt werden.
Das Dropdown sieht im Frontend so aus (Beispiel):
[== HTML ==]
<select>
<option>a</option>
<option>b</option>
<option>c</option>
<option>d</option>
</select>
Zusammengesetzt wird es so:
[== PHP ==]
<select onchange="setLocation(this.value)">
<?php foreach ($this->getItems() as $_item): ?>
<option><?php echo $_item->getLabel() ?></option>
<?php endforeach; ?>
</select>
Jetzt sollen die jeweiligen Optionen (a-d) anhand einer Tabelle bzw. CSV-Datei ausgetauscht werden (a=1, b=2 usw.).
Dafür lese ich eine entsprechende CSV-Datei ein und erhalte folgenden Array:
Array
(
[0] => Array
(
[0] => a
[1] => 1
)
[1] => Array
(
[0] => b
[1] => 2
)
[2] => Array
(
[0] => c
[1] => 3
)
[3] => Array
(
[0] => d
[1] => 4
)
)
Mit meinem naiven Grundwissen in PHP würde ich mir jetzt wünschen, dass es eine Funktion gibt, die $_item->getLabel() gegen den Array aus der CSV-Datei prüft und bei Erfolg den entsprechenden Gegenwert wählt.
Ich habe mir schon str_replace, str_ireplace, substr_replace und strtr angeschaut wobei mir str_replace am sinnvollsten erscheint. Allerdings finde ich natürlich genau diesen Anwendungsfall dort nicht bzw. nur in die andere Richtung - oder ich bin nur zu blind.
Um Fragen zuvor zu kommen - es gibt in dem Fall leider keine andere Möglichkeit, die Werte schon im Vorfeld zu ändern, da sie aus einer Datenbank kommen, in denen sie mit a-d gespeichert sein müssen, nun aber mit 1-4 ausgegeben werden sollen.
In der Realität handelt es sich dabei um interne und externe Artikelnummern mit unterschiedlichen Zeichen, es kommen Punkte, Bindestriche, Buchstaben und Zahlen vor.
Es gibt sicher viele viele PHP-Foren, aber hier habe ich einfach die beste Erfahrung gemacht und hoffe deshalb auf Hilfe oder Tipps :-)
Offline
#2 13. Juni 2015 22:53
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
In der Realität handelt es sich dabei um interne und externe Artikelnummern mit unterschiedlichen Zeichen, es kommen Punkte, Bindestriche, Buchstaben und Zahlen vor.
Ähmm, kann es sein, dass du es dir unnötig schwer machst? Wozu ein replace?
<select>
<option value="1">a</option>
<option value="2">b</option>
<option value="3">c</option>
<option value="4">d</option>
</select>
http://wiki.selfhtml.org/wiki/HTML/Form … _bestimmen
Ich halte es für wahrscheinlich, dass du in dem System, welches du offensichtlich verwendest, auch der Gegenwert bereits hinterlegt ist ... ich rate jetzt mal
<option value="<?php echo $_item->getValue() ?>"><?php echo $_item->getLabel() ?></option>
Es gibt sicher viele viele PHP-Foren, aber hier habe ich einfach die beste Erfahrung gemacht
Danke für die Blumen ...
Offline
#3 13. Juni 2015 07:27
- jeff1980
- Server-Pate
- Ort: Dortmund
- Registriert: 26. November 2010
- Beiträge: 630
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
Der Ansatz ist gut - allerdings wird mit der zur Verfügung stehenden Schnittstelle nur die interne Artikelnummer übertragen. Und an der Schnittstelle kann zumindest im Moment leider nichts angepasst werden - ich muss also mit den Daten leben, die kommen.
Deshalb der Gedanke mit der "Übersetzung", da diese Tabellen eh vorliegen.
Wie es so ist, kam mir in der Nacht noch ein Gedanke, den ich gleich mal testen werde. Ist sicher nicht der sauberste Weg, aber die fehlende Übertragung aller Daten ist schließlich auch nicht sauber ;-).
Ich werde $_item->getLabel() innerhalb der vorhanden foreach-Schleife in einer eigenen Schleife nach und nach gegen die Untereinträge des Arrays prüfen und per if-Abfrage beim passenden Ergebnis die Variable neu belegen.
Soweit zur Theorie :-)
OT: Das mit den Foren meine ich echt ernst. Bevor ich hier schreibe recherchiere ich natürlich, wenn auch nicht immer erfolgreich. Was da manchmal für ein Ton in den Foren herrscht - das möchte ich mir nicht antun. Ich bin dankbar für Lösungsansätze, aber einigen Schreiberlingen möchte ich nicht außerhalb des Internets begegnen ;-)
Beitrag geändert von jeff1980 (13. Juni 2015 07:28)
Offline
#4 13. Juni 2015 09:26
- jeff1980
- Server-Pate
- Ort: Dortmund
- Registriert: 26. November 2010
- Beiträge: 630
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
Es hat geklappt.
Ist ja nicht so, dass ich nicht schon einige Nächte drüber geschlafen hab, aber die Letzte hats gebracht.
[== PHP ==]
<?php /* Artikelnummerngegenüberstellung laden */
$csv = array();
$lines = file('daten.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$csv[$key] = str_getcsv($value);
}
?>
<select onchange="setLocation(this.value)">
<?php foreach ($this->getItems() as $_item): ?>
<?php /* getLabel mit Artikelgegenüberstellung abgleichen und ggf. ersetzen */
$item_label = $_item->getLabel();
foreach ($csv as $row) {
if ($item_label == $row['0']) {
$item_label = $row['1'];
}
}
?>
<option><?php echo $item_label ?></option>
<?php endforeach; ?>
</select>
Im ersten Teil wird die CSV-Datei geladen und in einem multidimensionalen Array abgelegt.
Im nächsten Schritt wird während des Aufbaus der Optionen-Liste jedes mal die gesamte CSV-Liste abgeglichen. Gibt es einen Treffer, wird die Variable $item_label mit dem gegenübergestelltem Wert gefüllt, ansonsten bleibt sie wie sie ist.
Die aktuelle Liste beinhaltet ca. 200 Zeilen. Aber es funktioniert und die Seite ist nicht merklich langsamer und es ist eh eher als Intranet gedacht.
Offline
#5 13. Juni 2015 12:00
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.437
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
Nur so als Tipp: Langfristig würde ich da vielleicht eher den Weg über eine Datenbank gehen.
Das sollte nicht nur einfacher sondern auch performanter sein.
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#6 13. Juni 2015 17:58
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
Ich bleib trotzdem dabei
Ähmm, kann es sein, dass du es dir unnötig schwer machst?
Wenn die Schnittstelle nicht zu gebrauchen ist, kannst du auch ganz drauf pfeifen, und dir das Array für die simple Präsentation im Frontend
<select>
<option value="1">a</option>
<option value="2">b</option>
<option value="3">c</option>
<option value="4">d</option>
</select>
komplett aus der CSV ziehen ... da braucht es keinen Abgleich zu irgendwas. Wenn es 'ne externe Artikelnummer gibt, muss es eigentlich zwingend auch eine interne geben . Das ist so sicher wie das Amen in der Kirche und bedarf keiner separaten Prüfung. Musst halt nur schauen, dass die CSV immer aktuell ist ...
Zusätzliche Abgleiche und Schleifen kosten immer Performance, und das nicht wenig - mach einfach mal einen Lasttest mit 100 Usern . Am besten erst gar nicht solche "Unarten" angewöhnen
.
Oder du umgehst die Schnittstelle und greifst direkt auf die Datenbank zu. Datenbanken sind auf das Datenschubsen optimiert, und ein SELECT dürfte da nur wenig Sicherheitsprobleme mit sich bringen ...
OT: Das mit den Foren meine ich echt ernst. Bevor ich hier schreibe recherchiere ich natürlich, wenn auch nicht immer erfolgreich. Was da manchmal für ein Ton in den Foren herrscht - das möchte ich mir nicht antun. Ich bin dankbar für Lösungsansätze, aber einigen Schreiberlingen möchte ich nicht außerhalb des Internets begegnen ;-)
Danke für den Input - nehme das einfach mal als Vorschlag für ein separates Board "PHP / JavaScript", da die Bastelstube bedarfsorientierten Anpassungen von CMSMS vorbehalten bleiben soll.
Offline
#7 15. Juni 2015 09:11
- jeff1980
- Server-Pate
- Ort: Dortmund
- Registriert: 26. November 2010
- Beiträge: 630
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
@NaN: Den Gedanken finde ich gut - ist erst mal nur Notbehelf, aber wenn es länger so bleibt werd ich das auch machen. Ist dann auch leichter zu pflegen über ein kleines Frontend.
@Cyberman: Wenn es so einfach wäre. Leider hängen an den Daten noch mehr Informationen und es gibt zwar immer eine interne Artikelnummer, aber manchmal (noch) keine Externe ...
Und externer Zugriff auf die Datenbank ist leider nicht möglich - es ist eine MSSQL-Datenbank, die für externe Zugriffe gesperrt ist.
Mir ist bewusst, dass es nicht sauber ist. Und ich werde mit Nachdruck auf eine Aktualisierung der Schnittstelle drängen. Ganz zu schweigen von der doppelten Pflege, die erfahrungsgemäß nicht lange durchgehalten wird. Glücklicherweise wird auf der Seite nicht so viel los sein, dass sie zusammenbrechen wird und über kurz oder lang wird es auch eine andere Lösung geben.
Aber für mich war es auch wieder eine Lernerfahrung
Die Idee mit dem PHP/Javascript-Bereich finde ich super. Manchmal ist der Übergang von CMSms (Smarty & Co.) zu den grundlegenden Sprachen ja fließend.
Und danke, dass ich diese Frage hier einfach stellen konnte, obwohl sie nichts mit CMSms zu tun hat.
Offline
#8 15. Juni 2015 09:45
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen
Leider hängen an den Daten noch mehr Informationen und es gibt zwar immer eine interne Artikelnummer, aber manchmal (noch) keine Externe ...
Und externer Zugriff auf die Datenbank ist leider nicht möglich - es ist eine MSSQL-Datenbank, die für externe Zugriffe gesperrt ist.
Ist ja echt doof ... trotzdem nervt dieses Rumgefrickel .
Hmm, du könntest doch die Daten komplett in 'ne CSV ziehen, wo du keine Zugriffsbeschränkungen mehr hast.
Oder du baust dir bereits VOR der Ausgabe als HTML aus getLabel() und CSV ein Array, mit dem dies
http://www.cmsmadesimple.de/forum/viewt … 398#p35398
möglich wird (quasi deine eigene Schnittstelle ).
Wie gesagt - ein replace, egal in welcher Form, ist für eine performante Programmierung alles andere als optimal ... sozusagen die "teuerste" aller möglichen Varianten.
Beitrag geändert von Andynium (15. Juni 2015 09:47)
Offline
Seiten: 1