Соединение двух модулей SugarCRM в связанном поле с помощью SugarQuery () - PullRequest
1 голос
/ 07 июня 2019

Фон и контекст

Я пытаюсь создать пользовательский модуль REST в SugarCRM 8.0, который объединяет два модуля в связанном поле. Два модуля:

  • Счета (модуль OOTB)
  • ConsumerLeads (пользовательский модуль)

Эти два модуля представляют собой связанное поле с именем w002_consumerleads_accounts_1 , так что когда я вызываю следующую конечную точку, я получаю ответ JSON со всеми данными ConsumerLead, связанными с этой конкретной учетной записью uuid.

/rest/v11_4/Accounts/{ account_uuid }/link/w002_consumerleads_accounts_1

Однако вместо того, чтобы возвращать объединенные результаты на основе учетной записи uuid, мой пользовательский модуль возвращает объединенные результаты на основе другого атрибута учетной записи, который однозначно идентифицирует учетную запись.

/rest/v11_4/customer/{ customer_id }/leads

Причина, по которой я пытаюсь создать собственный модуль для этого (вместо того, чтобы использовать предопределенный api rest, указанный выше), связана с тем, что система, вызывающая этот вызов, не знает uuid учетной записи пользователя Sugar и вместо этого знает бизнес ключ, однозначно идентифицирующий учетную запись (и являющийся атрибутом модуля «Учетные записи»).

Выпуск

Когда я использую SugarQuery в своем пользовательском модуле отдыха для присоединения к Accounts и ConsumerLeads, мои результаты не совпадают с результатами, указанными в первом API отдыха (предопределенном API отдыха). Результат возвращает только модуль «Учетные записи» и не присоединяется к модулю «ConsumerLeads».

Проблема заключается в соединении двух модулей в связанном поле; проблема не связана с использованием клиентского uuid против учетной записи uuid.

Справочные реализации

На основе Руководства для разработчиков SugarCRM я написал следующий фрагмент кода.

    public function GetLinkLeads($api, $args) {

        try {

            $query = new SugarQuery();
            $query->from(BeanFactory::getBean('Accounts'));
            $query->join('w002_consumerleads_accounts_1');
            $query->limit(10);
            $results = $query->execute();

            return $results;

        }  catch ( Exception $e ) {
            return $e->getCode();
        }

        return 1;
    }

На основании всей информации, которую я могу собрать, эта функция должна возвращать первые 10 записей учетной записи, объединенные с их ConsumerLeads. Однако ответ содержит только данные модуля «Учетные записи», он не объединяет данные «ConsumerLeads».

Кроме того, я также попробовал следующий способ.

public function GetLinkLeads($api, $args) {

    try {

        $account = BeanFactory::getBean('Accounts', '4606e963-9213-7764-d83f-4cc050c8473d');

        if ( $account->load_relationship('w002_consumerleads_accounts_1') ) {

            $lead = $account->w002_consumerleads_accounts_1->getBeans();

            return $lead;
        }

    }  catch ( Exception $e ) {
        return $e->getCode();
    }

    return 1;
}

Где 4606e963-9213-7764-d83f-4cc050c8473d - это uuid учетной записи, с которой связан ConsumerLeads, но я все еще не могу получить данные ConsumerLeads для возврата.

Вопрос

Я бы хотел:

  • Используйте SugarQuery () для объединения этих двух модулей на основе связанного поля
  • Используйте остальные API по умолчанию для соединения двух модулей на основе атрибута в модуле Учетные записи (не в учетной записи uuid)

Я нашел этот точный вопрос о переполнении стека, и приведенная выше реализация основана на рекомендации этого поста. Тем не менее, он все еще не присоединяется к записям.

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Попробуйте следующий код:

function outright_load_relationship( $left_bean, $rel_name,$return_beans = 0 ) {
    $rel_obj =  $left_bean->load_relationship( $rel_name );

    if ( !$rel_obj ){
        $rel_name =outright_get_bean_fields( $rel_name );
        $rel_obj =  $left_bean->load_relationship( $rel_name );
    }

    if( $return_beans ){
        $relatedBeans = $left_bean->$rel_name->getBeans();
        return $relatedBeans;
    }

    return $left_bean->$rel_name;

}

function outright_get_bean_fields( $left_bean, $fld_name = false, $fld_key = false ) {
    if( !$fld_name && !$fld_key ) {
        return $left_bean->field_defs;
    } else {
        foreach( $left_bean->field_defs as $key=>$value ) {
            if( $fld_name && $key == $fld_name ) {
                return $left_bean->field_defs[$key];

            } else if( $fld_key && $value[$fld_key] == $fld_name ){
                return $left_bean->field_defs[$key];
            }
        }
    }
}

Все, что вам нужно для правильной передачи $rel_name в вышеуказанных функциях. Пожалуйста, дайте мне знать, если это не работает.

1 голос
/ 09 июня 2019

То, чего вы хотите достичь, должно работать OOTB с использованием API-фильтра и указанием содержимого обязательного поля в определении фильтра ваших запросов. Затем вы должны получить связанную запись, которую вы хотели.

Должно работать как https://stackoverflow.com/a/50608304/4068476

В качестве быстрого теста вы можете попробовать вызвать его в своем браузере или программе (здесь: GET, поэтому я передаю фильтр в строке запроса)

/rest/v11_4/w002_ConsumerLeads?filter[0][w002_consumerleads_accounts_1.consumer_id]={ customer_id }

Примечания :

  • Я угадал написание имени модуля в URL, убедитесь, что прописные / строчные буквы правильные.
  • Если вы хотите получать и учетные записи, и ConsumerLeads в одном запросе - просто используйте API / bulk, чтобы объединить два запроса в один.
...