我最近从 Vtiger 6 升级到 7.2(全新安装),并且我对使用
query
操作的 REST API 的所有请求都不再有效。请求针对哪个模块并不重要,例如联系人、潜在客户、客户。所有其他类型的操作都在工作,例如检索、描述,但诸如 select * from Contacts where email = '[email protected]';
之类的查询将失败,并从 Vtiger 服务器返回 500 内部服务器错误。
这是我的 HTTP 请求的示例(为了便于阅读,查询参数未编码):
https://crm.myendpoint.com/webservice.php?sessionName=[mysession]&operation=query&query=select * 来自联系人,其中电子邮件 = '[电子邮件受保护]';
我用来进行查询的代码与我使用 Vtiger 版本 6 时相比完全没有修改,并且请求当时工作正常。我已打开服务器上的调试日志记录,但没有错误。
服务器正在接收并处理请求。在某一时刻,它将数据转储到我正在查询的联系人的日志中(所有看起来都是正确的),然后这是结束之前的日志记录的最后几行:
Mon Jan 20 17:13:41 2020,292 [8010] DEBUG webservice - Entering isPermitted(Contacts,DetailView,) method ...
Mon Jan 20 17:13:41 2020,292 [8010] DEBUG webservice - Entering getActionid(DetailView) method ...
Mon Jan 20 17:13:41 2020,292 [8010] INFO webservice - get Actionid DetailView
Mon Jan 20 17:13:41 2020,292 [8010] INFO webservice - action id selected is 4
Mon Jan 20 17:13:41 2020,292 [8010] DEBUG webservice - Exiting getActionid method ...
Mon Jan 20 17:13:41 2020,292 [8010] DEBUG webservice - Exiting isPermitted method ...
Mon Jan 20 17:13:41 2020,293 [8010] DEBUG webservice - Entering getColumnFields(Accounts) method ...
Mon Jan 20 17:13:41 2020,293 [8010] DEBUG webservice - in getColumnFields Accounts
Mon Jan 20 17:13:41 2020,293 [8010] DEBUG webservice - Prepared sql query being executed : SELECT tabid, fieldname, fieldid, fieldlabel, columnname, tablename, uitype, typeofdata, presence
FROM vtiger_field WHERE tabid in (?)
Mon Jan 20 17:13:41 2020,293 [8010] DEBUG webservice - Prepared sql query parameters : [6]
Mon Jan 20 17:13:41 2020,293 [8010] DEBUG webservice - Exiting getColumnFields method ...
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - Entering getColumnFields(Accounts) method ...
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - in getColumnFields Accounts
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - Exiting getColumnFields method ...
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - Prepared sql query being executed : select 1 from vtiger_crmentity where crmid=? and deleted=0 and setype='Accounts'
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - Prepared sql query parameters : [9637]
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG user - Entering Users() method ...
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - Entering getColumnFields(Users) method ...
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - in getColumnFields Users
Mon Jan 20 17:13:41 2020,294 [8010] DEBUG webservice - Exiting getColumnFields method ...
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG user - Exiting Users() method ...
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Entering getColumnFields(Users) method ...
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - in getColumnFields Users
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Exiting getColumnFields method ...
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Prepared sql query being executed : select 1 from vtiger_users where id=? and deleted=0 and status='Active'
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Prepared sql query parameters : [1]
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Prepared sql query being executed : select groupname from vtiger_groups where groupid = ?
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Prepared sql query parameters : [1]
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Prepared sql query being executed : select first_name from vtiger_users where id = ?
Mon Jan 20 17:13:41 2020,295 [8010] DEBUG webservice - Prepared sql query parameters : [1]
我认为这可能是某种权限问题,但在这种情况下服务器肯定不会返回 500。无论如何,我尝试使用 2 个不同的用户运行查询,这两个用户都具有管理员角色。
此问题仅发生在查询操作中,与查询的模块无关。有什么办法可以进一步调试吗?
此修复使其正常工作。
综上所述,
getAllAccessibleTags
中第199行调用的不存在的方法include/Webservices/VtigerModuleOperation.php
需要改为getAllAccessible
。
此错误已通过问题 #1217 Fetch tag details of Records for requests made via Webservices 得到解决,该修复应包含在 Vtiger 7.2.1 中,该版本在撰写本文时尚未发布。以下是在提交 7881fde4 和 072b5cee 中实现的更改:
include/Webservices/VtigerModuleOperation.php [176]
$result = $this->pearDB->pquery($mysql_query, array());
+ $tableIdColumn = $meta->getIdColumn();
$error = $this->pearDB->hasFailedTransaction();
include/Webservices/VtigerModuleOperation.php [191]
- if(!$meta->hasPermission(EntityMeta::$RETRIEVE,$row["crmid"])){
+ if(!$meta->hasPermission(EntityMeta::$RETRIEVE,$row[$tableIdColumn])){
include/Webservices/VtigerModuleOperation.php [194]
- $output[] = DataTransform::sanitizeDataWithColumn($row,$meta);
+ $output[$row[$tableIdColumn]] = DataTransform::sanitizeDataWithColumn($row,$meta);
模块/Vtiger/models/Tag.php [302]
+
+ /**
+ * Function used to return tags for list for records
+ * @param <Array> $records - record ids
+ * @return <Array> tags
+ */
+ public static function getAllAccessibleTags($records) {
+ $tagsList = array();
+ if(count($records) == 0) return $tagsList;
+
+ $currentUser = Users_Record_Model::getCurrentUserModel();
+
+ $db = PearDatabase::getInstance();
+ $query = "SELECT tag,object_id FROM vtiger_freetags
+ INNER JOIN vtiger_freetagged_objects ON vtiger_freetags.id = vtiger_freetagged_objects.tag_id
+ WHERE (vtiger_freetagged_objects.tagger_id = ? OR vtiger_freetags.visibility='public')
+ AND vtiger_freetagged_objects.object_id IN
+ (" . generateQuestionMarks($records) . ")";
+ $params = array($currentUser->getId());
+ $params = array_merge($params, $records);
+
+ $result = $db->pquery($query , $params);
+ $num_rows = $db->num_rows($result);
+
+
+ for($i=0; $i<$num_rows; $i++) {
+ $tagName = decode_html($db->query_result($result, $i, 'tag'));
+ $record = decode_html($db->query_result($result, $i, 'object_id'));
+
+ if(empty($tagsList[$record])) {
+ $tagsList[$record] = $tagName;
+ } else {
+ $tagsList[$record] .= ','.$tagName;
+ }
+ }
+ return $tagsList;
+ }