このエラーが発生します:
致命的なエラー:188行目のD:\ xampp \ htdocs \ fsc \ app \ Model \ Datasource \ soapclient \ SforceBaseClient.phpの非オブジェクトでメンバー関数__setSoapHeaders()を呼び出します。
create()メソッドを使用してsalesforce account-listにアカウントデータを追加しようとすると、cakephpフレームワークを使用しています。この__setSoapHeaders()はこのエラーを与えるsetHeader()関数にあります。このエラーの解決策は何ですか?
sforceBaseclient.phpには、setHeader()という関数が1つあります。
private function setHeaders($call=NULL) {
**$this->sforce->__setSoapHeaders(null); [it gives above error.]**
.
.
}
ユーザーが登録されるか、当社のWebサイトでトランザクションを実行するときに、セールスフォースアカウントにアカウントの詳細を追加したいと思います。だから私はテストのためだけに私のアカウントモデルに次のコードを入れました、それは問題を引き起こしているかもしれません:
$mySforceConnection = new SforceEnterpriseClient();
$fieldsToUpdate = array(
'AccountNumber' => 123456,
'BillingCity' => 'Testcity',
'BillingCountry' => 'Testcountry',
'BirthDate' => '27-04-1992'
);
$sObject = new stdClass();
$sObject->fields = $fieldsToUpdate;
$sObject->type = 'Account';
try {
$CreateResponse = $mySforceConnection->create(array ($sObject),'Account');
} catch (Exception $e) {
echo "<BR>Error Creating the Case! ";
echo $e->faultstring;
exit;
}
//To Make sure the case was created successfully.
if ($CreateResponse->success != 1) {
echo "<BR>Error Creating the Account. ";
print_r($CreateResponse->errors->message);
exit;
}
このエラーの解決策は何ですか?
最初にconnect()が呼び出され、コードは次のようになります。
public function connect() {
if (empty($this->config['username']) || empty($this->config['password']) || empty($this->config['wsdl'])) {
$this->error = "Your username-password-wsdl must all be set";
$this->showError();
return false;
}
$wsdl = APP.'model/datasource/soapclient/'.$this->config['wsdl'];
$wsdl = str_replace('\\','/',$wsdl);
$mySforceConnection = new SforceEnterpriseClient();
$mySforceConnection->createConnection($wsdl);
$mySoapClient = $mySforceConnection->createConnection($wsdl);
$mylogin = $mySforceConnection->login($this->config['username'], $this->config['password']);
$this->client = $mySforceConnection;
return $mySforceConnection;
}
この関数では、createConnectionが表示され、Loginが呼び出されます...コードがあります
public function createConnection($wsdl, $proxy=null) {
$_SERVER['HTTP_USER_AGENT'] = 'Salesforce/PHPToolkit/1.0';
$soapClientArray = null;
if (phpversion() > '5.1.2') {
$soapClientArray = array (
'user_agent' => 'toolkit-php',
'encoding' => 'utf-8',
'trace' => 1,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP
);
} else {
$soapClientArray = array (
'user_agent' => 'toolkit-php',
'encoding' => 'utf-8',
'trace' => 1
);
}
if ($proxy != null) {
$proxySettings = array();
$proxySettings['proxy_host'] = $proxy->host;
$proxySettings['proxy_port'] = $proxy->port; // Use an integer, not a string
$proxySettings['proxy_login'] = $proxy->login;
$proxySettings['proxy_password'] = $proxy->password;
$soapClientArray = array_merge($soapClientArray, $proxySettings);
}
$this->sforce = new SoapClient($wsdl, $soapClientArray);
return $this->sforce;
}
そしてlogin()
public function login($username, $password) {
$this->sforce->__setSoapHeaders(NULL);
if ($this->callOptions != NULL) {
$this->sforce->__setSoapHeaders(array($this->callOptions));
}
if ($this->loginScopeHeader != NULL) {
$this->sforce->__setSoapHeaders(array($this->loginScopeHeader));
}
$result = $this->sforce->login(array (
'username' => $username,
'password' => $password
));
$result = $result->result;
$this->_setLoginHeader($result);
return $result;
}
このコードは完璧に機能します...上記のように、アカウントモデルでcreate methosを使用してレコードを追加しようとしています。最初に、SforceEnterpriseClient.phpというクラスにあるcreateメソッドが呼び出されます。
public function create($sObjects, $type) {
foreach ($sObjects as &$sobject) {
$sobject = new SoapVar($sobject, SOAP_ENC_OBJECT, $type, $this->namespace);
}
$arg = $sObjects;
return parent::_create(new SoapParam($arg, "sObjects"));
}
ここで、__createがsorceBaseClientクラスにあるehichと呼ばれていることがわかります。
protected function _create($arg) {
$this->setHeaders("create");
return $this->sforce->create($arg)->result;
}
ここでは、最初のsetHeader関数が呼び出されます。
private function setHeaders($call=NULL) {
**$this->sforce->__setSoapHeaders(null);** // as I told this line gives error at this point..if I comment it below __setSoapHeaders() gives error.and if I comment that create() function gives error....
$header_array = array (
$this->sessionHeader
);
$header = $this->callOptions;
if ($header != NULL) {
array_push($header_array, $header);
}
if ($call == "create" ||
$call == "merge" ||
$call == "update" ||
$call == "upsert"
) {
$header = $this->assignmentRuleHeader;
if ($header != NULL) {
array_push($header_array, $header);
}
}
if ($call == "login") {
$header = $this->loginScopeHeader;
if ($header != NULL) {
array_push($header_array, $header);
}
}
if ($call == "create" ||
$call == "resetPassword" ||
$call == "update" ||
$call == "upsert"
) {
$header = $this->emailHeader;
if ($header != NULL) {
array_push($header_array, $header);
}
}
if ($call == "create" ||
$call == "merge" ||
$call == "query" ||
$call == "retrieve" ||
$call == "update" ||
$call == "upsert"
) {
$header = $this->mruHeader;
if ($header != NULL) {
array_push($header_array, $header);
}
}
if ($call == "delete") {
$header = $this->userTerritoryDeleteHeader;
if ($header != NULL) {
array_push($header_array, $header);
}
}
if ($call == "query" ||
$call == "queryMore" ||
$call == "retrieve") {
$header = $this->queryHeader;
if ($header != NULL) {
array_push($header_array, $header);
}
}
$this->sforce->__setSoapHeaders($header_array);
}
'create'が__createmethosからsetHeader関数に渡されることを理解できません。$call(received parameter)を出力すると、「Query」が出力されます...これがトレースしたコードです...