Overview
Comment:La configuration du mot de passe doit être minimale, car c'est un champ un peu dunmaique selon le contexte, ça serait donc trop compliqué
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: f1290c6e522eb72b93e9bb0e904505604e519b2c
User & Date: bohwaz on 2013-01-18 14:05:55
Other Links: manifest | tags
Context
2013-01-18
14:27
Gestion des champs privés et non modifiables en mode utilisateur check-in: a83adc021d user: bohwaz tags: trunk
14:05
La configuration du mot de passe doit être minimale, car c'est un champ un peu dunmaique selon le contexte, ça serait donc trop compliqué check-in: f1290c6e52 user: bohwaz tags: trunk
13:31
Garder l'ancien comportement pour le moment check-in: 03c6e31ed5 user: bohwaz tags: trunk
Changes

Modified include/class.champs_membres.php from [6205058156] to [8d723ee771].

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
                    {
                        unset($value[$option_key]);
                    }
                }
            }
        }

        if (empty($config['title']))
        {
            throw new UserException('Champ "'.$name.'" : Le titre est obligatoire.');
        }

        if (empty($config['type']) || !array_key_exists($config['type'], $this->types))
        {
            throw new UserException('Champ "'.$name.'" : Le type est vide ou non valide.');







|







173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
                    {
                        unset($value[$option_key]);
                    }
                }
            }
        }

        if (empty($config['title']) && $name != 'passe')
        {
            throw new UserException('Champ "'.$name.'" : Le titre est obligatoire.');
        }

        if (empty($config['type']) || !array_key_exists($config['type'], $this->types))
        {
            throw new UserException('Champ "'.$name.'" : Le type est vide ou non valide.');
297
298
299
300
301
302
303



304




305
306
307
308
309
310



311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326




327



328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350

351
352
353
354
355
356
357
358
359
360
361
    	$config = Config::getInstance();

    	// Champs à créer
    	$create = array(
    		'id INTEGER PRIMARY KEY, -- Numéro attribué automatiquement',
    		'id_categorie INTEGER NOT NULL, -- Numéro de catégorie',
            'date_connexion TEXT NULL, -- Date de dernière connexion',



    	);





    	// Champs à recopier
    	$copy = array(
    		'id',
    		'id_categorie',
            'date_connexion'



    	);

        $anciens_champs = $config->get('champs_membres');
    	$anciens_champs = is_null($anciens_champs) ? $this->champs : $anciens_champs->getAll();

    	foreach ($this->champs as $key=>$cfg)
    	{
    		if ($cfg['type'] == 'number')
    			$type = 'FLOAT';
    		elseif ($cfg['type'] == 'multiple' || $cfg['type'] == 'checkbox')
    			$type = 'INTEGER';
    		elseif ($cfg['type'] == 'file')
    			$type = 'BLOB';
    		else
    			$type = 'TEXT';





    		$create[] = $key . ' ' . $type . ' ' . ', -- ' . str_replace(array("\n", "\r"), '', $cfg['title']);




    		if (array_key_exists($key, $anciens_champs))
    		{
    			$copy[] = $key;
    		}
    	}

    	$last = count($create) - 1;
    	$create[$last] = str_replace(',', '', $create[$last]);

    	$create = 'CREATE TABLE membres_tmp (' . "\n\t" . implode("\n\t", $create) . "\n);";
    	$copy = 'INSERT INTO membres_tmp (' . implode(', ', $copy) . ') SELECT ' . implode(', ', $copy) . ' FROM membres;';

    	$db->exec('PRAGMA foreign_keys = OFF;');
    	$db->exec('BEGIN;');
    	$db->exec($create);
    	
    	if ($copy) {
    		$db->exec($copy);
    	}
    	
    	$db->exec('DROP TABLE membres;');
    	$db->exec('ALTER TABLE membres_tmp RENAME TO membres;');

    	$db->exec('END;');
    	$db->exec('PRAGMA foreign_keys = ON;');

    	$config->set('champs_membres', $this);
    	$config->save();

    	return true;
    }
}

