0

このエラーが発生します:

致命的なエラー: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」が出力されます...これがトレースしたコードです...

4

2 に答える 2