XSD - mezőszám szűkítés
Üdv.
Van egy összetett típusom, nevezzük most osztálynak:aminek vannak beágyazott elemei, őket nevezzük most mezőknek.
Ebből az osztályból szeretnék olyan szűkítéseket (leszármazott osztályokat) csinálni, amiknél az egyes mezők meglétét úgy ellenőrzöm, hogy nem adom meg újra a mezők típusait. A fenti példánál maradva, mondjuk a felhasználó névvel és email címmel regisztrál, aztán email-ben kap egy alap jelszót, amit megváltoztathat. Így a regisztrációnál csak aItt a
A kérdésem az, hogy ezt hogyan lehet megoldani a php-ben használható xsd-vel?
■ Van egy összetett típusom, nevezzük most osztálynak:
<xs:complexType name="User">
<xs:all>
<xs:element name="id" type="xs:positiveInteger" minOccurs="0" maxOccurs="1" />
<xs:element name="email" type="email" minOccurs="0" maxOccurs="1" />
<xs:element name="password" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:all>
</xs:complexType>
Ebből az osztályból szeretnék olyan szűkítéseket (leszármazott osztályokat) csinálni, amiknél az egyes mezők meglétét úgy ellenőrzöm, hogy nem adom meg újra a mezők típusait. A fenti példánál maradva, mondjuk a felhasználó névvel és email címmel regisztrál, aztán email-ben kap egy alap jelszót, amit megváltoztathat. Így a regisztrációnál csak a
name
és email
mezőket kell megadni.
<Auth:register>
<user>
<name>Pistike</name>
<email>a##kukac##b.d</email>
</user>
</Auth:register>
user
a User
osztály egy olyan leszármazottjának példánya, ami megköveteli a name
és email
mezőket, illetve azt is megköveteli, hogy a többi mező ne szerepeljen.A kérdésem az, hogy ezt hogyan lehet megoldani a php-ben használható xsd-vel?
Az 1.1-es xsd-ben van olyan,
assert
, ezzelxpath
-el simán lehet ellenőrizni valamilyen mezőnek az előfordulását. Szóval egyextension+assert
megoldja a problémát.A gond ezzel az, hogy szerintem nem lehet 1.1-es xsd-t használni a php-vel, legalábbis nekem nem sikerült eddig. Nem találtam sehol leírást arról, hogy milyen verziót támogat a php, illetve, hogy az alapbeállítás ezzel kapcsolatban változtatható e. Szóval olyan 90%-ra teszem, hogy ezzel nem érek célba.
Kérdés az, hogy
assert
-en kívül vajh van e még más megoldás? (Én egyelőre azall
szűkítése felé tapogatózom, de kevés sikerrel, nem találtam még infot arról, hogy lehetséges e ilyesmi.)Utánanéztem jobban, libxml2
Pár szó még arról, hogy miért
Ugye a hagyományos az lenne, hogy van egy
BasicUser
osztály, aztán abból származtatom aLoginUser
-t, meg aRegisterUser
-t, és így tovább. Minden leszármazottba új mezők kerülnek be...A gond ezzel az, hogy mondjuk ha csak a
User
-t vesszük, akkor van a regisztráció, ottname,email
kell, aztán van a belépés, ottemail,password
kell, aztán van az adatmódosítás, ott tetszőleges mezők mehetnek úgy fel, hogy nem követeljük meg, csak azid
-nek és plusz egy módosított mezőnek a meglétét (már ha ajax-ról van szó). Még ezer helyen lehet használni aUser
fajtákat úgy, hogy mindenhol totál eltérő, hogy milyen mezők kellenek.Ezek a mezők nincsenek egymással szoros logikai kapcsolatban, szóval a
User
öröklődési fája úgy nézne ki, hogy van egy üresBasicUser
, és van ezer leszármazottja egy szint mélységben, az alsóbb szinteken meg alig valami, a mezők típusainak a beállítása meg nagyon durván redundáns lenne. Az xsd redundanciája meg ugye kikövezett út a validálási hibákhoz... Ezért nem jó ez a fajta gondolkodás ebben az esetben.Tovább okosodtam, elvileg, ha
Mire való ez a bűvészkedés az
Van egy olyan elgondolásom,
Az XML egyébként azért is jó, mert le lehet írni benne HTML tageket is. Mondjuk ha megengeded a div-et, akkor be kell tenni az xsd fájlba a bejövő szöveghez, hogy div nevű element is lehet benne... Így a js injection-t is lehet szűrni a szövegből, illetve bizonyos formázással kapcsolatos dolgokat megengedni. Nem is feltétlen muszáj html tageket használni, mert XSL-el át lehet alakítani amúgy is majd a kirajzoláskor.
Az XSD-vel még lehetséges adatbázis táblák és kulcsok leírása. Aztán ha XSD-vel adja meg ezeket az ember, és ugyanolyan szerkezetű entitásokat vár a kliens oldaltól, akkor elég az XSD-t egyszer megírni, utána meg úgy szűkíteni a mezőket ahogy én próbálom. Szóval az a logika van mögötte, hogy előtte kidolgozom az adattároló osztályokat XSD-ben, aztán egyszer XSL-el SQL-t hozok létre, másrészt meg csinálhatok ugyanúgy osztályokat meg validáló kódot is ez alapján. Elég széles a skála, amire fel lehetne használni, egyelőre tesztelem, hogy mi az, amit lehet.
Azért vannak hátrányai is. Az űrlapnál ugye mezők vannak, aztán annak kiderítése, hogy melyik hibaüzenet melyik mezőre vonatkozik elég zűrös tud lenni bonyolultabb űrlapoknál. Szóval a hibaüzenetes részével lehetnek gondok, meg hát xsd 1.1-et még nem támogatja a php, pedig azzal sokkal komolyabb dolgokat lehet, mint az 1.0-val.