?>







>
>
>

>
>
>
>





|
>
>
>
















>
>
>
>
|
>
>
>







|
<














>











297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352

353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
    	$config = Config::getInstance();

    	// Champs à créer
    	$create = array(
    		'id INTEGER PRIMARY KEY, -- Numéro attribué automatiquement',
    		'id_categorie INTEGER NOT NULL, -- Numéro de catégorie',
            'date_connexion TEXT NULL, -- Date de dernière connexion',
            'date_inscription TEXT NULL, -- Date d\'inscription',
            'date_cotisation TEXT NULL, -- Date de cotisation',
            //'exemption_transaction INTEGER NOT NULL DEFAULT 0, -- Exempté de transaction obligatoire',
    	);

        $create_keys = array(
            'FOREIGN KEY (id_categorie) REFERENCES membres_categories (id)'
        );

    	// Champs à recopier
    	$copy = array(
    		'id',
    		'id_categorie',
            'date_connexion',
            'date_inscription',
            'date_cotisation',
            //'exemption_transaction',
    	);

        $anciens_champs = $config->get('champs_membres');
    	$anciens_champs = is_null($anciens_champs) ? $this->champs : $anciens_champs->getAll();

    	foreach ($this->champs as $key=>$cfg)
    	{
    		if ($cfg['type'] == 'number')
    			$type = 'FLOAT';
    		elseif ($cfg['type'] == 'multiple' || $cfg['type'] == 'checkbox')
    			$type = 'INTEGER';
    		elseif ($cfg['type'] == 'file')
    			$type = 'BLOB';
    		else
    			$type = 'TEXT';

    		$line = $key . ' ' . $type . ' ' . ',';

            if (!empty($cfg['title']))
            {
                $line .= '-- ' . str_replace(array("\n", "\r"), '', $cfg['title']);
            }

            $create[] = $line;

    		if (array_key_exists($key, $anciens_champs))
    		{
    			$copy[] = $key;
    		}
    	}

    	$create = array_merge($create, $create_keys);


    	$create = 'CREATE TABLE membres_tmp (' . "\n\t" . implode("\n\t", $create) . "\n);";
    	$copy = 'INSERT INTO membres_tmp (' . implode(', ', $copy) . ') SELECT ' . implode(', ', $copy) . ' FROM membres;';

    	$db->exec('PRAGMA foreign_keys = OFF;');
    	$db->exec('BEGIN;');
    	$db->exec($create);
    	
    	if ($copy) {
    		$db->exec($copy);
    	}
    	
    	$db->exec('DROP TABLE membres;');
    	$db->exec('ALTER TABLE membres_tmp RENAME TO membres;');
        $db->exec('CREATE INDEX membres_id_categorie ON membres (id_categorie);'); // Index
    	$db->exec('END;');
    	$db->exec('PRAGMA foreign_keys = ON;');

    	$config->set('champs_membres', $this);
    	$config->save();

    	return true;
    }
}

?>

Modified include/data/champs_membres.ini from [2a8de6fd6b] to [6b80d17df1].

41
42
43
44
45
46
47

48
49
50
51
52
53
54


55
56
57
58
59
60
61
62
63
type = text
title = "Nom & prénom"
mandatory = true
install = true
editable = true

[email]

type = email
title = "Adresse E-Mail"
mandatory = true
install = true
editable = true

[passe]


type = password
title = "Mot de passe"
mandatory = true
install = true
editable = true

[adresse]
type = textarea
title = "Adresse postale"







>







>
>

<







41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
type = text
title = "Nom & prénom"
mandatory = true
install = true
editable = true

[email]
; ce champ est obligatoirement présent et de type 'email'
type = email
title = "Adresse E-Mail"
mandatory = true
install = true
editable = true

[passe]
; ce champ est obligatoirement présent et de type 'password'
; le titre ne peut être modifié
type = password

mandatory = true
install = true
editable = true

