在使用 SuiteCRM 管理员在后台配置菜单,选择将所有菜单隐藏。。。不要问为什么,就是这样配置了。
然后管理员再也无法使用 SuiteCRM 了,登录之后就报 500 错误,无法使用,也无法恢复之前的配置。 其他用户倒是可以正常登录。
报错信息
从日志看起来确实是找不到菜单,导致报错:
FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given in suitecrm/include/GroupedTabs/GroupedTabStructure.php:85
Stack trace:
suitecrm/include/GroupedTabs/GroupedTabStructure.php(85): in_array()
suitecrm/include/MVC/View/SugarView.php(629): GroupedTabStructure->get_tab_structure()
suitecrm/include/MVC/View/SugarView.php(202): SugarView->displayHeader()
suitecrm/include/MVC/Controller/SugarController.php(432): SugarView->process()
suitecrm/include/MVC/Controller/SugarController.php(363): SugarController->processView()
suitecrm/include/MVC/SugarApplication.php(101): SugarController->execute()
suitecrm/index.php(52): SugarApplication->execute()
{main}
thrown in suitecrm/include/GroupedTabs/GroupedTabStructure.php on line 85" while reading response header from upstream, request: "GET /index.php?module=Home&action=index HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php8.1-fpm.sock:", referrer: "https://xxx/index.php?action=Login&module=Users&login_module=Home&login_action=index"
数据库
直接通过数据库很难定位,因为有上百张表,找到了几个感觉相关的表。尝试修改了一些配置,还是没有解决。
user_preferences 表看起来有相关性,而且修改时间也跟操作时间相契合,但是修改了一堆配置,依旧无效。下面会提到。
displayHeader
无奈看看代码,也是没有头绪。
include/MVC/View/SugarView.php(202): SugarView->displayHeader()
include/MVC/View/SugarView.php(629): GroupedTabStructure->get_tab_structure()
 612                 require_once('include/GroupedTabs/GroupedTabStructure.php');
 613                 $groupedTabsClass = new GroupedTabStructure();
 614                 $modules = query_module_access_list($current_user);
 615
 616                 //handle with submoremodules
 617                 $max_tabs = $current_user->getPreference('max_tabs');
 618                 // If the max_tabs isn't set incorrectly, set it within the range, to the default max sub tabs size
 619                 if (!isset($max_tabs) || $max_tabs <= 0 || $max_tabs > 10) {
 620                     // We have a default value. Use it
 621                     if (isset($GLOBALS['sugar_config']['default_max_tabs'])) {
 622                         $max_tabs = $GLOBALS['sugar_config']['default_max_tabs'];
 623                     } else {
 624                         $max_tabs = 8;
 625                     }
 626                 }
 627
 628                 $subMoreModules = false;
 629                 $groupTabs = $groupedTabsClass->get_tab_structure(get_val_array($modules));
 630                 // We need to put this here, so the "All" group is valid for the user's preference.
 631                 $groupTabs[$app_strings['LBL_TABGROUP_ALL']]['modules'] = $fullModuleList;
YTowOnt9
base64 解码后是:
a:0:{}
哪些记录受影响
select * from suitecrm.user_preferences where assigned_user_id = 1 and contents = "YTowOnt9";
共 12 行记录需要确认。
- 
ETag:TODO 无参考项
 - 
Dashboard:TODO 无参考
 - 
Opportunities:TODO
 - 
SecurityGroups:时间戳,pass
 - 
Users:没有其他用户的参考,但从时间戳看,也不是修改项,pass
 - 
Emails:都是一样的空,pass
 - 
ModuleBuilder:时间戳,pass
 - 
Assistant: TODO 无参考,但是可以考虑 delete,因为创建时间非部署时间
 - 
AOS_Products:重点:TODO 无参考,但是可以考虑 delete,因为创建时间非部署时间
 - 
AOS_Contracts:重点:TODO 无参考,但是可以考虑 delete,因为创建时间非部署时间
 - 
AOR_Reports:重点:TODO 无参考,但是可以考虑 delete,因为创建时间非部署时间
 - 
ACLRoles:TODO 无参考,但是可以考虑 delete,因为创建时间非部署时间
 
select * from suitecrm.user_preferences where assigned_user_id = 1 and category in ("AOS_Products", "AOS_Contracts", "AOR_Reports");
从 github 代码库中查找初始值
没有找到。
最后
很无奈,只能重新部署了。
感觉这样排查下去,可能一天也不能搞定(大周末早上我已经排查了3个小时)。而我手头还有其他紧急的项目。
所以干脆重新部署。
部署之后,做个数据库备份。
浪费生命!
重新部署
- 备份 themes 目录:themes/SuiteP/tpls
 
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式