Páginas de configuración y otra forma de agregar vistas

abril 2, 2016 • Publicado en Software y Hardware
Etiquetas:

Muchas veces he remarcado la importancia de replicar el lenguaje visual y de acciones en distintas páginas de un mismo sitio/programa/plataforma con el objeto de facilitar al usuario deducir nuevas acciones a partir de la experiencia que haya adquirido con el manejo del programa. La demostración más directa de lo que digo es que todos los usuarios usuario esperaría encontrar los procesos de configuración dentro del entorno de administración, y se extrañarían de que fuera de otra manera.

Siguiendo con la lógica MVC de SuiteCRM encontramos que estas páginas de configuración son en realidad vistas de los módulos Administration y Configurator, que junto la clase Configurator ofrecen el grueso de funciones para acceder y administrar la información de configuración que vayamos creando.

En una anterior entrada explicaba la forma de crear una vista y la forma de emplear un controlador para llamar a la vista después de ejecutar las acciones, sin embargo para esta vez no crearemos directamente el controlador sino que declararemos el mapa con el cual vincular una acción a esta nueva vista, y por lo tanto al declarar la vista deberá incluirse la lógica funcional en su interior (es decir, MVC al carajo).

Empezamos creando la vista que deberá ir en el módulo Configurator y que deberá tener el nombre de la acción que ejecutará la vista de la página de configuración. Atención a las mayúsculas en la declaración de la Clase.

También preste especial atención a la diferencia entre <acción> y <paquete>, porque una cosa es la Acción para llamar a la página de configuración del paquete de módulos, y otra el paquete de módulos.

/<directorio_crm>/custom/modules/Configurator/views/view.<acción>.php

<?php

require_once('modules/Configurator/Configurator.php');

//Clase declaradora de la vista
class View<Acción> extends SugarView {
	
    /**
     * Acciones que se ejecutaran antes de visualizar la página 
     */
    public function preDisplay() {
        global $current_user;
		
		//Debe ser administrador, sino terminamos el proceso
        if (!is_admin($current_user)) {
            sugar_die("Unauthorized access to administration.");
        }
        
        //Declarar la instancia para administrar
        //la configuración
        $cfg = new Configurator();
		//Declarar los elementos de la configuración
		//en caso de aun no estar declarados
		if (!array_key_exists('<paquete>', $cfg->config)) {
		    $cfg->config['<paquete>'] = array(
		        'name' => '',
		        'code' => '',
		    );
			$cfg->saveConfig();
		}
        
        //Guardar configuración en caso de venir la solicitud
        if(isset($_REQUEST['save'])) {
			$cfg->saveConfig();
		}
    }

    /**
     * Función para visualizar la plantilla
     */
    public function display() {
		//Declarar que necestamos los elementos de traducción
        global $mod_strings, $app_strings;
        
        //Declarar la instancia para administrar
        //la configuración                
        $cfg = new Configurator();
        
        //Asignar elementos de traducción                 
		$this->ss->assign('MOD', $mod_strings);
        $this->ss->assign('APP', $app_strings);
        
        //Asinar elementos de configuración
        $this->ss->assign('config', $cfg->config);
        
        //Imprimir la plantilla		
		echo $this->ss->fetch('custom/modules/Configurator/tpls/<acción>.tpl');
       
    }
}

El siguiente paso es la declaración de la plantilla de la vista y su archivo de traducciones. Esta es una plantilla básica que no incluye procesos para chequear los, así que queda a consideración del usuario los métodos para declarar estas funciones.

/<directorio_crm>/custom/modules/Configurator/tpls/<acción>.tpl

{*

/*********************************************************************************
 * Vista para la administración de la información del centro comercial
 ********************************************************************************/

*}
<div class='moduleTitle'>
	<h2>{$MOD.LBL_<ACCIÓN>_SETTINGS}</h2>
	<div class='clear'></div>
</div>
<form name="<Paquete>Settings" enctype='multipart/form-data' method="POST" action="index.php" onSubmit="return (add_checks(document.<Paquete>Settings) && check_form('<Paquete>Settings'));">
<input type='hidden' name='action' value='<acción>'/>
<input type='hidden' name='module' value='Configurator'/>
<input type='hidden' name='save' value='true'/>
<span class='error'>{$error.main}</span>
<table width="100%" cellpadding="0" cellspacing="1" border="0" class="actionsContainer">
<tr>

	<td>
		<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" id="<Paquete>Settings_save_button" type="submit"  name="save" value="  {$APP.LBL_SAVE_BUTTON_LABEL}  " >
		&nbsp;<input title="{$MOD.LBL_SAVE_BUTTON_TITLE}"  id="<Paquete>Settings_restore_button"  class="button"  type="submit" name="restore" value="  {$MOD.LBL_RESTORE_BUTTON_LABEL}  " >
		&nbsp;<input title="{$MOD.LBL_CANCEL_BUTTON_TITLE}" id="<Paquete>Settings_cancel_button"   onclick="document.location.href='index.php?module=Configurator&action=index'" class="button"  type="button" name="cancel" value="  {$APP.LBL_CANCEL_BUTTON_LABEL}  " > </td>
	</tr>