[adresse]
type = textarea
title = "Adresse postale"

Modified include/data/schema.sql from [01ca919fb3] to [97f6a904bb].

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

74
75
76


77
78
79
80
81
82
83
84
85
86


87
88
89
90
91
92
93

CREATE TABLE membres_categories
-- Catégories de membres
(
    id INTEGER PRIMARY KEY,
    nom TEXT,
    description TEXT,
    montant_cotisation REAL,
    duree_cotisation INTEGER DEFAULT 12, -- En mois
    droit_wiki INT DEFAULT 1,
    droit_membres INT DEFAULT 1,
    droit_compta INT DEFAULT 1,
    droit_inscription INT DEFAULT 0,
    droit_connexion INT DEFAULT 1,
    droit_config INT DEFAULT 0,
    cacher INT DEFAULT 0
);


-- Membres de l'asso
CREATE TABLE membres (
    id INTEGER PRIMARY KEY,
    id_categorie INTEGER NOT NULL,

    -- Connexion
    passe TEXT,

    -- Données personnelles
    nom TEXT,
    email TEXT,

    adresse TEXT,
    code_postal INTEGER,
    ville TEXT,
    pays TEXT,
    telephone TEXT,
    date_naissance TEXT,

    -- Pour le bordel
    notes TEXT,

    lettre_infos INTEGER DEFAULT 0,

    date_inscription TEXT DEFAULT CURRENT_DATE,
    date_connexion TEXT,

    -- Dernière cotisation enregistrée
    date_cotisation TEXT,

    FOREIGN KEY (id_categorie) REFERENCES membres_categories (id)
);

CREATE INDEX membres_id_categorie ON membres (id_categorie);

-- Paiements possibles
CREATE TABLE types_transactions
(
    id INTEGER PRIMARY KEY,
    id_categorie_compta INTEGER NULL, -- NULL si le type n'est pas associé automatiquement à la compta

    titre TEXT NOT NULL,
    description TEXT NOT NULL,
    montant REAL NOT NULL,

    duree INTEGER NULL,
    debut TEXT NULL,
    fin TEXT NULL,



    FOREIGN KEY (id_categorie_compta) REFERENCES compta_categories (id)
);

-- Paiements enregistrés
CREATE TABLE membres_transactions
(
    id_membre INTEGER NOT NULL,
    id_transaction INTEGER NOT NULL,
    id_operation INTEGER NULL,



    date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
    montant REAL NOT NULL,

    FOREIGN KEY (id_membre) REFERENCES membres (id),
    FOREIGN KEY (id_transaction) REFERENCES transactions (id),
    FOREIGN KEY (id_operation) REFERENCES compta_journal (id)







|
<






|
<

|
<
<
<
<

<
<
|
<
<
<
|
<
<
<
<
<
<

<
<

<
|
<
<
|
<
<

<
<
<
<
<

|




|


>



>
>










>
>







11
12
13
14
15
16
17
18

19
20
21
22
23
24
25

26
27




28


29



30






31


32

33


34


35





36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

CREATE TABLE membres_categories
-- Catégories de membres
(
    id INTEGER PRIMARY KEY,
    nom TEXT,
    description TEXT,


    droit_wiki INT DEFAULT 1,
    droit_membres INT DEFAULT 1,
    droit_compta INT DEFAULT 1,
    droit_inscription INT DEFAULT 0,
    droit_connexion INT DEFAULT 1,
    droit_config INT DEFAULT 0,
    cacher INT DEFAULT 0,


    id_transaction_obligatoire INTEGER NULL,







    FOREIGN KEY (id_transaction_obligatoire) REFERENCES transactions (id)



);











-- Membres de l'asso


-- Voir class.champs_membres.php








-- Paiements possibles
CREATE TABLE transactions
(
    id INTEGER PRIMARY KEY,
    id_categorie_compta INTEGER NULL, -- NULL si le type n'est pas associé automatiquement à la compta

    intitule TEXT NOT NULL,
    description TEXT NOT NULL,
    montant REAL NOT NULL,

    duree INTEGER NULL,
    debut TEXT NULL,
    fin TEXT NULL,

    rappel_expiration INTEGER NULL DEFAULT 0, -- 1 si envoi de rappel avant expiration

    FOREIGN KEY (id_categorie_compta) REFERENCES compta_categories (id)
);

-- Paiements enregistrés
CREATE TABLE membres_transactions
(
    id_membre INTEGER NOT NULL,
    id_transaction INTEGER NOT NULL,
    id_operation INTEGER NULL,

    libelle TEXT NULL,

    date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
    montant REAL NOT NULL,

    FOREIGN KEY (id_membre) REFERENCES membres (id),
    FOREIGN KEY (id_transaction) REFERENCES transactions (id),
    FOREIGN KEY (id_operation) REFERENCES compta_journal (id)

Modified include/lib.template.php from [d93f2441d6] to [648ab66dd3].

458
459
460
461
462
463
464



465
466
467
468
469
470
471
    {
        $out .= '
    <dd>' . $field . '</dd>';
    }

    return $out;
}




$tpl->register_function('csrf_field', 'Garradin\tpl_csrf_field');
$tpl->register_function('form_field', 'Garradin\tpl_form_field');
$tpl->register_function('select_compte', 'Garradin\tpl_select_compte');

$tpl->register_function('format_droits', 'Garradin\tpl_format_droits');








>
>
>







458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
    {
        $out .= '
    <dd>' . $field . '</dd>';
    }

    return $out;
}

