getBeans () для отношения возвращает пустой массив - PullRequest
0 голосов
/ 07 марта 2019

Я создаю собственный класс ACL, который проверяет, существует ли связь между записями, и, если это так, загружает все связанные записи в этот конкретный компонент. Я посмотрел на сахарную документацию, в которой говорится, что load_relationship($relationshipName) используется для проверки существования взаимосвязи и getBeans() для загрузки всех связанных записей (в виде массива объектов). Я реализовал это в своем классе, но по какой-то причине, какой бы модуль и отношения я не использовал, он всегда возвращает пустой массив.

Данные, которые я использую для проверки, состоят из 3 частей:

  1. Модуль доступа к данным
  2. Имя отношения с целевым модулем (не имя модуля)
  3. Идентификатор записи о доступе к данным

Ссылка здесь в сахарном сообществе показывает похожую проблему, с которой я столкнулся, но ответ на нее не так решает мою проблему

Вот мой пользовательский ACL:

namespace Sugarcrm\Sugarcrm\custom\clients\base;

class CustomACL
{
    const ACL_NONE = 0;
    const ACL_READ_ONLY = 1;
    const ACL_READ_WRITE = 2;

    public static function checkRelated($module, $linkedRelationshipName, $id)
    {
        $bean = \BeanFactory::getBean($module);
        if ($bean->load_relationship($linkedRelationshipName)) {
            return self::checkRecordRelated($bean, $id,$linkedRelationshipName);
        } else {
            return false;
        }
    }

    /**
     * Checks if record is related
     * @param $bean
     * @param $id
     * @param $linkedModule
     * @return bool
     */
    protected static function checkRecordRelated($bean, $id, $linkedModule)
    {
        $bean->retrieve_by_string_fields(array(
            "id" => $id
        ));
        if ($bean->load_relationship($linkedModule)) {
            $relatedRecords = $bean->$linkedModule->getBeans();
            return $relatedRecords;
        } else {
            return false;
        }
    }

}

Этот класс должен работать для любого модуля, даже если он пользовательский или не пользовательский. Я пытался использовать свой пользовательский модуль и даже модули по умолчанию (лиды, аккаунты и т. Д.), Но ни один из них не возвращает ничего, кроме пустого массива.

1 Ответ

0 голосов
/ 07 марта 2019

Я подозреваю, что проблема в том, что вы повторно используете ранее пустой бин, для которого вы уже загрузили ту же ссылку, используя load_relationship() раньше.
При втором вызове load_relationship(), возможно, Sugarвозвращает кэшированный результат первого вызова (поскольку ссылка уже помечена как загруженная), поэтому снова возвращает тот же пустой массив.

Поэтому вместо использования

$bean->retrieve_by_string_fields(array(
        "id" => $id
    ));

Iпредложил бы создать новый компонент, например, используя

if (empty($id)) {
    return false;
}
$bean = BeanFactory::retrieveBean($module, $id);
if (!$bean) {
    return false;
}

(который на самом деле не должен быть слишком медленным, поскольку компонент, вероятно, уже кэширован)

Примечания:

  • Ваши имена переменных несколько сбивают с толку.$linkedRelationshipName и $linkedModule не должны содержать ни имени отношения, ни имени модуля, но имя поля типа ссылки.

РЕДАКТИРОВАТЬ:

Повторно: Документация там может вводить в заблуждение, но load_relationship() делает не ожидает имя отношения в качестве параметра.Он ожидает, что имя ссылки !.

от data/SugarBean.php:

/**
 * Loads the request relationship. This method should be called before performing any operations on the related data.
 *
 * This method searches the vardef array for the requested attribute's definition. If the attribute is of the type
 * link then it creates a similary named variable and loads the relationship definition.
 *
 * @param string $link_name link/attribute name.
 *
 *@return nothing.
 */
function load_relationship($link_name)

Так что не забудьте проверить VarDefs каждого модуля на правильное имя ссылки.

Например,

  • имя отношения: accounts_contacts
  • поле ссылки для этого отношения в учетной записи: contacts,
    , поэтому вы должны звонить $accountBean->load_relationship('contacts')
  • поле ссылки для этого отношения в контакте: accounts,
    , поэтому вы должны звонить $contactBean->load_relationship('accounts')

Примечание: имена ссылок в основном произвольны для разных модулей, не полагайтесь на то, что они являются строчными / единственными / множественными числами связанного модуля.В некоторых случаях (и для пользовательских отношений) их не будет.

...