Programmation PHP/Exemples/MiniCMS/Modélisation
La modélisation se veut simple et polyvalente.
Champs de données
[modifier | modifier le wikicode][champs contenus]
Sous customer1/contents, les champs ou "espaces de données" sont organisés en paquets d'enregistrements. D'autres modèles sont possibles.
<?xml version="1.0" encoding="UTF-8"?>
<!-- content dataChunk model -->
<crop id="" number="" scope="" links="">
<topic/>
<assert>
<!-- HERE COMES FRONT END CODE -->
</assert>
<!-- Content records -->
<fields>
<field id="" number="" subject="">
<topic/>
<assert/>
<content></content>
</field>
</fields>
</crop>
Distribués ou non, les paquets s'accèdent par du service pour ne pas dépendre d'un développement purement métier.
On peut opérer la distinction service / métier, en disant que le service est moins spécialisé.
La méthode d'accession aux données sera par exemple un :
- getCropById ou byScope (prendreChampParId ou parEtendue)
- getFieldNearSubject (prendreDonnéePrèsDuSujet)
L'id permettant une extraction directe de contenu.
[champs utilisateurs]
Même logique de service :
<?xml version="1.0" encoding="UTF-8"?>
<!-- users dataChunk model -->
<users id="" number="" links="">
<!-- u:usr / m:mod / a:adm -->
<user login="" pass="" lastname="" forname="" rights="u|m|a" />
</users>
Mêmes accès que pour le modèle précédent.
[Champs page.xml]
L'indexation des pages pointeront sur des données data ou layout
<?xml version="1.0" encoding="UTF-8"?>
<pages count="4">
<page number="1" id="standard" entry="data:1|1|rootEntry"/>
<page number="2" id="vaisseau" entry="data:1|2|information_2"/>
<page number="3" id="espace" entry="data:1|3|doorEntry"/>
<page number="4" id="admin" entry="data:1|1|Error"/>
<page number="6" id="potiron" entry="data:1|1|content" num="5"/>
<page number="7" id="er" entry="e"/>
<page number="8" id="terere" entry="re"/>
</pages>
[Champs templates]
<?xml version="1.0" encoding="UTF-8"?>
<!-- templateChunk model -->
<template id="standard" number="" topic="" links="">
<!-- HEADER CONTENT -->
<header>
<assert>
<![CDATA[
:: HERE COMES SERVER/CLIENT SIDE SNIPPETS ::
]]>
</assert>
<!-- -->
<content>
<![CDATA[
<html><head/>
]]>
</content>
</header>
<!-- HEADER CONTENT -->
<main>
<assert>
<![CDATA[
:: HERE COMES SERVER/CLIENT SIDE SNIPPETS ::
]]>
</assert>
<!-- -->
<content>
<![CDATA[
<body>
...
]]>
</content>
</main>
<!-- FOOTER CONTENT -->
<footer>
<assert>
<![CDATA[
:: HERE COMES SNIPPET ::
]]>
</assert>
<content>
<![CDATA[
</body></html>
]]>
</content>
</footer>
</template>
La version suivante a une complétion par points d'ancrages. Cette version va orienter le projet.
<?xml version="1.0" encoding="UTF-8"?>
<!-- templateChunk model -->
<template id="nested" number="" topic="" links="">
<!-- HEADER CONTENT -->
<header>
<assert>
<![CDATA[
:: HERE COMES SERVER/CLIENT SIDE SNIPPETS ::
]]>
</assert>
<!-- -->
<content>
<styles>
<style id="" />
<style id="christmas">
body
{
background-color:red;
font-family:verdana;
padding:10px;
}
.style_01
{
/* some style in */
}
</style>
</styles>
<scripts>
<script id="scr_1" number="1"/>
<script id="scr_2" number="2"/>
...
</scripts>
</content>
</header>
<!-- HEADER CONTENT -->
<main>
<assert>
<![CDATA[
:: HERE COMES SERVER/CLIENT SIDE SNIPPETS ::
]]>
</assert>
<!-- -->
<content>
<page id="standard">
<![CDATA[
<table width="100%" border="0">
<tr><td>
{{inc:page[header]}}
</td></tr>
<tr><td>
{{inc:page[main]}}
</td></tr>
</table>
]]>
</page>
<page id="lay_01"/>
<page id="lay_02"/>
<page id="lay_03"/>
</content>
</main>
<!-- PAGE CONTENT -->
<frameset>
<assert>
<code type="text/javascript" id="scr_01">
<![CDATA[
function lastScript()
{
return "this is last script";
}
]]>
</code>
<code type="action/php" id="act_01">
<![CDATA[
ContentCompleter::setContent(array("frameset.content[text/head]","header.content[*]"));
ContentCompleter::setContent(array("frameset.content[text/body]","main.content[*]"));
]]>
</code>
<code type="action/php" id="act_02">
<![CDATA[
ContentCompleter::setContent(array("frameset.assert.code[id:scr_01]","footer.content[text/id:inc_03]"));
]]>
</code>
<code type="text/php" id="toStringClass">
<![CDATA[
class toString
{//
public $self = array();
public function __construct( /* ... */ $init )
{
}
}
$tmp = new toString(1);
]]>
</code>
</assert>
<content><!-- -->
<![CDATA[
<?xml version="1.0" encoding="UTF-8" ?>
{{inc:token[strict]}}
<html>
<head>
<style>{{inc:style[christmas]}}</style>
<script>{{inc:script[topScript]}}</script>
</head>
<body onload="feedContent()">
{{inc:page[standard]}}
</body>
<script>
{{inc:script[endScript]}}
</script>
</html>
]]>
</content>
</frameset>
<!-- FOOTER CONTENT -->
<footer>
<assert>
<![CDATA[
:: HERE COMES SNIPPET ::
]]>
</assert>
<content>
<![CDATA[
{{inc:scripts[last]}}
<script>
action.load();
</script>
<script id="inc_03">
</script>
]]>
</content>
</footer>
<tokens>
<token id="HTML4">
<![CDATA[
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
]]>
</token>
<token id="xhtml_xmlns">
<![CDATA[
http://www.w3.org/1999/xhtml
]]>
</token>
</tokens>
</template>
L'autorisation de snippets php exécutables rendra possible l'intégration côté client (customer).
L'adjonction du contenu à l'output se faisant par injection aux points d'ancrage {{inc:nomDeCle[idDeCle]}} par la méthode servant à compléter le flux avant sa sortie, comme :
- getFeedByTagName ou getPartByName ...
- incomes(header/content) à l'injection
Le contenu peut être sorti côté php ou ajaxifié comme ici par le javascript de fin de flux (frameset/content) feedContent().