$tpl->register_compiler('continue', function() { return 'continue;'; });
//$tpl->register_modifier('va_', function() { return 'continue;'; });

$tpl->register_function('csrf_field', 'Garradin\tpl_csrf_field');
$tpl->register_function('form_field', 'Garradin\tpl_form_field');
$tpl->register_function('select_compte', 'Garradin\tpl_select_compte');

$tpl->register_function('format_droits', 'Garradin\tpl_format_droits');

Modified templates/admin/config/membres.tpl from [25243cba6e] to [0a30b6cfc5].

23
24
25
26
27
28
29

30
31
32
33
34
35
36
37
38
39
40
41
42

















43
44
45
46
47
48
49
{/if}

{if $review}
    <fieldset>
        <legend>Fiche membre exemple</legend>
        <dl>
            {foreach from=$champs item="champ" key="nom"}

                {html_champ_membre config=$champ name=$nom disabled=true}
                {if empty($champ.editable) || !empty($champ.private)}
                <dd>
                    {if !empty($champ.private)}
                        (Champ privé)
                    {elseif empty($champ.editable)}
                        (Non-modifiable par les membres)
                    {/if}
                </dd>
                {/if}
            {/foreach}
        </dl>
    </fieldset>


















    <form method="post" action="{$admin_url}config/membres.php">
        <p class="submit">
            {csrf_field key="config_membres"}
            <input type="submit" name="back" value="&larr; Retour à l'édition" class="minor" />
            <input type="submit" name="reset" value="Annuler les changements" class="minor" />
            <input type="submit" name="save" value="Enregistrer &rarr;" />







>













>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
{/if}

