Ich entwickle derzeit ein System, um Produkte mit Auswahl-Optionen
bestellen zu kᅵnnen. Dabei sollen die Optionen ganz einfach in einer
.yml-Datei angegeben werden kᅵnnen.
Als Beispiel steht in einer Datei der YML-Code:
options:
size:
values: [s, m, l, xl, xxl]
default: l
color:
values: [black, white, green, yellow, red]
default: green
print:
values: [front, back, both, none]
default: both
theme1:
values: [apache, php, linux, windoof, custom]
default: php
theme2:
values: [apache, php, linux, windoof, custom]
default: linux
Es wird eine PHP-Klasse generiert, welche wiederum ein Formular generiert:
<div class="field">
<label for="size">Format:</label>
<select name="size" id="size" onchange="change(this)">
<option value="s">Grᅵᅵe S</option>
<option value="m">Grᅵᅵe M</option>
<option value="l" selected="selected">Grᅵᅵe L</option>
<option value="xl">Grᅵᅵe XL</option>
<option value="xxl">Grᅵᅵe XXL</option>
</select>
</div>
<div class="field">
<label for="color">Farbe:</label>
<select name="color" id="color" onchange="change(this)">
<option value="black">schwarz</option>
<option value="white">weiᅵ</option>
<option value="green" selected="selected">grᅵn</option>
<option value="yellow">gelb</option>
<option value="red">rot</option>
</select>
</div>
<div class="field">
<label for="print">Druck:</label>
<select name="print" id="print" onchange="change(this)">
<option value="front">vorne</option>
<option value="back">hinten</option>
<option value="both" selected="selected">beidseitig</option>
<option value="none">kein</option>
</select>
</div>
<div class="field">
<label for="theme1">Motiv vorne:</label>
<select name="theme1" id="theme1" onchange="change(this)">
<option value="apache">Apache-Logo</option>
<option value="php" selected="selected">PHP-Logo</option>
<option value="linux">Tux</option>
<option value="windoof">Windoof-Logo</option>
<option value="custom">eigenes</option>
</select>
</div>
<div class="field">
<label for="theme2">Motiv Rᅵckseite:</label>
<select name="theme2" id="theme2" onchange="change(this)">
<option value="apache">Apache-Logo</option>
<option value="php">PHP-Logo</option>
<option value="linux" selected="selected">Tux</option>
<option value="windoof">Windoof-Logo</option>
<option value="custom">eigenes</option>
</select>
(Die Texte fᅵr die Felder und Optionen stehen in einer anderen .YML-Datei).
In einer abgeleiteten Klasse kann man wiederum Methoden implementieren,
welche zur Preis- oder Gewichtsberechnung dienen.
Nun soll man in der .yml-Datei unzulᅵssige Kombinationen definieren kᅵnnen:
Im Beispiel soll das Windoof-Logo nur in schwarz verfᅵgbar sein. Der
YML-Code kᅵnnte in etwa so aussehen:
conditions:
-
condition: theme1=windoof AND color!=black
message: Windoof-Logo nur fᅵr schwarz verfᅵgbar
-
condition: theme2=windoof AND color!=black
message: Windoof-Logo nur fᅵr schwarz verfᅵgbar
Hierzu mᅵsste die Bedingung auf semantische Gᅵltigkeit ᅵberprᅵft werden
und in PHP-Code ᅵbersetzt werden kᅵnnen.
function validate() {
if($this->theme1=='windoof' && $this->color=='black')
return array('Windoof-Logo nur fᅵr schwarz
verfᅵgbar',array('theme1','color'));
if($this->theme2=='windoof' && $this->color=='black')
return array('Windoof-Logo nur fᅵr schwarz
verfᅵgbar',array('theme2','color'));
return true;
}
Die Funktion soll die Fehlermeldung sowie die Namen der betroffenen
Felder zurᅵckgeben.
Nun kenne ich mich mit Parsen von Code-Ausdrᅵcken nicht aus.
Es sollten solche SQL-ᅵhnlichen Angaben mᅵglich sein:
field1=wert1 AND field2=wert2
field1=wert1 AND NOT field2=wert2
field1=wert1 AND field2!=wert2
field1=wert1 AND field2 IN [wert2,wert3]
field1=wert1 AND field2 NOT IN [wert2,wert3]
field1=wert1 OR NOT (field2 IN [wert2,wert3])
field1=wert1 AND NOT (field2 IN [wert2,wert3])
statt AND sollen auch &, statt OR soll auch | mᅵglich sein, sowie !
statt not, auch Vergleichsoperatoren (>=, <=, >, <) sollen (bei
Zahlenwerten) funktionieren.
Gibt es einen PHP-Code, der sowas beherrscht (die Syntax des Codes darf
auch anders sein), oder weiss jemand, wie man das umsetzen kann?
Eventuell lasse ich das auch gegen Entgelt programmieren.
mit freundlichen Grᅵᅵen
Egon Schmid
Es gibt diverse Mᅵglichkeiten. Eine einfache kᅵnnte darin bestehen die
Syntax so geschickt aufzubauen, dass es mit suchen und ersetzen zu lᅵsen
ist:
1. Die Werte mᅵssten wie in SQL, PHP als Konstanten geschrieben werden.
Mᅵglichst gleich als 'wert2'.
> Es sollten solche SQL-ᅵhnlichen Angaben mᅵglich sein:
>
> field1=wert1 AND field2=wert2
> field1=wert1 AND NOT field2=wert2
> field1=wert1 AND field2!=wert2
z.B. als Zeichenkette "field1='wert1' AND field2='wert2'" recht einfach
per RegEx umzuwandeln.
> field1=wert1 AND field2 IN [wert2,wert3]
> field1=wert1 AND field2 NOT IN [wert2,wert3]
IN [ ... ] muss eventuell vorab behandelt werden. Dies kommt vor allem
dadurch, dass Klammernde Strukturen es schwerer machen die Klammen
sauber zuzuordnen. Allerdings kennen RegEx auch Rekursion. Wird aber
etwas schwerer zu lesen.
"field2 NOT IN ['wert2','wert3']" wᅵrde ich nicht erlauben. "NOT field2
IN ['wert2','wert3']" wᅵre im vorangegangen schon enthalten.
> field1=wert1 OR NOT (field2 IN [wert2,wert3])
> field1=wert1 AND NOT (field2 IN [wert2,wert3])
Die Vorrangklammern kᅵnnten doch beim ᅵbersetzen nach PHP einfach zu
bleiben wie sie sind.
> statt AND sollen auch &, statt OR soll auch | mᅵglich sein, sowie !
> statt not, auch Vergleichsoperatoren (>=, <=, >, <) sollen (bei
> Zahlenwerten) funktionieren.
Warum nur bei Zahlenwerten? Ich wᅵrde die Operatoren alle in die
gewᅵnschten Operatoren von PHP ᅵbersetzen und den Rest der Prᅵfung PHP
machen lassen.
> Gibt es einen PHP-Code, der sowas beherrscht (die Syntax des Codes darf
> auch anders sein), oder weiss jemand, wie man das umsetzen kann?
> Eventuell lasse ich das auch gegen Entgelt programmieren.
Eine weitere Mᅵglichkeit wᅵre es einen Parser zu schreiben. Ein
Recursive Descent Parser z.B. ist schnell geschrieben und sollte fᅵr
derartige Ausdrᅵcke auch in PHP einfach umzusetzen sein und schnell
genug ist der vermutlich auch.
Gruᅵ
Heiko
--
http://portal.richler.de/ Namensportal zu Richler
http://www.richler.de/ Heiko Richler: Computer - Know How!
http://www.richler.info/ private Homepage