Ejemplo de Relacion de Modulos Existentes
Bueno primero creamos un archivo php con el siguiente código (API vtlib):
<?php
/**
* @author Agamenon
* @copyright 2011
*/
/** Incluimos el archivo **/
include_once('vtlib/Vtiger/Module.php');
/** Llamamos una instancia de la clase **/
$module = Vtiger_Module::getInstance('Contacts') ;
/** Asociación de Módulos */
/** El formato de este método es el siguiente
* Vtiger_Module->setRelatedList(<TARGET MODULE>[, <HEADER LABEL>, <ALLOWED ACTIONS>,
<CALLBACK FUNCTION NAME>]);
**/
$module->setRelatedList(Vtiger_Module::getInstance('ModComments'), 'Comentarios','','getRelateComents');
?>
Luego guardamos este archivo en el raiz donde está guardado vtiger. Despues corremos este scrip llamandolo desde un browser:
http://localhost/vtigercrm/Unir_Comentario.php).
Esto nos dara por resultado un mensaje de "DONE"
Lo que acabamos de hacer es generar un registro en la tabla "vtiger_relatelist", es importante destacar que en el código de más arriba no inclui ninguna acción ("SELECT", "ADD") a la lista relacionada ya que lo único que me interesa es relacionarla para visualizar pero podriamos cambiar el código por algo como esto para seleccionar y agregar comentarios desde contactos.
$module->setRelatedList(Vtiger_Module::getInstance('ModComments'), 'Comentarios',Array('ADD','SELECT'));
Ojo, como veran no menciono el último parametro esto quiere decir que los módulos se relacionarán mediante el método por default que es "getrelatelist" pero para ello deberán de tener en común un campo para que funcione el JOIN.
Volvamos al tutorial, una vez que corrimos nuestro código debemos de genera el método que mencionamos (getRelateComents) en la clase Contacts.php. Este sería el código que deberíamos agregar al final.
/**
* Funcion para relacionar los contactos con los comentarios
* @param integer $id - contactid
* returns related Invoices record in array format
**/
public function getRelateComents($id, $cur_tab_id, $rel_tab_id, $actions=false)
{
global $log, $singlepane_view,$currentModule,$current_user;
$log->debug("Relacionar Contacto (".$id.") method ...");
$this_module = $currentModule;
$related_module = vtlib_getModuleNameById($rel_tab_id);
require_once("modules/$related_module/$related_module.php");
$other = new $related_module();
vtlib_setup_modulevars($related_module, $other);
$singular_modname = vtlib_toSingular($related_module);
$parenttab = getParentTab();
if($singlepane_view == 'true')
$returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id;
else
$returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id;
$button = '';
if($actions && getFieldVisibilityPermission($related_module, $current_user->id, 'contact_id') == '0') {
if(is_string($actions)) $actions = explode(',', strtoupper($actions));
if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') {
$button .= "<input title='".getTranslatedString('LBL_SELECT')." ". getTranslatedString($related_module). "' class='crmbutton small edit' type='button' onclick=\"return window.open('index.php?module=$related_module&return_module=$currentModule&action=Popup&popuptype=detailview&select=enable&form=EditView&form_submit=false&recordid=$id&parenttab=$parenttab','test','width=640,height=602,resizable=0,scrollbars=0');\" value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module) ."'> ";
}
if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') {
$button .= "<input title='".getTranslatedString('LBL_ADD_NEW'). " ". getTranslatedString($singular_modname) ."' class='crmbutton small create'" .
" onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\"' type='submit' name='button'" .
" value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname) ."'> ";
}
}
$query = "select case when (vtiger_users.user_name not like '')
then vtiger_users.user_name else vtiger_groups.groupname end as user_name,vtiger_crmentity.*,
vtiger_modcomments.*,
vtiger_contactdetails.lastname from vtiger_modcomments
inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_modcomments.modcommentsid
left outer join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_modcomments.related_to
left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid
left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid
where vtiger_crmentity.deleted=0 and vtiger_modcomments.related_to=".$id;
$return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset);
if($return_value == null) $return_value = Array();
$return_value['CUSTOM_BUTTON'] = $button;
$log->debug("Exiting get_purchase_orders method ...");
return $return_value;
}
Este código tiene muchas particularidades pero es básicamente genérico, lo interesante para poder realizar realmente la unión está en la varible "$query" que es la que busca el comentario para este contacto. Fijense como se une el contacto al comentario mediante el campo related_to. Expliquemos un poco este query.
/** Un case para verificar que el nombre del usuario no esté vacio **/
select case when (vtiger_users.user_name not like '')
/** Si no está vacio usamos ese nombre, sino usamos el nombre del grupo **/
then vtiger_users.user_name else vtiger_groups.groupname end as user_name,
/** Todos los campos de estas tres tablas. En verdad debería alcanzar con los que se menciona en el join pero dejemoslo así **/
vtiger_crmentity.*,
vtiger_modcomments.*,
vtiger_contactdetails.*
/** El from es comentarios **/
from vtiger_modcomments
/** Los respectivos inner joins **/
/** De entidad con comentarios **/
inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_modcomments.modcommentsid
/** De contactos con comentarios **/
left outer join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_modcomments.related_to
/** De usuario o grupo (esto es para los Owners) con owners **/
left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid
left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid
/** Donde el comentario no sea borrado y el campo related_to sea iguar al Id del Contacto que se está consultando **/
where vtiger_crmentity.deleted=0 and vtiger_modcomments.related_to=".$id
Con esto obtenemos una relación y luego podemos realizar Informes donde incluyamos estos comentarios.