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) 时,我遇到了一些奇怪的问题。
行为和输出
- 根据文档,我们初始化 API。函数error_get_last()(在fetch之后调用)指出核心只读文件(我们不允许修改它)包含一个错误:
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 )
- 初始化完成后,我们调用fetch函数获取一个账号。如果我们给了一个错误的 ID,它 returns 一个错误:
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
}
尝试、解决方法和疑难解答信息
- 配置:使用
InitConnectAPI()
的账号有权限
- 初始化:调用
InitConnectAPI()
没有抛出任何异常(添加了一个 try - catch 块)
- 调用获取函数:如上所述,调用
RNCPHP\Account::fetch($act_id)
找到帐户(invalid_id => 错误)但没有设法填充字段
RNCPHP::fetch($correct_id)
调用没有抛出异常
当我尝试按照知识基础 API 中的示例检索答案时,行为是相同的:$token = \RNCK::StartInteraction(...) ; \RNCK::searchContent($token, 'lorem ipsum');
使用 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());
问题:
- 你们中有人遇到过同样的问题吗?什么是 workaround/fix 可以帮助我解决它?
- 根据
RNCPHP\Account::fetch($correct_usr_id)
函数行为,我们可以推测问题出在 'fields populating' 步骤,这可能是核心的一部分(我无权处理)。我应该如何处理这个问题(获取是静态的,帐户看起来并不抽象)?
- 我尝试使用
debug_backtrace()
函数来了解可能出现的问题,但它没有输出相关信息。有什么办法可以获得更多调试信息吗?
提前致谢,
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_r
在 if
条件之后的对象,那么您会看到 UpdatedTime 变量数据,因为它是在条件检查时加载的。
当我在 tutorials/documentations 之后尝试 fetch(Connect PHP API)/searchContent(Knowledge Foundation API) 时,我遇到了一些奇怪的问题。
行为和输出
- 根据文档,我们初始化 API。函数error_get_last()(在fetch之后调用)指出核心只读文件(我们不允许修改它)包含一个错误:
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 )
- 初始化完成后,我们调用fetch函数获取一个账号。如果我们给了一个错误的 ID,它 returns 一个错误:
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
}
尝试、解决方法和疑难解答信息
- 配置:使用
InitConnectAPI()
的账号有权限 - 初始化:调用
InitConnectAPI()
没有抛出任何异常(添加了一个 try - catch 块) - 调用获取函数:如上所述,调用
RNCPHP\Account::fetch($act_id)
找到帐户(invalid_id => 错误)但没有设法填充字段 RNCPHP::fetch($correct_id)
调用没有抛出异常当我尝试按照知识基础 API 中的示例检索答案时,行为是相同的:
$token = \RNCK::StartInteraction(...) ; \RNCK::searchContent($token, 'lorem ipsum');
使用 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());
问题:
- 你们中有人遇到过同样的问题吗?什么是 workaround/fix 可以帮助我解决它?
- 根据
RNCPHP\Account::fetch($correct_usr_id)
函数行为,我们可以推测问题出在 'fields populating' 步骤,这可能是核心的一部分(我无权处理)。我应该如何处理这个问题(获取是静态的,帐户看起来并不抽象)? - 我尝试使用
debug_backtrace()
函数来了解可能出现的问题,但它没有输出相关信息。有什么办法可以获得更多调试信息吗?
提前致谢,
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_r
在 if
条件之后的对象,那么您会看到 UpdatedTime 变量数据,因为它是在条件检查时加载的。