0

我收到此错误:

致命错误:在第 188 行的 D:\xampp\htdocs\fsc\app\Model\Datasource\soapclient\SforceBaseClient.php 中的非对象上调用成员函数 __setSoapHeaders()。

我正在使用 cakephp 框架。当我尝试使用 create() 方法在 salesforce 帐户列表中添加帐户数据时。这个 __setSoapHeaders() 在 setHeader() 函数中,它给出了这个错误。这个错误的解决方案是什么?

在 sforceBaseclient.php 中,有一个名为 setHeader() 的函数:

private function setHeaders($call=NULL) {
    **$this->sforce->__setSoapHeaders(null); [it gives above error.]**
      .
      .
    }

当用户注册或在我们的网站上进行任何交易时,我想在 salesforce 帐户中添加帐户详细信息。所以我将以下代码放在我的 Account 模型中只是为了测试,可能会产生任何问题:

$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;
            } 


然后登录()

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;
        }


这段代码完美运行......现在正如我上面提到的,我正在尝试使用帐户模型中的创建方法添加记录..所以第一个创建方法调用它在名为 SforceEnterpriseClient.php 的类中

 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 被称为 ehich 在 sorceBaseClient 类中......

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 方法传递给 setHeader 函数的。如果我打印 $call(接收到的参数),它会打印“查询”……所以这是我追踪的代码……

4

2 回答 2

0

我遇到了同样的错误,发现原因是我的 wsdl xml 路径错误 - 您可能需要检查这一行:

$wsdl = APP.'model/datasource/soapclient/'.$this->config['wsdl'];

我现在已经很晚了,但这可能对其他人有帮助!

于 2014-03-19T04:36:07.480 回答
0

有什么不清楚的?PHP 告诉你你在一个错误的对象上调用了一个函数。这正是它所说的:__setSoapHeaders()应该在 SoapClient 对象上调用,而在您的脚本中则不是。换句话说$this->sforce,不是 SoapClient 对象。查看/显示您的其他代码,了解原因。

于 2013-02-07T06:39:57.453 回答