diff --git a/application/modules/admin/controllers/UsersController.php b/application/modules/admin/controllers/UsersController.php index 5322dbbbad0692789386d7c2930278486837e64b..13590087f06b28d8113157039653e45c740bfecc 100644 --- a/application/modules/admin/controllers/UsersController.php +++ b/application/modules/admin/controllers/UsersController.php @@ -127,6 +127,11 @@ class Admin_UsersController extends Zend_Controller_Action if($data['role'] > 4) $data['bib']=0; if($data['role'] < 2) {$data['id_abon']=0; $data['ordre']=0;} + $user_groups = array_filter( + array_map(function($id) { return Class_UserGroup::find((int)$id);}, + explode('-', $data['id_items'])) + ); + $user ->setLogin($data['username']) ->setPassword($data['password']) @@ -145,7 +150,8 @@ class Admin_UsersController extends Zend_Controller_Action ->setCivilite($data['civilite']) ->setAdresse($data['adresse']) ->setVille($data['ville']) - ->setCodePostal($data['code_postal']); + ->setCodePostal($data['code_postal']) + ->setUserGroups($user_groups); try { if ($user->save()) diff --git a/application/modules/admin/views/scripts/users/_form.phtml b/application/modules/admin/views/scripts/users/_form.phtml index 1c98e5aca92f0ea1b659f1d6c7047f9843ed63d5..17717172c4eed5243231e6a3a3ca87e0e153da0f 100644 --- a/application/modules/admin/views/scripts/users/_form.phtml +++ b/application/modules/admin/views/scripts/users/_form.phtml @@ -9,140 +9,144 @@ <legend><?php echo $this->traduire('Utilisateur'); ?></legend> <span id="abonne_erreur" class="abonne"><?php echo $this->erreurs; ?></span> <table cellspacing="2"> - <tr> - <td class="droite">Identifiant *</td> - <td class="gauche"><input type="text" name="username" onkeypress="if (event.keyCode == 13) {javascript:PicToolbarOver( getElementById('menu_item975'), 'menu_item975');this.form.submit();return false;}" value="<?php echo $this->escape($this->user->getLogin());?>" maxlength="80"/></td> - </tr> - <tr> - <td class="droite">Mot de passe *</td> - <td class="gauche"><input type="text" name="password" onkeypress="if (event.keyCode == 13) {javascript:PicToolbarOver( getElementById('menu_item975'), 'menu_item975');this.form.submit();return false;}" value="<?php echo $this->escape($this->user->getPassword());?>"/></td> - </tr> - <tr> - <td class="droite">Nom </td> - <td class="gauche"><input type="text" name="nom" size="50" value="<?php echo $this->escape($this->user->getNom());?>"/></td> - </tr> - <tr> - <td class="droite">Prénom </td> - <td class="gauche"><input type="text" name="prenom" size="50" value="<?php echo $this->escape($this->user->getPrenom());?>"/></td> - </tr> - <tr> - <td class="droite">Pseudo </td> - <td class="gauche"><input type="text" name="pseudo" size="50" value="<?php echo $this->escape($this->user->getPseudo());?>"/></td> - </tr> + <tr> + <td class="droite">Identifiant *</td> + <td class="gauche"><input type="text" name="username" onkeypress="if (event.keyCode == 13) {javascript:PicToolbarOver( getElementById('menu_item975'), 'menu_item975');this.form.submit();return false;}" value="<?php echo $this->escape($this->user->getLogin());?>" maxlength="80"/></td> + </tr> + <tr> + <td class="droite">Mot de passe *</td> + <td class="gauche"><input type="text" name="password" onkeypress="if (event.keyCode == 13) {javascript:PicToolbarOver( getElementById('menu_item975'), 'menu_item975');this.form.submit();return false;}" value="<?php echo $this->escape($this->user->getPassword());?>"/></td> + </tr> + <tr> + <td class="droite">Nom </td> + <td class="gauche"><input type="text" name="nom" size="50" value="<?php echo $this->escape($this->user->getNom());?>"/></td> + </tr> + <tr> + <td class="droite">Prénom </td> + <td class="gauche"><input type="text" name="prenom" size="50" value="<?php echo $this->escape($this->user->getPrenom());?>"/></td> + </tr> + <tr> + <td class="droite">Pseudo </td> + <td class="gauche"><input type="text" name="pseudo" size="50" value="<?php echo $this->escape($this->user->getPseudo());?>"/></td> + </tr> - <tr> - <td class="droite">Civilité </td> - <td class="gauche"> - <?php - echo $this->formSelect('civilite', - $this->user->getCivilite(), - null, - [Class_Users::CIVILITE_INDEFINIE => 'Indéfinie', - Class_Users::CIVILITE_MADAME => 'Madame', - Class_Users::CIVILITE_MONSIEUR => 'Monsieur']); - ?> - </td> - </tr> + <tr> + <td class="droite">Civilité </td> + <td class="gauche"> + <?php + echo $this->formSelect('civilite', + $this->user->getCivilite(), + null, + [Class_Users::CIVILITE_INDEFINIE => 'Indéfinie', + Class_Users::CIVILITE_MADAME => 'Madame', + Class_Users::CIVILITE_MONSIEUR => 'Monsieur']); + ?> + </td> + </tr> - <tr> - <td class="droite">Date de naissance </td> - <td class="gauche"><input type="text" name="naissance" size="10" value="<?php echo $this->escape($this->user->getNaissance());?>"/></td> - </tr> - <tr> - <td class="droite"><?php echo $this->traduire('Rôle'); ?> </td> - <td class="gauche"> - <?php $comboListeRole = new ZendAfi_Acl_AdminControllerRoles(); - if ($this->user->getId() == '1') - echo '<select disabled="disabled"><option selected="selected" value="7">super_admin</option></select><input type="hidden" value="7" name="role" id="role"/>'; - else - print $comboListeRole->rendCombo($this->user->getRole(),$this->authUser->ROLE_LEVEL); - ?> + <tr> + <td class="droite">Date de naissance </td> + <td class="gauche"><input type="text" name="naissance" size="10" value="<?php echo $this->escape($this->user->getNaissance());?>"/></td> + </tr> + <tr> + <td class="droite"><?php echo $this->traduire('Rôle'); ?> </td> + <td class="gauche"> + <?php $comboListeRole = new ZendAfi_Acl_AdminControllerRoles(); + if ($this->user->getId() == '1') + echo '<select disabled="disabled"><option selected="selected" value="7">super_admin</option></select><input type="hidden" value="7" name="role" id="role"/>'; + else + print $comboListeRole->rendCombo($this->user->getRole(),$this->authUser->ROLE_LEVEL); + ?> - </td> - </tr> + </td> + </tr> - <tr> - <td class="droite"><?php echo $this->traduire('Groupe'); ?> </td> - <td class="gauche"> - <?php $groups=[]; - foreach ($this->user->getUserGroups() as $group) { - $groups[]= $group->getLibelle(); - } - echo implode($groups,','); + <tr> + <td class="droite"><?php echo $this->traduire('Groupes'); ?> </td> + <td class="gauche"> + <?php + echo $this->getHelper('TreeSelect') + ->categoriesNotSelectable() + ->treeSelect(implode('-', $this->user->getUserGroupsIds()), + '', + true, + $this->url(['module' => 'admin', + 'controller' => 'usergroup', + 'action' => 'list.json']), + "form", + "usergroup_categories_ids"); + ?> + </td> + </tr> -?> - </td> - </tr> - - - <tr id="option_bib"> - <td class="droite">Bibliothèque </td> - <td class="gauche"> - <?php - if (($this->user->getRoleLevel() <= ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB) and ($bib = Class_Bib::getLoader()->find($this->id_bib))) { - echo '<select disabled="disabled"><option selected="selected" value="'.$this->id_bib.'">'.$bib->LIBELLE.'</option></select> + <tr id="option_bib"> + <td class="droite">Bibliothèque </td> + <td class="gauche"> + <?php + if (($this->user->getRoleLevel() <= ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB) and ($bib = Class_Bib::getLoader()->find($this->id_bib))) { + echo '<select disabled="disabled"><option selected="selected" value="'.$this->id_bib.'">'.$bib->LIBELLE.'</option></select> <input type="hidden" value="'.$this->id_bib.'" name="bib" id="bib"/>'; - } else { - $bib = new Class_Bib(); - echo $bib->getComboBib($this->user->getIdSite()); - } - ?> - <script type="text/javascript"> - formSelectToggleVisibilityForElement("select[name='role']", - "#option_bib", - ["2", "3", "4"]); - formSelectToggleVisibilityForElement("select[name='role']", - "#abonne_sigb", "2"); - </script> - </td> - </tr> - <tr> - <td class="droite">E-mail </td> - <td class="gauche"><input type="text" name="mail" size="50" value="<?php echo $this->escape($this->user->getMail());?>"/></td> - </tr> - <tr> - <td class="droite">Téléphone </td> - <td class="gauche"><input type="text" name="telephone" size="50" value="<?php echo $this->escape($this->user->getTelephone());?>"/></td> - </tr> - <tr> - <td class="droite">Mobile </td> - <td class="gauche"><input type="text" name="mobile" size="50" value="<?php echo $this->escape($this->user->getMobile());?>"/></td> - </tr> - <tr> - <td class="droite">Adresse </td> - <td class="gauche"><textarea name="adresse" rows="5"><?php echo $this->escape($this->user->getAdresse());?></textarea></td> - </tr> - <tr> - <td class="droite">Code postal </td> - <td class="gauche"><input type="text" name="code_postal" size="10" value="<?php echo $this->escape($this->user->getCodePostal());?>"/></td> - </tr> - <tr> - <td class="droite">Ville </td> - <td class="gauche"><input type="text" name="ville" size="50" value="<?php echo $this->escape($this->user->getVille());?>"/></td> - </tr> + } else { + $bib = new Class_Bib(); + echo $bib->getComboBib($this->user->getIdSite()); + } + ?> + <script type="text/javascript"> + formSelectToggleVisibilityForElement("select[name='role']", + "#option_bib", + ["2", "3", "4"]); + formSelectToggleVisibilityForElement("select[name='role']", + "#abonne_sigb", "2"); + </script> + </td> + </tr> + <tr> + <td class="droite">E-mail </td> + <td class="gauche"><input type="text" name="mail" size="50" value="<?php echo $this->escape($this->user->getMail());?>"/></td> + </tr> + <tr> + <td class="droite">Téléphone </td> + <td class="gauche"><input type="text" name="telephone" size="50" value="<?php echo $this->escape($this->user->getTelephone());?>"/></td> + </tr> + <tr> + <td class="droite">Mobile </td> + <td class="gauche"><input type="text" name="mobile" size="50" value="<?php echo $this->escape($this->user->getMobile());?>"/></td> + </tr> + <tr> + <td class="droite">Adresse </td> + <td class="gauche"><textarea name="adresse" rows="5"><?php echo $this->escape($this->user->getAdresse());?></textarea></td> + </tr> + <tr> + <td class="droite">Code postal </td> + <td class="gauche"><input type="text" name="code_postal" size="10" value="<?php echo $this->escape($this->user->getCodePostal());?>"/></td> + </tr> + <tr> + <td class="droite">Ville </td> + <td class="gauche"><input type="text" name="ville" size="50" value="<?php echo $this->escape($this->user->getVille());?>"/></td> + </tr> </table> </fieldset> <fieldset id="abonne_sigb"> <legend><?php echo $this->traduire('Abonné sigb'); ?></legend> <table cellspacing="2"> - <tr> - <td class="droite" style="width:150px">Numéro de carte </td> - <td class="gauche"><input type="text" name="id_abon" value="<?php echo $this->escape($this->user->getIdabon());?>"/></td> - </tr> - <tr> - <td class="droite">Ordre </td> - <td class="gauche"><input type="text" name="ordre" size="3" onkeypress="if (event.keyCode == 13) {javascript:PicToolbarOver( getElementById('menu_item975'), 'menu_item975');this.form.submit();return false;}" value="<?php echo $this->escape($this->user->getOrdreabon());?>"/></td> - </tr> - <tr> - <td class="droite">Abonnement valide - du </td> - <td class="gauche"><?php echo formatDate($this->user->getDateDebut(),1);?></td> - </tr> - <tr> - <td class="droite">au </td> - <td class="gauche"><?php echo formatDate($this->user->getDateFin(),1);?></td> - </tr> + <tr> + <td class="droite" style="width:150px">Numéro de carte </td> + <td class="gauche"><input type="text" name="id_abon" value="<?php echo $this->escape($this->user->getIdabon());?>"/></td> + </tr> + <tr> + <td class="droite">Ordre </td> + <td class="gauche"><input type="text" name="ordre" size="3" onkeypress="if (event.keyCode == 13) {javascript:PicToolbarOver( getElementById('menu_item975'), 'menu_item975');this.form.submit();return false;}" value="<?php echo $this->escape($this->user->getOrdreabon());?>"/></td> + </tr> + <tr> + <td class="droite">Abonnement valide - du </td> + <td class="gauche"><?php echo formatDate($this->user->getDateDebut(),1);?></td> + </tr> + <tr> + <td class="droite">au </td> + <td class="gauche"><?php echo formatDate($this->user->getDateFin(),1);?></td> + </tr> </table> <input type="hidden" name="id" value="<?php echo $this->user->getId(); ?>" /> @@ -150,8 +154,8 @@ <table> <tr> - <td align="right" style="padding-right:5px;"><?php echo $this->bouton('type=V'); ?> </td> - <td align="left" style="padding-left:5px;"> <?php echo $this->bouton('id=29','picto=del.gif','texte=Annuler','url='.BASE_URL.'/admin/users?z='.$this->id_zone.'&b='.$this->id_bib,'largeur=120px'); ?></td> + <td align="right" style="padding-right:5px;"><?php echo $this->bouton('type=V'); ?> </td> + <td align="left" style="padding-left:5px;"> <?php echo $this->bouton('id=29','picto=del.gif','texte=Annuler','url='.BASE_URL.'/admin/users?z='.$this->id_zone.'&b='.$this->id_bib,'largeur=120px'); ?></td> </tr> </table> </form> diff --git a/library/Class/Users.php b/library/Class/Users.php index f0c46e191b955ed20c382df6a31eb5de11585264..9534b6491a9be1e1443da8d1f4af28d98d4d9013 100644 --- a/library/Class/Users.php +++ b/library/Class/Users.php @@ -481,6 +481,17 @@ class Class_Users extends Storm_Model_Abstract { } + /** + * @return array + */ + public function getUserGroupsIds() { + $groups = $this->getUserGroups(); + return array_map( + function($group) { return $group->getId();}, + $groups); + } + + /** * @return array */ diff --git a/library/ZendAfi/View/Helper/Admin/TreeSelect.php b/library/ZendAfi/View/Helper/Admin/TreeSelect.php index 553f4f3ce04ba4f36cb9c2390eb5ba14e54d459c..0ac50174ad3d03a46936c5e735762f171afadc93 100644 --- a/library/ZendAfi/View/Helper/Admin/TreeSelect.php +++ b/library/ZendAfi/View/Helper/Admin/TreeSelect.php @@ -23,7 +23,16 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////// class ZendAfi_View_Helper_Admin_TreeSelect extends ZendAfi_View_Helper_BaseHelper { - function treeSelect($id_items, $id_categories, $default_visibility, $url_data_source, $form_selector, $input_id_categories_name = "id_categorie"){ + protected + $_categories_selectable = true; + + function treeSelect($id_items, + $id_categories, + $default_visibility, + $url_data_source, + $form_selector, + $input_id_categories_name = "id_categorie"){ + $this->id_items = $id_items; $this->id_categories = $id_categories; $this->default_visibility = $default_visibility; @@ -38,6 +47,12 @@ class ZendAfi_View_Helper_Admin_TreeSelect extends ZendAfi_View_Helper_BaseHelpe } + function categoriesNotSelectable() { + $this->_categories_selectable = false; + return $this; + } + + function setHeader(){ $this->view->headScript() ->appendFile(JQUERYUI) @@ -69,8 +84,12 @@ class ZendAfi_View_Helper_Admin_TreeSelect extends ZendAfi_View_Helper_BaseHelpe treeselect("selectItems", [$js_id_items]). treeselect("selectCategories", [$js_id_categories]). treeselect('toggleVisibility', $js_default_visibility); +CONTENT; + if (!$this->_categories_selectable) + $content .= "$(\".treeselect\").treeselect('categoriesNotSelectable');"; + $content .= <<<CONTENT \$("$this->form_selector").submit(function(){ \$(".treeselect").treeselect("readSelection", function(items, categories){ \$("#$this->input_id_categories_name").val(pack_ids(categories)); diff --git a/public/admin/js/treeselect/treeselect.js b/public/admin/js/treeselect/treeselect.js index b37371317aa270eaf2c2709c5907779132c99efa..61129186864f1eee1b34f99984c42f06912c8261 100644 --- a/public/admin/js/treeselect/treeselect.js +++ b/public/admin/js/treeselect/treeselect.js @@ -398,6 +398,9 @@ $.widget("ui.treeselect", { this._selectByIdAndType(ids, 'category'); }, + categoriesNotSelectable: function() { + $('li.ui-treeselect-category>input:first-child').remove(); + }, readSelection: function(callback) { callback( @@ -416,4 +419,4 @@ $.widget("ui.treeselect", { this.element.hide('fast'); } } -})})(jQuery); \ No newline at end of file +})})(jQuery); diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php index a3518c7bae8168a01602d1e8a62ba760bf3e9272..2be7592f422523451aaa3315cc614d18fe6abf1d 100644 --- a/tests/application/modules/admin/controllers/CmsControllerTest.php +++ b/tests/application/modules/admin/controllers/CmsControllerTest.php @@ -517,8 +517,7 @@ class CmsControllerArticleConcertEditActionTest extends CmsControllerTestCase { /** @test */ public function checkBoxShouldCheckedDomaineArtEtHistoire() { - $this->assertXPath("//input[@name='domaine_ids'][@value='11-12']",$this->_response->getBody()); - + $this->assertXPath("//input[@name='domaine_ids'][@value='11-12']",$this->_response->getBody()); } } diff --git a/tests/application/modules/admin/controllers/UsersControllerTest.php b/tests/application/modules/admin/controllers/UsersControllerTest.php index 32dc5971979d665667e75e13b7e31d5fb5c336b0..145361ad8731d87e1b2bb6791fea765881e6c34c 100644 --- a/tests/application/modules/admin/controllers/UsersControllerTest.php +++ b/tests/application/modules/admin/controllers/UsersControllerTest.php @@ -23,11 +23,14 @@ require_once 'AbstractControllerTestCase.php'; abstract class UsersControllerWithMarcusTestCase extends AbstractControllerTestCase { public function setUp() { parent::setUp(); - $group_vodeclic = Class_UserGroup::newInstanceWithId('20', ['libelle' => 'Multimedia', - 'rights_token' => Class_UserGroup::RIGHT_ACCES_VODECLIC]); + $group_vodeclic = Class_UserGroup::newInstanceWithId(20, ['libelle' => 'Multimedia', + 'rights_token' => Class_UserGroup::RIGHT_ACCES_VODECLIC]); + + $group_referent = Class_UserGroup::newInstanceWithId(22, ['libelle' => 'Referent', + 'rights_token' => Class_UserGroup::RIGHT_USER_DOMAINES_SUPPRESSION_LIMIT]); + + $group_stagiaires = Class_UserGroup::newInstanceWithId(25, ['libelle' => 'Stagiaires']); - $group_referent = Class_UserGroup::newInstanceWithId('20', ['libelle' => 'Referent', - 'rights_token' => Class_UserGroup::RIGHT_USER_DOMAINES_SUPPRESSION_LIMIT]); $this->marcus = Class_Users::getLoader() ->newInstanceWithId(10) @@ -94,7 +97,7 @@ class UsersControllerIndexTest extends UsersControllerWithMarcusTestCase { class UsersControllerEditMarcusTest extends UsersControllerWithMarcusTestCase { public function setUp() { parent::setUp(); - $this->dispatch('/admin/users/edit/id/10'); + $this->dispatch('/admin/users/edit/id/10', true); } @@ -117,7 +120,12 @@ class UsersControllerEditMarcusTest extends UsersControllerWithMarcusTestCase { public function testGroupesAreMultimediaAndReferent() { - $this->assertXPathContentContains("//td","Multimedia,Referent",$this->_response->getBody()); + $this->assertXPath("//input[@name='id_items'][@value='20-22']",$this->_response->getBody()); + } + + + public function testUserGroupCategoriesNotSelectable() { + $this->assertXPathContentContains('//script', 'categoriesNotSelectable'); } public function testSelectedRoleIsAbonneSIGB() { @@ -177,7 +185,7 @@ class UsersControllerEditMarcusTest extends UsersControllerWithMarcusTestCase { } -class UsersControllerEditMarcusAsAdminPortailTest extends UsersControllerWithMarcusTestCase { +class rsControllerEditMarcusAsAdminPortailTest extends UsersControllerWithMarcusTestCase { public function setUp() { parent::setUp(); $this->marcus->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL); @@ -228,7 +236,9 @@ class UsersControllerPostMarcusDataTest extends UsersControllerWithMarcusTestCas 'ville' => 'Paris', 'civilite' => 1, 'mobile' => '06 12 45 09 87', - 'naissance' => '1976-02-17')); + 'naissance' => '1976-02-17', + 'id_items' => '22-25-e', + )); $this->assertRedirectTo('/admin/users'); } @@ -307,9 +317,14 @@ class UsersControllerPostMarcusDataTest extends UsersControllerWithMarcusTestCas public function testPseudoIsDave() { $this->assertEquals('Dave', $this->marcus->getPseudo()); } + + public function testUserGroupsAreReferentAndStagiaires() { + $this->assertEquals([22, 25], $this->marcus->getUserGroupsIds()); + } } + class UsersControllerPostMarcusInvalidDataTest extends UsersControllerWithMarcusTestCase { public function testNoUsernamePasswordAndRole() { $this->_postEditData(array('username' => '',