Ik zit met zo'n titel natuurlijk op /13.5, maar ik denk dat hier wat meer ervaring/kennis zit op het punt waar ik mee zit. If not, excuse me & move me 
Ik maak momenteel een soort CRM, waarmee ik in eerste instantie klantgegevens wil beheren. Tegelijkertijd wil ik mijn skills op het gebied van PHP5/OO en XML/XSL een upgrade geven.
Hier fragmenten uit mijn code (we hebben het hier uiteindelijk gewoon over 1 customer):
Met deze objecten en methods kan ik netjes een XML document maken, die er bijvoorbeeld als volgt uitziet:
Of zo:
Het <required>-element (of attribuut) wordt aangemaakt op basis van de array in de constructor van de Customer-class. Het leek mij handig dit zo te kunnen centraal te kunnen beheren (er kan zo evt. nog meer metadata toegevoegd worden).
Het <error>-element (of attribuut) wordt alleen aangemaakt als er een form gepost is (de post-data wordt wel door een andere class gehaald om te kijken of deze valide is). Op basis hiervan is het dan de bedoeling dat er in het XSL document bijvoorbeeld een attribuut class="error" aan dat veld wordt toegevoegd.
Hopelijk is het so far nog een beetje normaal wat ik bedacht heb.
En dan komt het XSL-gedeelte. In een ander topic probeer ik al wat uit, wat niet echt wil lukken. De oplossing die Blues daar geeft zou wel de mooiste zijn denk ik, maar XSLT 2.0 met PHP5 gaat niet zo makkelijk. Aan de andere kant heb ik een makkelijkere oplossing bedankt, maar die is minder flexibel: namelijk een <xsl:for-each> voor elk <customer>-element gebruiken en aan de hand van de attributen die "required" en "error" zaken afhandelen (maar ook het soort input (text, checkbox) kan bij die metadata). Zie bijvoorbeeld het * bij het "required" veld.
Maar dat betekent dat alle form-velden gewoon na elkaar komen in de HTML output. Dit kan wel eens onwenselijk zijn natuurlijk.
Heel verhaal, eigenlijk komt het op het volgende neer: wat is een gangbare en intelligente manier om dit op te lossen? Doe ik het goed met die Class > XML > HTML?
In ieder geval bedankt voor het lezen
Ik maak momenteel een soort CRM, waarmee ik in eerste instantie klantgegevens wil beheren. Tegelijkertijd wil ik mijn skills op het gebied van PHP5/OO en XML/XSL een upgrade geven.
Hier fragmenten uit mijn code (we hebben het hier uiteindelijk gewoon over 1 customer):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Customer { private $customer_id; private $surname; private $address; function __construct() { $this->customer_id = -1; $this->surname = ''; $this->address = ''; $this->arrMetaData['customer_id'] = array('type' => 'int', 'required' => true); $this->arrMetaData['surname'] = array( 'type' => 'string', 'required' => true); $this->arrMetaData['address'] = array( 'type' => 'string', 'required' => false); } } |
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| $objCustomer = new Customer(); // Haal Customer data uit DB als er een id is meegegeven // Dit gebeurt ook als er een form gePOST is, dan wordt de data uit $_POST gehaald if(isset($_GET['customer_id']) && $_GET['customer_id'] > 0) { $objCustomer->load($_GET['customer_id']); } $objXMLDocument = new XMLDocument(); $objXSLProc = new xsltProcessor; $objXSLProc->importStyleSheet(DomDocument::load('xsl/edit_customer.xsl')); echo $objXSLProc->transformToXML($objXMLDocument); |
Met deze objecten en methods kan ik netjes een XML document maken, die er bijvoorbeeld als volgt uitziet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?xml version="1.0"?>
<root>
<data type="customer">
<customer>
<customer_id>1</customer_id>
<surname>Jansen</surname>
<address>Straatlaan 1</address>
</customer>
</data>
<required>
<customer_id/>
<surname/>
</required>
<error>
<surname/>
</error>
</root> |
Of zo:
code:
1
2
3
4
5
6
7
8
9
10
| <?xml version="1.0"?>
<root>
<data type="customer">
<customer>
<customer_id required="1" error="0">1</customer_id>
<surname required="1" error="1">Jansen</surname>
<address required="0" error="0">Straatlaan 1</address>
</customer>
</data>
</root> |
Het <required>-element (of attribuut) wordt aangemaakt op basis van de array in de constructor van de Customer-class. Het leek mij handig dit zo te kunnen centraal te kunnen beheren (er kan zo evt. nog meer metadata toegevoegd worden).
Het <error>-element (of attribuut) wordt alleen aangemaakt als er een form gepost is (de post-data wordt wel door een andere class gehaald om te kijken of deze valide is). Op basis hiervan is het dan de bedoeling dat er in het XSL document bijvoorbeeld een attribuut class="error" aan dat veld wordt toegevoegd.
Hopelijk is het so far nog een beetje normaal wat ik bedacht heb.
En dan komt het XSL-gedeelte. In een ander topic probeer ik al wat uit, wat niet echt wil lukken. De oplossing die Blues daar geeft zou wel de mooiste zijn denk ik, maar XSLT 2.0 met PHP5 gaat niet zo makkelijk. Aan de andere kant heb ik een makkelijkere oplossing bedankt, maar die is minder flexibel: namelijk een <xsl:for-each> voor elk <customer>-element gebruiken en aan de hand van de attributen die "required" en "error" zaken afhandelen (maar ook het soort input (text, checkbox) kan bij die metadata). Zie bijvoorbeeld het * bij het "required" veld.
HTML:
1
2
3
| <input type="hidden" name="customer_id" value="1"></input> <label for="surname">Achternaam: *<input type="text" name="surname" value="Jansen"></input> <label for="address">Adres:<input type="text" name="address" value="Jansen"></input> |
Maar dat betekent dat alle form-velden gewoon na elkaar komen in de HTML output. Dit kan wel eens onwenselijk zijn natuurlijk.
Heel verhaal, eigenlijk komt het op het volgende neer: wat is een gangbare en intelligente manier om dit op te lossen? Doe ik het goed met die Class > XML > HTML?
In ieder geval bedankt voor het lezen