13.6.3.10 Doc::editattr()
Cette méthode permet d'ajouter les clefs correspondantes aux attributs du document pour la composition d'une vue de formulaire HTML spécifique de document.
13.6.3.10.1 Description
void editattr ( bool $withtd = true )
Cette méthode ajoute pour chaque attribut pouvant contenir une valeur :
- une clef contenant le champ de saisie de l'attribut pour le formulaire,
Pour tous les attributs pouvant contenir une valeur ainsi que les attributs encadrants :
- une clef pour le libellé de l'attribut.
La clef du champ de saisie est composée du préfixe V_
suivi de l'identifiant
de l'attribut en majuscule. Le champ de saisie est fourni par la méthode
DocFormFormat::getHtmlInput()
.
Si les attributs sont en visibilité H
ou R
, le champ de
saisie est un champ caché : <input type="hidden"/>
.
Si l'attribut est en visibilité I
, la clef pour le champ de saisie est vide.
La clef de libellé est composée du préfixe L_
suivi de l'identifiant de
l'attribut en majuscule. Le libellé est dépendant de la locale de
l'utilisateur. La valeur du libellé est fournie par la méthode
Doc::getLabel()
. Si l'attribut est obligatoire, le libellé est entouré des
balises <b>
et </b>
.
13.6.3.10.1.1 Avertissements
Les attributs de type tab
, frame
, menu
n'ont pas de clef
générée pour les champs de saisie.
Les rendus obtenus peuvent varier selon les différentes versions de Dynacase. Les noms des champs de saisie ("input name") restent stables.
13.6.3.10.2 Liste des paramètres
- (bool)
withtd
- Indique si les champs de saisie sont incorporés dans un tableau HTML.
Sitrue
, alors les balises</td><td>
sont insérés entre le champs de saisie et les boutons d'aide à la saisie. Sifalse
, les boutons d'aide à la saisie sont mis directement à la suite du champs de saisie.
13.6.3.10.3 Valeur de retour
void.
13.6.3.10.4 Erreurs / Exceptions
Aucune.
13.6.3.10.5 Historique
Aucun.
13.6.3.10.6 Exemples
13.6.3.10.6.1 Rendu en dehors d'un tableau.
Soit la famille MY_ANIMAL
qui possède les attributs suivants :
nom | type |
---|---|
AN_NOM | text |
AN_PHOTO | image |
AN_NAISSANCE | date |
Formulaire spécifique pour modifier le nom, la date de naissance et la photographie. Dans cet exemple, on affiche la photo en 200px.
Fichier de la classe associées à la famille :
namespace MyTest; class My_animal extends \Dcp\Family\Document { /** * @templateController edit original photo */ public function editPhoto() { $this->editAttr(false); $photoUrl=$this->getHtmlAttrValue("an_photo"); $this->lay->set("bigPhoto", $photoUrl); } }
Template editPhoto.html
:
<div class="myname"> <label for="an_nom">[L_AN_NOM]</label> : [V_AN_NOM] </div> <div class="birthday"> <img title="[L_AN_NAISSANCE]" src="[IMG:birthday.png|64]"/> : [V_AN_NAISSANCE] </div> <div class="photo"> <img class="big" src="[bigPhoto]&width=200" /><br/> [V_AN_PHOTO] </div>
Résultat :
<div class="myname"> <label for="an_nom"><B>nom</B></label> : <input onchange="document.isChanged=true" type="text" name="_an_nom" value="Théodor" id="an_nom" > </div> <div class="birthday"> <img title="date de naissance" src="resizeimg.php?img=Images%2Fbirthday.png&size=64"/> : <input readonly="readonly" size="10" autocomplete="off" onfocus="if (this.readOnly) $('#ic_an_naissance').trigger('mousedown').trigger('click')" onblur="control_date(event,this)" type="text" name="_an_naissance" value="10/08/2011" id="an_naissance" /><input type="button" onmousedown="Calendar_Init('an_naissance','ic_an_naissance',false,'%d/%m/%Y')" class="inlineButton" id="ic_an_naissance" value="…" /><input type="button" value="♦" id="id_an_naissance" title="Date manuelle" onmousedown="document.getElementById('an_naissance').disabled=false;document.getElementById('an_naissance').readOnly=false" onclick="focus_date(event,'an_naissance')" class="inlineButton" /><input id="ix_an_naissance" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_naissance'],'')"> </div> <div class="photo"> <img class="big" src="file/1420/42/an_photo/-1/250px-Alligator.jpg?cache=no&inline=no&width=200" /><br/> <span id="IFERRan_photo" class="Error"></span><span class="FREEDOMText"><a target="_self" href="file/1420/42/an_photo/-1/250px-Alligator.jpg?cache=no&inline=no" title="250px-Alligator.jpg"><img id="img_an_photo" style="vertical-align:bottom;border:none;width:30px" src="file/1420/42/an_photo/-1/250px-Alligator.jpg?cache=no&inline=yes&width=30"></a></span><br/><input name="_an_photo" type="hidden" value="image/jpeg; charset=binary|42|250px-Alligator.jpg" id="an_photo"><input type="hidden" value="image/jpeg; charset=binary|42|250px-Alligator.jpg" id="INIVan_photo"><span><input onchange="document.isChanged=true;changeFile(this,'an_photo','')" accept="image/*" size=15 type="file" id="IF_an_photo" name="_UPL_an_photo" ></span> <input id="ix_an_photo" type="button" style="vertical-align:baseline" class="inlineButton" value="×" title="Effacer le fichier" title1="Effacer le fichier" value1="×" title2="Annuler l'effacement du fichier" value2="−" onclick="clearFile(this,'an_photo')"> </div>
Rendu HTML en ajoutant le style suivant :
div.photo { border : 2px solid grey; width:300px; padding:10px; } div.myname { border : 2px solid grey; width:300px; padding:10px; border-style: solid solid none solid; } div.birthday { border-style: none solid none solid; padding: 10px; width: 300px; border-width: 2px; border-color: grey; } div.photo img.big { width:300px; } div.photo input[type="file"] { width: 270px; } div.photo input, div.myname input { height: 30px; } .birthday > img { vertical-align: middle; } .birthday input, div.myname input { vertical-align: middle; font-size:20px; } .birthday input[type=button] { width:30px; } #img_an_photo { display:none; }
13.6.3.10.6.2 Rendu dans un tableau
Cet exemple affiche les champs de saisie dans un tableau. Les boutons d'aides à la saisies sont alignés car ils sont dans des cellules séparées.
Soit la famille MY_ANIMAL
qui possède les attributs suivants :
nom | type |
---|---|
AN_NOM | text |
AN_ENTREE | date |
AN_NAISSANCE | date |
AN_GARDIEN | account |
AN_SEXE | enum |
AN_ESPECE | docid |
namespace MyTest; class My_animal extends \Dcp\Family\Document { /** * @templateController edit some data */ public function editData() { $this->editAttr(true); // affichage avec "</td><td>" } }
Template editData.html
:
<table class="myTable"> <tr> <td class="myLabel">[L_AN_NOM]</td><td class="myInput">[V_AN_NOM]</td> <td class="myLabel">[L_AN_NAISSANCE]</td><td class="myInput">[V_AN_NAISSANCE]</td> </tr> <tr> <td class="myLabel">[L_AN_ESPECE]</td><td class="myInput">[V_AN_ESPECE]</td> <td class="myLabel">[L_AN_SEXE]</td><td class="myInput">[V_AN_SEXE]</td> </tr> <tr> <td class="myLabel">[L_AN_GARDIEN]</td><td class="myInput">[V_AN_GARDIEN]</td> <td class="myLabel">[L_AN_ENTREE]</td><td class="myInput">[V_AN_ENTREE]</td> </tr> </table>
Résultat :
<table class="myTable"> <tr> <td class="myLabel"><B>nom</B></td><td class="myInput"><input onchange="document.isChanged=true" class="fullresize" type="text" name="_an_nom" value="Théodor" id="an_nom" > </td><td class="nowrap"></td> <td class="myLabel">date de naissance</td><td class="myInput"><input readonly="readonly" size="10" autocomplete="off" onfocus="if (this.readOnly) $('#ic_an_naissance').trigger('mousedown').trigger('click')" onblur="control_date(event,this)" type="text" name="_an_naissance" value="10/08/2011" id="an_naissance" /><input type="button" onmousedown="Calendar_Init('an_naissance','ic_an_naissance',false,'%d/%m/%Y')" class="inlineButton" id="ic_an_naissance" value="…" /><input type="button" value="♦" id="id_an_naissance" title="Date manuelle" onmousedown="document.getElementById('an_naissance').disabled=false;document.getElementById('an_naissance').readOnly=false" onclick="focus_date(event,'an_naissance')" class="inlineButton" /><input id="ix_an_naissance" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_naissance'],'')"></td><td class="nowrap"></td> </tr> <tr> <td class="myLabel"><B>espèce</B></td><td class="myInput"><input type="hidden" name="_an_espece" id="an_espece" value="1295"><input class="fullresize" autocomplete="off" autoinput="1" onfocus="activeAuto(event,1420,this,'','an_espece','')" onchange="addmdocs('_an_espece');document.isChanged=true" type="text" name="_ilink_an_espece" id="ilink_an_espece" value="Alligator"></td><td class="editbutton"><input id="ic_ilink_an_espece" type="button" class="inlineButton" value="…" title="choisir une valeur pour espèce" onclick="sendAutoChoice(event,1420,this,'ilink_an_espece','','an_espece','')"><input id="ix_an_espece" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_espece','ilink_an_espece'],'','an_espece' )"><input id="icr_an_espece" class="add-doc" type="button" value=" " titleedit="créer un document espèce" titleview="Modifier le document" onclick="editRelation('ZOO_ESPECE',elinkvalue('an_espece'),'an_espece','&es_nom='+elinkvalue('ilink_an_espece')+'')"></td> <td class="myLabel">sexe</td><td class="myInput"><span id="sp_an_sexe"><select name="_an_sexe" id="an_sexe" onchange="disableReadAttribute();" > <option selected value="M">Masculin</option> <option value="F">Féminin</option> <option value="H">Hermaphrodite</option> </select> </span> </td><td class="nowrap"></td> </tr> <tr> <td class="myLabel">gardien responsable</td><td class="myInput"><input type="hidden" name="_an_gardien" id="an_gardien" value=""><input class="fullresize" autocomplete="off" autoinput="1" onfocus="activeAuto(event,1420,this,'','an_gardien','')" onchange="addmdocs('_an_gardien');document.isChanged=true" type="text" name="_ilink_an_gardien" id="ilink_an_gardien" value=""></td><td class="editbutton"><input id="ic_ilink_an_gardien" type="button" class="inlineButton" value="…" title="choisir une valeur pour gardien responsable" onclick="sendAutoChoice(event,1420,this,'ilink_an_gardien','','an_gardien','')"><input id="ix_an_gardien" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_gardien','ilink_an_gardien'],'','an_gardien' )"></td> <td class="myLabel">date d'entrée</td><td class="myInput"><input readonly="readonly" size="10" autocomplete="off" onfocus="if (this.readOnly) $('#ic_an_entree').trigger('mousedown').trigger('click')" onblur="control_date(event,this)" type="text" name="_an_entree" value="" id="an_entree" /><input type="button" onmousedown="Calendar_Init('an_entree','ic_an_entree',false,'%d/%m/%Y')" class="inlineButton" id="ic_an_entree" value="…" /><input type="button" value="♦" id="id_an_entree" title="Date manuelle" onmousedown="document.getElementById('an_entree').disabled=false;document.getElementById('an_entree').readOnly=false" onclick="focus_date(event,'an_entree')" class="inlineButton" /><input id="ix_an_entree" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_entree'],'')"></td><td class="nowrap"></td> </tr> </table>
Rendu HTML en ajoutant le style suivant :
.myLabel { background-color:#F2FF5F; } .myLabel:first-letter { text-transform:capitalize; } .myinput { background-color:white; } .myinput + td { background-color:white; } .myTable { border-collapse: separate; border-spacing: 10px; border: solid 1px grey; } .document table.myTable input[type=button] { width:20px; height:20px; font-size: 15px; }
13.6.3.10.6.3 Variante Rendu dans un tableau
Le contrôleur est identique au précédent exemple. Cette variante permet d'illustrer comment prendre en compte les champs de saisie dans un tableau personnalisé.
Dans cet exemple, les libellés des attributs sont placés dans des rangées au dessus des champs de saisies.
Template editData.html
:
<table class="myLabelUp"> <tr> <td colspan="2" class="myLabel"><div class="myLabel">[L_AN_NOM]</div></td> <td colspan="2" class="myLabel"><div class="myLabel">[L_AN_NAISSANCE]</div></td> </tr> <tr> <td class="myInput">[V_AN_NOM]</td> <td class="myInput">[V_AN_NAISSANCE]</td> </tr> <tr> <td colspan="2" class="myLabel"><div class="myLabel">[L_AN_ESPECE]</div></td> <td colspan="2" class="myLabel"><div class="myLabel">[L_AN_SEXE]</div></td> </tr> <tr> <td class="myInput">[V_AN_ESPECE]</td> <td class="myInput">[V_AN_SEXE]</td> </tr> <tr> <td colspan="2" class="myLabel"><div class="myLabel">[L_AN_GARDIEN]</div></td> <td colspan="2" class="myLabel"><div class="myLabel">[L_AN_ENTREE]</div></td> </tr> <tr> <td class="myInput">[V_AN_GARDIEN]</td> <td class="myInput">[V_AN_ENTREE]</td> </tr> </table>
On notera dans ce template, l'utilisation du colspan
dans les libellés pour
prendre en compte les balises </td><td>
ajoutées par les clefs de champs de
saisies.
Résultat :
<table class="myLabelUp"> <tr> <td colspan="2" class="myLabel"><div class="myLabel"><B>nom</B></div></td> <td colspan="2" class="myLabel"><div class="myLabel">date de naissance</div></td> </tr> <tr> <td class="myInput"><input onchange="document.isChanged=true" class="fullresize" type="text" name="_an_nom" value="Théodor" id="an_nom" > </td><td class="nowrap"></td> <td class="myInput"><input readonly="readonly" size="10" autocomplete="off" onfocus="if (this.readOnly) $('#ic_an_naissance').trigger('mousedown').trigger('click')" onblur="control_date(event,this)" type="text" name="_an_naissance" value="10/08/2011" id="an_naissance" /><input type="button" onmousedown="Calendar_Init('an_naissance','ic_an_naissance',false,'%d/%m/%Y')" class="inlineButton" id="ic_an_naissance" value="…" /><input type="button" value="♦" id="id_an_naissance" title="Date manuelle" onmousedown="document.getElementById('an_naissance').disabled=false;document.getElementById('an_naissance').readOnly=false" onclick="focus_date(event,'an_naissance')" class="inlineButton" /><input id="ix_an_naissance" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_naissance'],'')"></td><td class="nowrap"></td> </tr> <tr> <td colspan="2" class="myLabel"><div class="myLabel"><B>espèce</B></div></td> <td colspan="2" class="myLabel"><div class="myLabel">sexe</div></td> </tr> <tr> <td class="myInput"><input type="hidden" name="_an_espece" id="an_espece" value="1295"><input class="fullresize" autocomplete="off" autoinput="1" onfocus="activeAuto(event,1420,this,'','an_espece','')" onchange="addmdocs('_an_espece');document.isChanged=true" type="text" name="_ilink_an_espece" id="ilink_an_espece" value="Alligator"></td><td class="editbutton"><input id="ic_ilink_an_espece" type="button" class="inlineButton" value="…" title="choisir une valeur pour espèce" onclick="sendAutoChoice(event,1420,this,'ilink_an_espece','','an_espece','')"><input id="ix_an_espece" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_espece','ilink_an_espece'],'','an_espece' )"><input id="icr_an_espece" class="add-doc" type="button" value=" " titleedit="créer un document espèce" titleview="Modifier le document" onclick="editRelation('ZOO_ESPECE',elinkvalue('an_espece'),'an_espece','&es_nom='+elinkvalue('ilink_an_espece')+'')"></td> <td class="myInput"><span id="sp_an_sexe"><select name="_an_sexe" id="an_sexe" onchange="disableReadAttribute();" > <option selected value="M">Masculin</option> <option value="F">Féminin</option> <option value="H">Hermaphrodite</option> </select> </span> </td><td class="nowrap"></td> </tr> <tr> <td colspan="2" class="myLabel"><div class="myLabel">gardien responsable</div></td> <td colspan="2" class="myLabel"><div class="myLabel">date d'entrée</div></td> </tr> <tr> <td class="myInput"><input type="hidden" name="_an_gardien" id="an_gardien" value=""><input class="fullresize" autocomplete="off" autoinput="1" onfocus="activeAuto(event,1420,this,'','an_gardien','')" onchange="addmdocs('_an_gardien');document.isChanged=true" type="text" name="_ilink_an_gardien" id="ilink_an_gardien" value=""></td><td class="editbutton"><input id="ic_ilink_an_gardien" type="button" class="inlineButton" value="…" title="choisir une valeur pour gardien responsable" onclick="sendAutoChoice(event,1420,this,'ilink_an_gardien','','an_gardien','')"><input id="ix_an_gardien" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_gardien','ilink_an_gardien'],'','an_gardien' )"></td> <td class="myInput"><input readonly="readonly" size="10" autocomplete="off" onfocus="if (this.readOnly) $('#ic_an_entree').trigger('mousedown').trigger('click')" onblur="control_date(event,this)" type="text" name="_an_entree" value="" id="an_entree" /><input type="button" onmousedown="Calendar_Init('an_entree','ic_an_entree',false,'%d/%m/%Y')" class="inlineButton" id="ic_an_entree" value="…" /><input type="button" value="♦" id="id_an_entree" title="Date manuelle" onmousedown="document.getElementById('an_entree').disabled=false;document.getElementById('an_entree').readOnly=false" onclick="focus_date(event,'an_entree')" class="inlineButton" /><input id="ix_an_entree" type="button" class="inlineButton" value="×" title="effacer entrée(s)" onclick="clearInputs(['an_entree'],'')"></td><td class="nowrap"></td> </tr> </table>
Rendu HTML en ajoutant le style suivant :
.myLabel { background-color:#F2FF5F; } .myLabel:first-letter { text-transform:capitalize; } .myinput { background-color:white; } .myinput + td { background-color:white; } .myLabelUp { border-collapse: collapse; border-spacing: initial; } .myLabelUp td { vertical-align:bottom; } .myLabelUp td.myInput { width:300px; border-style: none none solid solid; border-width: 1px; border-color: grey; margin : 4px; } .myLabelUp td.myLabel { width:300px; border-style: solid solid none solid; border-width: 1px; border-color: grey; margin : 4px; } .myLabelUp td.myInput + td { border-style: none solid solid none; border-width: 1px; border-color: grey; margin : 4px; } .myLabelUp .myLabel { background-color:#F2FF5F; padding: 3px; }
13.6.3.10.7 Notes
Aucune.