{if $review}
    <fieldset>
        <legend>Fiche membre exemple</legend>
        <dl>
            {foreach from=$champs item="champ" key="nom"}
                {if $nom == 'passe'}{continue}{/if}
                {html_champ_membre config=$champ name=$nom disabled=true}
                {if empty($champ.editable) || !empty($champ.private)}
                <dd>
                    {if !empty($champ.private)}
                        (Champ privé)
                    {elseif empty($champ.editable)}
                        (Non-modifiable par les membres)
                    {/if}
                </dd>
                {/if}
            {/foreach}
        </dl>
    </fieldset>

    <fieldset id="f_passe">
        <legend>Mot de passe</legend>
        <dl>
            <dt><label for="f_passe">Mot de passe</label>{if !empty($champs.passe.mandatory)} <b title="(Champ obligatoire)">obligatoire</b>{/if}</dt>
            <dd><input type="password" id="f_passe" disabled="disabled" /></dd>
            {if empty($champs.passe.editable) || !empty($champs.passe.private)}
            <dd>
                {if !empty($champs.passe.private)}
                    (Champ privé)
                {elseif empty($champs.passe.editable)}
                    (Non-modifiable par les membres)
                {/if}
            </dd>
            {/if}
        </dl>
    </fieldset>

    <form method="post" action="{$admin_url}config/membres.php">
        <p class="submit">
            {csrf_field key="config_membres"}
            <input type="submit" name="back" value="&larr; Retour à l'édition" class="minor" />
            <input type="submit" name="reset" value="Annuler les changements" class="minor" />
            <input type="submit" name="save" value="Enregistrer &rarr;" />
102
103
104
105
106
107
108

109
110
111
112
113
114
115
            </dd>
        </dl>
        <p><input type="submit" name="add" value="Ajouter ce champ à la fiche membre" /></p>
    </fieldset>

    <div id="orderFields">
        {foreach from=$champs item="champ" key="nom"}

        <fieldset id="f_{$nom|escape}">
            <legend>{$nom|escape}</legend>
            <dl>
                <dt><label>Type</label></dt>
                <dd>{$champ.type|get_type}</dd>
                <dt><label for="f_{$nom|escape}_title">Titre</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
                <dd><input type="text" name="champs[{$nom|escape}][title]" id="f_{$nom|escape}_title" value="{form_field data=$champs[$nom] name=title}" size="60" /></dd>







>







120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
            </dd>
        </dl>
        <p><input type="submit" name="add" value="Ajouter ce champ à la fiche membre" /></p>
    </fieldset>

    <div id="orderFields">
        {foreach from=$champs item="champ" key="nom"}
        {if $nom == 'passe'}{continue}{/if}
        <fieldset id="f_{$nom|escape}">
            <legend>{$nom|escape}</legend>
            <dl>
                <dt><label>Type</label></dt>
                <dd>{$champ.type|get_type}</dd>
                <dt><label for="f_{$nom|escape}_title">Titre</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
                <dd><input type="text" name="champs[{$nom|escape}][title]" id="f_{$nom|escape}_title" value="{form_field data=$champs[$nom] name=title}" size="60" /></dd>
141
142
143
144
145
146
147












148
149
150
151
152
153
154
                        <dd>{if $champ.type == 'multiple'}{math a=$more equation="a+1"}. {/if}<input type="text" name="champs[{$nom|escape}][options][{$more|escape}]" value="" size="50" /></dd>
                    {/if}
                {/if}
            </dl>
        </fieldset>
        {/foreach}
    </div>













    <p class="submit">
        {csrf_field key="config_membres"}
        <input type="submit" name="reset" value="Annuler les changements" class="minor" />
        <input type="submit" name="review" value="Enregistrer &rarr;" />
        (un récapitulatif sera présenté et une confirmation sera demandée)
    </p>







>
>
>
>
>
>
>
>
>
>
>
>







160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
                        <dd>{if $champ.type == 'multiple'}{math a=$more equation="a+1"}. {/if}<input type="text" name="champs[{$nom|escape}][options][{$more|escape}]" value="" size="50" /></dd>
                    {/if}
                {/if}
            </dl>
        </fieldset>
        {/foreach}
    </div>

    <fieldset id="f_passe">
        <legend>Mot de passe</legend>
        <dl>
            <dt><label><input type="checkbox" name="champs[passe][editable]" value="1" {form_field data=$champs.passe name=editable checked="1"} /> Modifiable par les membres</label></dt>
            <dd class="help">Si coché, les membres pourront changer cette information depuis leur espace personnel.</dd>
            <dt><label><input type="checkbox" name="champs[passe][mandatory]" value="1" {form_field data=$champs.passe name=mandatory checked="1"} /> Champ obligatoire</label></dt>
            <dd class="help">Si coché, ce champ ne pourra rester vide.</dd>
            <dt><label><input type="checkbox" name="champs[passe][private]" value="1" {form_field data=$champs.passe name=private checked="1"} /> Champ privé</label></dt>
            <dd class="help">Si coché, ce champ ne sera visible et modifiable que par les personnes pouvant gérer les membres, mais pas les membres eux-même.</dd>
        </dl>
    </fieldset>

    <p class="submit">
        {csrf_field key="config_membres"}
        <input type="submit" name="reset" value="Annuler les changements" class="minor" />
        <input type="submit" name="review" value="Enregistrer &rarr;" />
        (un récapitulatif sera présenté et une confirmation sera demandée)
    </p>