</table>


<table width="100%" border="0" cellspacing="1" cellpadding="0" class="edit view">
<tr>
	<th align="left" scope="row" colspan="4"><h4>{$MOD.LBL_<ACCIÓN>_DESCRIPTION}</h4></th>
</tr>

	<tr>
		<td scope="row" width='15%' nowrap>{$MOD.LBL_<PAQUETE>_NAME} </td>
		<td width='35%'>
			<input type='text' name='<paquete>_name' value='{$config.<paquete>.name}'>
		</td>
		<td scope="row" width='15%' nowrap>{$MOD.LBL_<PAQUETE>_CODE} </td>
		<td width='35%'>
			<input type='text' name='<paquete>_code' value='{$config.<paquete>.code}'>
		</td>
	</tr>

</table>

<div style="padding-top: 2px;">
<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" class="button primary"  type="submit" name="save" value="  {$APP.LBL_SAVE_BUTTON_LABEL}  " class="button primary"/>
		&nbsp;<input title="{$MOD.LBL_SAVE_BUTTON_TITLE}"  class="button"  type="submit" name="restore" value="  {$MOD.LBL_RESTORE_BUTTON_LABEL} " />
		&nbsp;<input title="{$MOD.LBL_CANCEL_BUTTON_TITLE}"  onclick="document.location.href='index.php?module=Configurator&action=index'" class="button"  type="button" name="cancel" value="  {$APP.LBL_CANCEL_BUTTON_LABEL}  " />
</div>
{$JAVASCRIPT}

</form>

El penúltimo paso es la declaración de la acción que ejecutará la vista y el archivo de traducciones.

/<directorio_crm>/custom/Extension/modules/Configurator/Ext/ActionViewMap/<acción>.php

<?php
	$action_view_map['<acción>'] = '<acción>';

/<directorio_crm>/custom/Extension/modules/Configurator/Ext/Language/en_us.<paquete>.php

<?php
  
    $mod_strings['LBL_<ACCIÓN>_SETTINGS'] = 'Mall Settings';
    $mod_strings['LBL_<ACCIÓN>_DESCRIPTION'] = 'Change settings to adjust to the Mall';
    $mod_strings['LBL_<PAQUETE>_NAME'] = 'Mall Name:';
    $mod_strings['LBL_<PAQUETE>_CODE'] = 'Code:';

El último paso es la declaración del acción para que se visualice en la página de administración y su correspondiente archivo de traducciones.

En el presente ejemplo agregaremos la acción al final de la sección del Sistema (segunda sección del administrador de SuiteCRM). Es posible crear una sección propia, pero en esta caso particular por tratarse de una única acción se vería como un desperdicio de espacio.

Este grupo de acciones se ejecutará en el módulo Administration.

/<directorio_crm>/custom/Extension/modules/Administration/Ext/Administration/<paquete>.php

<?php
	$accion = array();
	$accion['<acción>'] = array(
		//Nombre del ícono. Los íconos disponibles están en ./themes/default/images
		'editlabels',
		
		//Nombre del enlace 
		'LBL_<ACCIÓN>_LINK_NAME',
		
		//Descripción
		'LBL_<ACCIÓN>_LINK_DESCRIPTION',
		
		//URL del enlace
		'./index.php?module=Configurator&action=<acción>',
	);
	
	$admin_group_header[1][3]['<paquete>'] = $accion;

/<directorio_crm>/custom/Extension/modules/Administration/Ext/Language/en_us.<paquete>.php

<?php
	$mod_strings['LBL_<ACCIÓN>_LINK_NAME'] = 'Package Settings';
	$mod_strings['LBL_<ACCIÓN>_LINK_DESCRIPTION'] = 'Change settings to adjust the package';

Paso final, ejecutamos la acción de “Reparar y Reconstruir“, y ya tendremos el botón para administrar.

¿Y cómo usar la configuración almacenada?

<?php
 
//Declaramos el uso de la configuración
require_once('modules/Configurator/Configurator.php');
$cfg = new Configurator();

//Extraemos la configuración del paquete
$cfg_<paquete> = $cfg->config['<paquete>'];

Dejar un Comentario