我正在创建一个自定义ACL类,该类将检查记录之间是否存在关系,如果存在,则将所有相关记录加载到该特定bean。我看过Sugar文档,该文档说使用load_relationship($relationshipName)
来检查是否存在关系,并使用getBeans()
来加载所有相关记录(作为对象数组)。我已经在类中实现了它,但是由于某种原因,无论我使用哪个模块和关系,它总是返回一个空数组。
我用于检查的数据分为三部分:
Sugar社区的链接here显示了我遇到的类似问题,但是答案并不能解决我的问题
这是我的自定义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;
}
}
}
该类应适用于任何模块,即使它是自定义或非自定义的。我尝试使用自定义模块,甚至使用默认模块(潜在客户,客户等),但除了空数组之外,它们均未返回任何内容。
答案 0 :(得分:1)
我怀疑问题是您正在重用以前为空的bean,之前您已经使用load_relationship()
为其加载了相同的链接。
在第二个{{1 }}调用,Sugar可能会从第一个调用返回缓存的结果(因为该链接已经在内部被标记为已加载),因此再次返回相同的空数组。
因此而不是使用
load_relationship()
我建议创建一个新的bean,例如使用
$bean->retrieve_by_string_fields(array(
"id" => $id
));
(实际上应该不会太慢,因为bean可能已经被缓存了)
注意:
if (empty($id)) {
return false;
}
$bean = BeanFactory::retrieveBean($module, $id);
if (!$bean) {
return false;
}
和$linkedRelationshipName
既不应该包含关系名称也不应该包含模块名称,而应包含链接类型字段的名称。编辑:
重申:
该文档可能会误导您,但是$linkedModule
不会不期望以关系名称作为参数。期望的是链接名称!。
来自load_relationship()
:
data/SugarBean.php
因此,请确保检查每个模块的VarDef以获取正确的链接名称。
例如
/**
* 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)
accounts_contacts
,contacts
$accountBean->load_relationship('contacts')
,accounts
注意:链接名称在不同模块之间基本上是任意的,不要依赖于链接模块的小写单数或复数形式。在某些情况下(对于自定义关系),不会。