Modified templates/admin/mes_infos.tpl from [9e2c8a3fd2] to [4d73b31814].

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
            {if empty($champ.private) && $nom != 'passe'}
                {html_champ_membre config=$champ name=$nom data=$membre}
            {/if}
            {/foreach}
        </dl>
    </fieldset>

    {if array_key_exists('passe', $champs)}
    <fieldset>
        <legend>Changer mon mot de passe</legend>
        {if empty($champs.passe.editable)}
            <p class="help">Vous devez contacter un administrateur pour changer votre mot de passe.</p>
        {else}
            <dl>
                <dd>Vous avez déjà un mot de passe, ne remplissez pas les champs suivants si vous ne souhaitez pas les changer.</dd>
                <dt><label for="f_passe">Nouveau mot de passe</label></dt>
                <dd class="help">
                    Pas d'idée ? Voici une suggestion choisie au hasard :
                    <tt title="Cliquer pour utiliser cette suggestion comme mot de passe" onclick="fillPassword(this);">{$passphrase|escape}</tt>
                </dd>
                <dd><input type="password" name="passe" id="f_passe" value="{form_field name=passe}" /></dd>
                <dt><label for="f_repasse">Encore le mot de passe</label> (vérification)</dt>
                <dd><input type="password" name="repasse" id="f_repasse" value="{form_field name=repasse}" /></dd>
            </dl>
        {/if}
    </fieldset>
    {/if}

    <p class="submit">
        {csrf_field key="edit_me"}
        <input type="submit" name="save" value="Enregistrer &rarr;" />
    </p>

</form>







<


|















<







16
17
18
19
20
21
22

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

41
42
43
44
45
46
47
            {if empty($champ.private) && $nom != 'passe'}
                {html_champ_membre config=$champ name=$nom data=$membre}
            {/if}
            {/foreach}
        </dl>
    </fieldset>


    <fieldset>
        <legend>Changer mon mot de passe</legend>
        {if $user.droits.membres < Garradin\Membres::DROIT_ADMIN && (!empty($champs.passe.private) || empty($champs.passe.editable))}
            <p class="help">Vous devez contacter un administrateur pour changer votre mot de passe.</p>
        {else}
            <dl>
                <dd>Vous avez déjà un mot de passe, ne remplissez pas les champs suivants si vous ne souhaitez pas les changer.</dd>
                <dt><label for="f_passe">Nouveau mot de passe</label></dt>
                <dd class="help">
                    Pas d'idée ? Voici une suggestion choisie au hasard :
                    <tt title="Cliquer pour utiliser cette suggestion comme mot de passe" onclick="fillPassword(this);">{$passphrase|escape}</tt>
                </dd>
                <dd><input type="password" name="passe" id="f_passe" value="{form_field name=passe}" /></dd>
                <dt><label for="f_repasse">Encore le mot de passe</label> (vérification)</dt>
                <dd><input type="password" name="repasse" id="f_repasse" value="{form_field name=repasse}" /></dd>
            </dl>
        {/if}
    </fieldset>


    <p class="submit">
        {csrf_field key="edit_me"}
        <input type="submit" name="save" value="Enregistrer &rarr;" />
    </p>

</form>