Cuando creamos un módulo personalizado en SugarCRM (por ejemplo «grt_Contratos_Proveedores») y creamos una relación entre dicho módulo y uno que emplee el tipo de campo «Relacionado con» o «Related to», como por ejemplo el módulo «Tareas» o «Tasks», querremos probablemente poder buscar todas las tareas relacionadas con nuestro nuevo módulo «grt_Contratos_Proveedores» desde el formulario de búsqueda simple o avanzada de «Tareas».
Bien, pues existe un bug en SugarCRM que impide que se muestren tareas relacionadas con un módulo personalizado si en el nombre de dicho módulo hay guiones bajos (_), mostrándose el siguiente error fatal:
mod_fcgid: stderr: PHP Fatal error: require_once(): Failed opening required '' (include_path='/var/www/vhosts/daniloaz.com/subdomains/sugarcrm64/include/..:.:') in /var/www/vhosts/daniloaz.com/subdomains/sugarcrm64/data/SugarBean.php on line 3185, referer: https://sugarcrm64.daniloaz.com/index.php?module=Tasks&action=index
Origen del problema
Esto es así porque para construir la cláusula WHERE de la sentencia SQL que genera el formulario de búsqueda, en el caso de los tipos de campo «Related to» nativos de SugarCRM se obtienen las dos entidades o módulos relacionados entre sí mediante una expresión regular defectuosa que aparece unas pocas líneas antes de la línea 3185 del fichero data/SugarBean.php y que no tiene en consideración los guiones bajos que puedan aparecer en el nombre de dichas entidades relacionadas:
$match = preg_match('/(^|[\s(])parent_(\w+)_(\w+)\.name/', $where, $matches);
Así, en el caso de nuestro módulo «grt_Contratos_Proveedores», jamás se podrá obtener un resultado de búsqueda satisfactorio porque el nombre de módulo que toma SugarCRM a partir de la expresión regular es «grt_Contratos_Proveedores_grt» en lugar de «grt_Contratos_Proveedores». Esto provoca que cuando se procede a ejecutar la línea de código 3185, «require_once($beanFiles[$beanList[$joinModule]])», el script falle mostrando un error fatal porque la variable $joinModule no tiene el valor correcto y jamás encuentra el módulo «grt_Contratos_Proveedores_grt» en la lista de módulos presentes en la instancia de SugarCRM, y que es recogida por la variable $beanList.
Error: Your Requested widget " ai_widget-6" is not in the widget list.
- [do_widget_area above-nav-left]
- [do_widget_area above-nav-right]
- [do_widget_area footer-1]
- [do_widget id="wpp-4"]
- [do_widget_area footer-2]
- [do_widget id="recent-posts-4"]
- [do_widget_area footer-3]
- [do_widget id="recent-comments-3"]
- [do_widget_area footer-4]
- [do_widget id="archives-4"]
- [do_widget_area logo-bar]
- [do_widget id="oxywidgetwpml-3"]
- [do_widget_area menu-bar]
- [do_widget id="search-3"]
- [do_widget_area sidebar]
- [do_widget id="search-4"]
- [do_widget id="ai_widget-2"]
- [do_widget id="categories-5"]
- [do_widget id="ai_widget-3"]
- [do_widget id="ai_widget-4"]
- [do_widget id="ai_widget-5"]
- [do_widget_area sub-footer-1]
- [do_widget id="text-4"]
- [do_widget_area sub-footer-2]
- [do_widget_area sub-footer-3]
- [do_widget_area sub-footer-4]
- [do_widget_area upper-footer-1]
- [do_widget id="search-2"]
- [do_widget id="recent-posts-2"]
- [do_widget id="recent-comments-2"]
- [do_widget id="archives-2"]
- [do_widget id="categories-2"]
- [do_widget id="meta-2"]
- [do_widget_area upper-footer-2]
- [do_widget_area upper-footer-3]
- [do_widget_area upper-footer-4]
- [do_widget_area widgets_for_shortcodes]
- [do_widget id="search-5"]
- [do_widget id="ai_widget-6"]
- [do_widget_area wp_inactive_widgets]
- [do_widget id="wpp-2"]
- [do_widget id="text-1"]
- [do_widget id="recent-posts-3"]
- [do_widget id="categories-3"]
- [do_widget id="archives-3"]
- [do_widget id="icl_lang_sel_widget-3"]
Como nota aclaratoria, el prefijo grt_ es una clave que siempre añado al nombre de un nuevo módulo personalizado que indica el cliente para el cual estoy desarrollando dicho módulo, de forma que sea único y no se creen interferencias con otros posibles módulos personalizados de terceros.
Solución
La solución a este defecto es sencilla una vez se conoce el origen del problema, y consiste en modificar la expresión regular errónea así:
if (!strstr($where, 'grt_')) $match = preg_match('/(^|[\s(])parent_(\w+)_(\w+)\.name/', $where, $matches); else $match = preg_match('/(^|[\s(])parent_(grt_\w+)_(grt_\w+)\.name/', $where, $matches);
Un vez hecho esto habrá quedado solucionado el problema, y podremos realizar búsquedas de tareas relacionadas con nuestro nuevo módulo sin problemas.
Deja una respuesta