Knowledge & Connect PHP API,已找到对象(帐户或答案)但仅包含空字段

Knowledge & Connect PHP API, Found object(Account or Answer) but contains only null fields

当我在 tutorials/documentations 之后尝试 fetch(Connect PHP API)/searchContent(Knowledge Foundation API) 时,我遇到了一些奇怪的问题。

行为和输出

Array ( [type] => 8 [message] => Undefined index: REDIRECT_URL [file] => /cgi-bin/${interface_name}.cfg/scripts/cp/core/framework/3.2.4/init.php [line] => 246 )

Invalid ID: No such Account with ID = 32

否则,提供正确的 ID returns 一个所有字段都填充为 NULL 的帐户对象:

object(RightNow\Connect\v1_2\Account)#22 (25) {
  ["ID"]=>
  NULL
  ["LookupName"]=>
  NULL
  ["CreatedTime"]=>
  NULL
  ["UpdatedTime"]=>
  NULL
  ["AccountHierarchy"]=>
  NULL
  ["Attributes"]=>
  NULL
  ["Country"]=>
  NULL
  ["CustomFields"]=>
  NULL
  ["DisplayName"]=>
  NULL
  ["DisplayOrder"]=>
  NULL
  ["EmailNotification"]=>
  NULL
  ["Emails"]=>
  NULL
  ["Login"]=>
  NULL
  /* [...] */
  ["StaffGroup"]=>
  NULL
}

尝试、解决方法和疑难解答信息

  1. 配置:使用InitConnectAPI()的账号有权限
  2. 初始化:调用 InitConnectAPI() 没有抛出任何异常(添加了一个 try - catch 块)
  3. 调用获取函数:如上所述,调用 RNCPHP\Account::fetch($act_id) 找到帐户(invalid_id => 错误)但没有设法填充字段
  4. RNCPHP::fetch($correct_id) 调用没有抛出异常

  5. 当我尝试按照知识基础 API 中的示例检索答案时,行为是相同的:$token = \RNCK::StartInteraction(...) ; \RNCK::searchContent($token, 'lorem ipsum');

  6. 使用 PHP 的 SoapClient,我设法检索填充的对象。但是,它不是标准的一部分,自调用本地 WebService 不是一个好的做法。

重现问题的代码

error_reporting(E_ALL);
require_once(get_cfg_var('doc_root') . '/include/ConnectPHP/Connect_init.phph');
InitConnectAPI();
use RightNow\Connect\v1_2 as RNCPHP;
/* [...] */
try
{
  $fetched_acct = RNCPHP\Account::fetch($correct_usr_id);
} catch ( \Exception $e)
{
  echo ($e->getMessage());
}
// Dump part 
echo ("<pre>");
var_dump($fetched_acct);
echo ("</pre>");

// The core's error on which I have no control
print_r(error_get_last());

问题:

提前致谢,

Oracle 服务云使用延迟加载从使用 Connect for PHP API 的查询数据填充对象变量。根据您的示例,当您输出对象的结果时,它将显示为每个变量都是空的。但是,如果您访问该参数,则它变为可用。这只是当您尝试打印您的对象时的一个问题,就像这个例子。访问数据应该是即时的。

要打印您的对象,就像在您的示例中一样,您需要遍历对象变量并首先访问每个变量。您可以构建一个助手 class 来通过反射来做到这一点。但是,为了用单个字段进行说明,请执行以下操作:

$acct = RNCPHP\Account::fetch($correctId);
$acct->ID;
print_r($acct); // Will now "show" ID, but none of the other fields have been loaded.

在现实世界中,您可能只想对数据进行操作。因此,即使您无法 "see" 对象中的数据,它仍然存在。在下面的示例中,我们正在访问帐户的更新时间,然后在对象满足条件时对其执行操作。

//Set to disabled if last updated < 90 days ago
$acct = RNCPHP\Account::fetch($correctId);
$chkDate = time() - 7776000;
if($acct->UpdatedTime < $chkDate){
    $acct->Attributes->PermanentlyDisabled = true;
    $acct->save(RNCPHP\RNObject::SuppressAll);
}

如果您要 print_rif 条件之后的对象,那么您会看到 UpdatedTime 变量数据,因为它是在条件检查时加载的。