Tomando el control de Sugar CRM Autor: Fecha: Licencia: 1 Joaquín "Everglades" Sorianello 24/05/2011 Esto son los Everglades Esto son los Everglades 2 Disclaimer Disclaimer Sobre el Contenido Todo el contenido de esta charla es resultado de investigaciones, suposiciones y corazonadas sobre como el CRM funciona. Lo único que puedo asegurar es que el contenido de estos slides permite trabajar de forma mas limpia y agrega recursos a nuestra caja de herramientas. Sobre los Slides Hay mucho código, siéntanse libres de preguntar todo lo que necesiten 3 Elementos de un Módulo Elementos de un Módulo Beans Son los objetos de negocio de la aplicación. En ellos se encuentran y deberían agregarse, todos los métodos que modifican el Bean. 4 Vistas Vistas Nos proveen de distintas formas de visualizar la información 5 Controlador Controlador Permite crear acciones, que gobiernan el comportamiento global del Bean 6 Remojando el Bean Remojando el Bean Todos los Beans de la aplicación heredan de SugarBean Algunos métodos útiles para sobreescribir: • retrieve recibe un id, y popula el bean con los datos de la DB Útil para agregar fuentes de datos externas (webservices en nuestro caso) <?php function retrieve($id = -1, $encode=true, $deleted=true) { $this->webservice = new GcoopRestPlazosFijos(); try { $this->array_plazosf = $this->webservice->plazos_fijos_array($id); $this->name = "Plazos Fijos $id"; $this->id = $id; } catch (Exception $e) { $this->arrayplazosf = array(); $this->name = 'Ocurrio un Error'.$e->getMessage(); $this->id = 1; } return $this; } ?> 7 Remojando el Bean • save actualiza o inserta los datos del Bean actual en la base de datos. <?php function save($check_notify=false) { if (empty($this->name)) { $this->name = "Plazo Fijo"; } return parent::save($check_notify); ?> 8 Descontrolando el controller Descontrolando el controller Hay varias formas de definir acciones en SugarCRM La forma mas práctica, y fácil de definirlo es crear el archivo controller.php en la raíz del modulo. • Los controllers heredan de SugarController • Las nuevas acciones se definen con action_NombreAccion • En la acción podemos crear lógica para definir que vista se debe mostrar <?php function action_validar() { $this->loadBean(); # Carga el bean, y llama al método validar del mismo # Si la validación es satisfactoria muestra la vista de confirmación if ($this->bean->validar()) { $this->view = 'confirmar'; } else { $this->view = 'error'; } $this->bean->save(); } ?> 9 Avistando la Vista Avistando la Vista Las Vistas se definen en views/* y tienen nombre de la forma view.nombrevista.php Las vistas heredan de ViewDetail, ViewEdit, o SugarView, según el caso <?php class ViewConfirmar extends ViewDetail { function ViewConfirmar() { parent::ViewDetail(); $this->options['show_header'] = false; $this->options['show_footer'] = false; } function preDisplay() { $metadataFile = "modules/$this->module/metadata/confirmviewdefs.php"; $this->dv = new DetailView2(); $this->dv->ss =& $this->ss; $this->dv->setup($this->module, $this->bean, $metadataFile, 'include/DetailView/DetailView.tpl'); } function display() { //definimos los campos readfile("modules/$this->module/views/custom_header.html"); parent::display(); readfile("modules/$this->module/views/custom_footer.html"); } } 10 Avistando la Vista En este caso, estamos usando una vista similar a un detail view, y definimos su estructura en el archivo metadata/confirmviewdefs.php <?php $module_name = 'gcoop_PlazoFijo'; $viewdefs[$module_name]['DetailView'] = array( 'templateMeta' => array( 'form' => array( 'buttons'=> array('GCOOP_CONFIRM','GCOOP_CANCEL','EDIT',), 'hideAudit'=>true,), 'maxColumns' => '2', 'widths' => array( array('label' => '10', 'field' => '30'), array('label' => '10', 'field' => '30'), ),), 'panels' =>array ( 'default' => array ( array( 'cuenta_nroCuenta', 'moneda',), array( 'saldo', 'titulares',), 11 Abotonando los Botones Abotonando los Botones En la definición anterior se utilizan los botones GCOOP_CONFIRM GCOOP_CANCEL Hay dos formas de definir nuevos botones: • Usando html custom <?php $viewdefs['Accounts']['EditView'] = array( 'templateMeta' => array( 'form' => array( 'buttons'=>array( 'SAVE', array('customCode'=> '<input title="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_TITLE}" ' . ' accessKey="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_KEY}" ' . ' class="button" ' . ' onclick="alert(\'hello {$id} \')"; ' . ' type="submit" ' . ' name="button" ' . ' value="{$APP.LBL_CLOSE_AND_CREATE_BUTTON_LABEL}">') )), 12 y Abotonando los Botones Agregamos el caso en el switch en: include/Smarty/plugins/function.sugar_button.php En el caso de que sean para Details Views hay que agregar el nombre del boton en: include/TemplateHandler/TemplateHandler.php <?php case "GCOOP_CONFIRM": $view=($_REQUEST['action']=='EditView') ? 'EditView' : (($view=='EditView') ? 'EditView':$view); return '{if $bean->aclAccess("save")}<input title="{$APP.LBL_CONFIRM_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value=\'cerrar\';" type="submit" name="button" value="{$APP.LBL_CONFIRM_BUTTON_LABEL}">{/if} '; break; 13 Preguntas Preguntas http://www.flickr.com/photos/stu_p/ 14