SugarCRM readonly custom field based on user role
Qualche giorno addietro ho risposto a una domanda posta su stackoverflow.com sulla creazione di un campo personalizzato che sia reso in sola lettura a utenti che dispongono di un determinato ruolo. La realizzazione di questo comportamento sulle versioni commerciali di SugarCRM è pressochè banale ma non è così sulla Community Edition.
Mettiamo di voler aggiungere un campo custom di tipo checkbox chiamato Processor SignOff sul modulo Task di SugarCRM e voler rendere in sola lettura l'accesso a questo campo ai membri del ruolo ITOperation. Il campo deve essere disponibile sul layout di edit-view. Per raggiungere facilmente il risultato occorre procedere nel modo seguente:
- Step 1: Creare il campo custom di tipo checkbox dall'ambiente Studio di SugarCRM;
- Step 2: Creare o modificare i metadati della edit view su editviewdefs.php dove indicare come renderizzare il nuovo campo personalizzato;
- Step 3: Creare o modificare il SugarView::display() per fare in modo che sul template smarty sia possibile sapere quando visualizzare il campo personalizzato in sola lettura o non.
Il Listato 1 mostra il frammento di codice della editviewdefs.php responsabile del rendering del controllo sulla maschera di modifica del modulo Task, mentre il Listato 2 mostra l'estensione del metodo SugarView::display() dov'è recuperato il ruolo dell'utente e impostate le variabili per lo Smarty Template.
array ( 'name' => 'processor_signoff_c', 'label' => 'LBL_PROCESSOR_SIGNOFF', 'customCode' => '', ),
Listato 1. Frammento di codice della definizione del campo personalizzato.
/** * @see SugarView::display() */ public function display() { if($this->ev->isDuplicate){ $this->bean->status = $this->bean->getDefaultStatus(); } //if global $current_user; // check if current user is in specific role $isEnabledRole = in_array("ITOperation", ACLRole::getUserRoleNames($current_user->id)); if($isEnabledRole) $this->ev->ss->assign('readOnly', 'readonly = "readonly"'); $this->ev->ss->assign('disabled', 'disabled'); else $this->ev->ss->assign('readOnly', ''); $this->ev->ss->assign('disabled', 'disabled'); parent::display(); }
Listato 2. Implementazione del metodo SugarView::display()
Questa personalizzazione andrebbe fatta in modalità safe per cui i due file oggetto della modifica andranno sulla "famosa" custom directory e esattamente su:
- File dei metadati della edit view in custom/modules/Tasks/metadata/editviewdefs.php;
- File della classe SugarView view.edit.php in custom/modules/Tasks/views/view.edit.php
Per applicare la nuova personalizzazione basta fare un bel Quick and Repair e il vostro nuovo campo personalizzato basato sul ruolo è fatto.