2

当我尝试按照tutorials/documentations获取(Connect PHP API)/searchContent(Knowledge Foundation API) 时,我遇到了一些奇怪的问题。

行为和输出

  • 根据文档,我们初始化 API。函数 error_get_last()(在 fetch 之后调用)指出核心只读文件(我们不允许修改它)包含错误:
Array ( [type] => 8 [message] => 未定义索引:REDIRECT_URL [file] => /cgi-bin/${interface_name}.cfg/scripts/cp/core/framework/3.2.4/init.php [行] => 246)
  • 初始化后,我们调用 fetch 函数来检索一个帐户。如果我们提供了错误的 ID,它会返回错误:

ID 无效:没有 ID = 32 的此类帐户

否则,提供正确的 ID 会返回一个 Account 对象,其中所有字段都填充为 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. 调用 fetch 函数:如上所述,调用RNCPHP\Account::fetch($act_id)查找帐户(invalid_id => 错误)但无法填充字段
  4. RNCPHP::fetch($correct_id)调用时不抛出异常

  5. 当我尝试按照 Knowledge Foundation 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());

问题:

  • 你们有没有人面临同样的问题?有什么解决方法/修复可以帮助我解决它?
  • 根据RNCPHP\Account::fetch($correct_usr_id)函数行为,我们可以推测问题来自“填充字段”步骤,这可能是核心的一部分(我没有权力)。我应该如何处理这个(获取是静态的,帐户似乎并不抽象)?
  • 我尝试使用该debug_backtrace()功能来了解可能出现的问题,但它不会输出相关信息。有什么办法可以获得更多的调试信息?

提前致谢,

4

1 回答 1

2

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

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

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

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

//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 变量数据,因为它是在条件检查时加载的。

于 2015-07-02T11:57:08.373 回答