当我尝试在tutorials/documentations之后获取(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 )
无效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
}
尝试,解决方法和问题排查信息
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());
问题:
RNCPHP\Account::fetch($correct_usr_id)
函数行为,我们可以推测问题来自'字段填充'步骤,这可能是核心的一部分(我没有权力)。我该怎么处理这个问题(获取是静态的,帐户似乎不是抽象的)?debug_backtrace()
函数,以便对可能出错的内容有一些了解,但它不会输出相关信息。有什么方法可以获得更多的调试信息吗?提前致谢,
答案 0 :(得分: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_r
条件之后进入if
对象,那么您将看到UpdatedTime变量数据,因为它是在条件检查时加载的。