LogicHooks Modulo Personalizado

Hola, cómo están? Soy bastante nuevo en suiteCRM y PHP.

Estuve viendo algunas consultas sobre la implementación de LogicHooks en modulos personalizados.
En este caso en particular estoy buscando que me salga un mensaje de “Alerta” a la hora de cargar un registro con el mismo campo de identificación que una ya guardada.

En la ruta /custom/modules/, implementé el archivo logic_hooks.php:

<?php

 $hook_version = 1;
 $hook_array = Array();
 $hook_array['before_save'][] = Array();
 $hook_array['before_save'][] = Array(1, 'verificacionDuplicados', 'custom/modules/<NombreModulo>/LogicHook/logicHooks.php', '<NombreClase>', '<NombreFuncion>');
 



y en la carpeta LogicHooks con la clase Verificacion y su función:

<?php

if (!defined('sugarEntry') || !sugarEntry){
    die('Not a Valid Entry Point');
}

class VerificaDuplicados{
    function verif_duplicado($bean, $event, $arguments) {

        //logic 
        echo "Test";
        exit();
    }
}
?>``` 

Tener en cuenta que no está implementada la lógica de esa función ya que todavía no puedo hacer que funcione ese - echo “Test” - a la hora de darle guardar al registro.

¿Alguien que haya implementado estos Logic Hooks y pueda guiarme en lo que me esté faltando?

Gracias!

Las logic hooks ejecutan en el back-end, no front-end, entonces tu echo no lo vas a ver.

Puedes, en cambio, intentar escribir al log de SuiteCRM, por ejemplo, y lo ves en el server.

pero la logica de lo implementado cambiando el echo por un error_log debería funcionar?
Porque tampoco puedo lograr eso y no sé si estoy errandole a la estructura de lo que quiero implementar o si estoy en las carpetas correctas.

Supongo que ya has hecho un Quick Repair and Rebuild?

Eso debría hacer aparecer un nuevo fichero con la tua definición del hook, en algun sitio de custom/Ext/ si no me equivoco.

Lo puedes buscar desde Linux y desde la carpeta de SuiteCRM con

grep -irn verificacionDuplicados .

(termina con espacio-punto)

Muchas gracias por la respuesta!

Hola amigo

Primero que nada, el logic hooks como bien dice pgr solo se ejecuta en el backend
Y este solo sirve para ‘enganchar’ por eso hook, los archivos que ejecutan: after save, before save, etc
El control de la alerta debes hacerlo en alguno de esos archivos
por ejemplo:
Este seria el archivo en custom/modules/Notes/logic_hooks.php para el modulo de notas

<?php
$hook_version = 1;
$hook_array = Array();
$hook_array['before_save'] = Array();
$hook_array['before_save'][] = Array(1, 'before', 'custom/modules/Notes/before.php','before_notes', 'before_notes_save');
?>

y este otro seria el archivo before.php (creado en esa ruta):

<?php
 
if (!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
class before_notes{
	function before_notes_save(&$bean, $event, $arguments){
		 
        $nombre_modulo = $bean->name;
		
        echo "<script>
             alert('".$nombre_modulo."');
        </script>";

	}          
}
 
?>

prueba algo asi y dime!
si no funciona hay que ir a las views/view.edit.php y ahi puedes llamar al bean del modulo y todos sus datos: $this->bean->name

Hola! Es correcto y ahora ya logré recibir un mensaje a la hora de guardar en el módulo.
Por si estoy yendo para el lado incorrecto: Mi idea es verificar el dato que ingresa como “nombre” en el registro que se está cargando y valide contra la base de datos que ese “nombre” no exista, en caso que si, que ese sea el mensaje que reciba el usuario.
Estaría ok encararlo asi?

hice algo así
pero de otro modo y por js
no use hooks

en la vista de edición :
custom\modules\MODULO\views\view.edit.php
(si no existe, hay que crear uno siguiendo los pasos en la documentación de suite crm, si existe modules\MODULO\views\view.edit.php hay que heredarlo)

tienes que llamar a un script js
y en él js haces la logica:

$('#part_number').keyup(function(){
	var cod = $("#part_number").val(); //console.log(cod);

        // llamada ajax a un archivo php donde realizas la query a la base de datos
	$.post('index.php/custom/modules/MODULO/archivo.php',
        {
             codigo: $("#part_number").val(), record: document.EditView.record.value
        }  
        function(data) {
               console.log(data);

		if (data === 1) { 
			removeFromValidate('EditView', 'part_number');
			addToValidate('EditView', 'part_number', 'date', true, 'Name Required');
			mostrar_modal('Este código ya está utilizado');
			//$('#nro_iden_value_result').html('<strong style="color:red;"> &#x2717;</strong>');
			$("#part_number").val('');
			$("#part_number").css({"background":"#d8f5ee"});//default
		}
		else {
			removeFromValidate('EditView', 'part_number');
			addToValidate('EditView', 'part_number', '', true, 'Name Required');
			//$('#nro_iden_value_result').html('<strong style="color:green;"> &#x2713;</strong>');
			$("#part_number").css({"background":"#82e0aa"});//verde
		}
	});
});

el evento keyup de jquery es lo mismo que el onkeyup de js, y se ejecuta cada vez que escribes en el campo

yo lo hice para el part_number, tenia mas condiciones pero se las saque porque sino te iba a entreverar

asi usas la funcion addToValidate que viene ya en el crm y se encarga de validar los campos
hay otras funciones mas que tienen diferentes definiciones si buscan en google aparece

saludos, espero que te ayude

1 Like

Para ese tipo de cosa - validación, la solución presentada (en el front-end, con JS) es bastante mejor, pués comunica inmediatamente al usuario cual es el problema, e le permite corregir antes de escribir a la base de datos…

:clap:

1 Like

mil gracias! pruebo de esa forma.