UserProfileSelect.php 4.79 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
<?php
namespace UnicaenAuth\View\Helper;

use Zend\Permissions\Acl\Role\RoleInterface;

/**
 * Aide de vue permettant à l'utilisateur de sélectionner son profil courant parmi
 * les différents profils qu'il possède.
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
 */
12
class UserProfileSelect extends UserAbstract
13
{
14
15
16
17
18
    /**
     * @var \UnicaenAuth\Service\UserContext 
     */
    protected $userContextService;
    
19
20
21
22
23
24
25
26
27
28
    /**
     * @var string
     */
    protected $formClass;
    
    /**
     * @var bool
     */
    protected $asSelect = false;
    
29
30
31
32
33
    /**
     * @var string
     */
    protected $redirectRoute;
    
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
    /**
     * Retourne le code HTML généré par cette aide de vue.
     *
     * @return string
     */
    public function render()
    {
        $roles = $this->getIdentityRolesAsOptions();
        
        if (!$roles) {
            return '';
        }
        
        $formClass  = 'user-profile-select-form';
        $inputClass = 'user-profile-select-input';
        
        $form = new \Zend\Form\Form();
        $form->setAttribute('class', "$formClass " . $this->formClass);

        $html = $this->getView()->form()->openTag($form);
            
        // rendu sous forme d'un select
        if ($this->asSelect) {
            $select = new \Zend\Form\Element\Select('role');
            $select
                    ->setValueOptions($roles)
                    ->setAttributes(array(
                        'class' => $inputClass,
                        'value' => $this->getSelectedIdentityRole(),
                    ));
            
            $html .= $this->getView()->formControlGroup($select);
        }
        // rendu sous forme de radios
        else {
            foreach ($roles as $id => $role) {
                $radio = new \Zend\Form\Element\Radio('role');
                $radio
                        ->setValueOptions(array($id => $role))
                        ->setAttribute('class', $inputClass)
                        ->setAttribute('title', "Cliquez pour changer de profil courant")
                        ->setValue($id === $this->getSelectedIdentityRole() ? $id : null);
                $html .= '<div class="radio">' . $this->getView()->formRadio($radio) . '</div>';
            }
        }
        
        $html .= $this->getView()->form()->closeTag();
            
        $url = $this->getView()->url('utilisateur/default', array('action' => 'selectionner-profil'));
83
84
        $redirectUrl = $this->getView()->url($this->redirectRoute ?: 'home');
        
85
86
87
        $html .= <<<EOS
<script>
    $(function() {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
88
89
90
        $("input.$inputClass")
            .change(function() {
                $("body *").css('cursor', 'wait'); 
91
92
                $.post("$url", $(".$formClass").serializeArray(), function() { $(location).attr('href', "$redirectUrl"); });
            })
Bertrand Gauthier's avatar
Bertrand Gauthier committed
93
            .tooltip({ delay: 500, placement: 'left' });
94
95
96
97
98
99
100
    });  
</script>
EOS;
        
        return $html;
    }
    
101
102
103
104
105
106
107
108
109
110
    /**
     * Retourne le code HTML généré par cette aide de vue.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->render();
    }
    
111
112
113
114
115
116
117
    /**
     * Interroge le service pour abtenir le rôle sélectionné.
     * 
     * @return mixed
     */
    protected function getSelectedIdentityRole()
    {
118
        $role = $this->getUserContext()->getSelectedIdentityRole();
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
        if ($role instanceof RoleInterface) {
            return $role->getRoleId();
        }
        return $role;
    }
    
    /**
     * Formatte et traduit les rôles.
     * 
     * @return array
     */
    protected function getIdentityRolesAsOptions()
    {
        $roles = $this->getSelectableRoles();
        
        foreach ($roles as $id => $role) {
135
136
137
            $lib = '?';
            if (is_object($role) && method_exists($role, '__toString')) {
                $lib = (string) $role;
138
139
140
141
            }
            elseif ($role instanceof RoleInterface) {
                $lib = $role->getRoleId();
            }
142
143
            elseif (is_string($role)) {
                $lib = $role;
144
            }
145
146
            if ($this->getTranslator()) {
                $lib = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain());
147
            }
148
            $roles[$id] = $lib;
149
150
151
152
153
154
155
156
157
158
159
        }
        
        return $roles;
    }
    
    /**
     * 
     * @return array
     */
    protected function getSelectableRoles()
    {
160
        return $this->getUserContext()->getSelectableIdentityRoles();
161
162
163
164
165
166
167
168
169
170
171
172
173
    }

    public function setFormClass($formClass)
    {
        $this->formClass = $formClass;
        return $this;
    }

    public function setAsSelect($asSelect)
    {
        $this->asSelect = $asSelect;
        return $this;
    }
174
175
176
177
178
179
    
    public function setRedirectRoute($redirectRoute)
    {
        $this->redirectRoute = $redirectRoute;
        return $this;
    }
180
}