Formulaires pour Copix
Cette page présente les spécifications pour le futur CopixForms. C'est en cours de rédaction.
Objectifs de CopixForms
- possiblité de choisir la source de donnée pour l'initialisation du formulaire ou la sauvegarde de son contenu. Ça pourrait être un/des DAOS, un fichier texte, envoi de mail, un service web...
- déscription du formulaire dans un fichier xml pour en faciliter son developpement
- validation automatique des données saisies (génération de code JS pour les formulaires HTML par exemple, une seule méthode check() pour vérifier la validité coté serveur...)
- possiblité de générer le formulaire sous divers format : XForms, HTML, XUL ou autre...
- plugin smarty spécifique pour intégrer facilement le formulaire dans les templates, sans limitation au niveau structure.
Introduction
Voici une autre proposition de fonctionnement, dont les principes diffèrent principalement sur l'endroit ou déclarer le formulaire (non pas dans un fichier XML, mais dans le template directement).
Dans le template
Je reprends le même exemple que dans la proposition 1.
{copixform type="start" valueObject=$toEdit dest="news|admin|valid"}
{* Ce champ représente la clef primaire de l'élément *}
{copixFormInput dao="news" property="id_news" showLabel=true visible=false}
<table>
<tr>
<td>
{* Ce champ représente un libellé, en provenance d'une DAO. Les règles déclarées dans la dao sont automatiquement appliquées (requis ou non, maxlength, ...) *}
{copixFormInput dao="news" property="title_news"}
</td>
</tr>
<tr>
<td>
{* Ce champ représente un lien sur la clef étrangère *}
{copixFormInput dao="news" property="id_news" comboCaptions="caption_newc;date_newc"}
</td>
</tr>
<tr>
<td>
{* Ce champ représente une valeure sélectionnable depuis une liste de constantes (pour l'exemple) *}
{copixFormInput dao="news" property="type_news" comboValues=$values}
ou
{copixFormInput dao="news" property="type_news" comboValues="[Key=>Value][Key=>Value][key=>Value]"}
ou
{copixFormInput dao="news" property="type_news" comboValues="[Value][Value][Value]"}
</td>
</tr>
<tr>
<td>
{* Ce champ est tout neuf et ne corresponds à aucune DAO *}
{copixFormInput name="confirm" captioni18n="confirm.title.news" regexp="" maxlength=""}
</td>
</tr>
</table>
{copixForm type="end"}
Dans l'ActionGroup
Dans l'ActionGroup, cela poeut donner qqchose comme :
/**
* Préparation de l'élément à modifier
* @param : id_news l'identifiant de la nouvelle à modifier
*/
function doPrepareEdit (){
//Récupération de la nouvelle
$dao = CopixDAOFactory::create ('news');
$newsRecord = $dao->get ($this->getRequest ('id_news'));
//Création d'un identifiant de formulaire(pour pouvoir éditer plusieurs éléments en même temps)
$id = CopixForm::createElement ();
CopixForm::assignElement ($newsRecord);
return new CopixActionReturn (COPIX_AR_REDIRECT, CopixUrl::get ('news|admin|edit', array ('copixFormId'=>$id)));
}
/**
* Page qui affiche le formulaire de modification
* @param CopixFormId l'identifiant de formulaire que l'on souhaite afficher
*/
function getEdit (){
if (($id = $this->getRequest ('CopixFormId')) === null){
retour vers doCreate.
}
$tpl = new CopixTpl ();
$tpl->assign ('MAIN', CopixZone::process ('genericTools|CopixForm', array ('toEdit'=>CopixForm::getFormObject ($id))));
return new CopixActionReturn (COPIX_AR_DISPLAY, $tpl);
}
/**
* Demande de création d'un élément pour un nouveau formulaire
*/
function doCreate (){
//Création d'un identifiant de formulaire(pour pouvoir éditer plusieurs éléments en même temps)
$id = CopixForm::createElement ();
CopixForm::assignElement ($newsRecord);//on pourais considérer que si aucun ID passé en paramètre, alors on utilise le dernier id créée
return new CopixActionReturn (COPIX_AR_REDIRECT, CopixUrl::get ('news|admin|edit', array ('copixFormId'=>$id)));
}
/**
* Validation des données du formulaire
* @param CopixFormId l'identifiant du formulaire
* @param l'ensemble des informations du formulaire que l'on souhaite valider
*/
function doValid (){
if (($formCheckingResult = CopixForm::validForm ($this->vars)) !== true){
return $this->process ('getEdit', array ('checkResult'=>$formCheckingResult));
}
//Ok, tout c'est bien passé, on peut passer à la suite, par exemple travailler sur le record obtenu
$newsRecord = & CopixForm::getRecord ('news');
$newsRecord->markStatus ('date');
//...
}
Compléments divers
- L'implémentation des balises utilise CopixHtmlHeader:: pour placer les contrôles javascript
- Pourquoi ne pas tout de même avoir des form.xml pour déclarer des types de formulaire tout fait, avec la possibilité dans les {copixFormInput} les référencer.
Q: Comment faire pour éditer deux élément en même temps ? R: CopixForm utilise un identifiant de formulaire en interne (celui référencé par CopixFormId dans les exemples). Chanque formulaire d'édition est donc indépendant et utilisable en simultané.
Q: Je veux ré-utiliser mon formulaire dans un autre contexte R: Je propose de conserver l'utilisation de Concept 1 des "form.xml", et donc de pouvoir référencer les formulaires XMLisés dans les templates. Ce que je propose finalement, c'est un système "rapide" pour les formulaires "simples". (donc ne pas avoir comme obligation la rédaction d'un form.xml)
Q: Et si j'ai plusieurs DAO ? R: Pas gênant en soit. Il suffit de mettre les inputs pour plusieurs DAO.
Q: j'ai des règles complexes de validation supplémentaires, comment faire ? R: je n'ai pas mis d'exemple dessu, mais je pense que nous pourions envisager des "formValidator" supplémentaires. Toutefois, le recours à ce genre de manipulation nécessitera la déclaration d'un "form.xml"

