Операции запроса Vtiger 7.2 к REST API возвращают 500 ошибок - PullRequest
1 голос
/ 20 января 2020

Я недавно обновил Vtiger 6 до 7.2 (чистая установка), и все мои запросы к REST API, использующие операцию query, больше не работают. Не имеет значения, к какому модулю относится запрос, например, Контакты, Лиды, Аккаунты. Все другие типы операций работают, например, извлекать, описывать, но запрос, такой как select * from Contacts where email = 'foo@bar.com';, не будет выполнен с 500 Internal Server Error, возвращенной с сервера Vtiger.

Вот пример моего HTTP-запроса (параметр запроса не читается для удобства чтения):

https://crm.myendpoint.com/webservice.php?sessionName= [mysession] & operation = query & query = select * из контактов, где электронная почта = 'foo@bar.com';

Код, который я использую для выполнения своих запросов, полностью не изменился с тех пор, как я использовал 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]

I Я думал, что это может быть какая-то проблема с разрешением, но, конечно, сервер не вернет 500 в этой ситуации. В любом случае я пробовал запускать запросы с двумя разными пользователями, оба из которых имеют роль администратора.

Эта проблема только возникает с операциями запроса, независимо от запрашиваемого модуля. Есть ли способ, как я могу отладить это дальше?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Эта ошибка была устранена с помощью проблемы # 1217 Извлечь подробности тега из записей для запросов, сделанных через веб-службы , и исправление должно быть включено в 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;
+    }
1 голос
/ 21 января 2020

Это исправление заставило его работать.

Таким образом, несуществующий метод getAllAccessibleTags, вызываемый в строке 199 в include/Webservices/VtigerModuleOperation.php, необходимо изменить на getAllAccessible.

...