2012-10-19 34 views
2

我寫了一個簡單的身份驗證插件,它使用SOAP webservice來檢查用戶名和密碼。這工作正常。Joomla 2.5身份驗證插件致命錯誤:調用一個非對象的成員函數get()

我想在joomla的管理員中擁有一些參數,如SOAP密碼。所以我已經在xml中添加了參數,它在管理員中顯示得很好。當我試圖得到它的價值在PHP中,我得到:

致命錯誤:調用一個成員函數的get()一個非對象

所以我與其他認證相比,我做它到底同樣的方式....我不明白爲什麼是這樣。

這裏是插件的代碼:

public function __construct() { 
    $nusoap = JPATH_SITE . '/plugins/authentication/ers/nusoap/lib/nusoap.php'; 
    if (! file_exists ($nusoap)){ 
       $response->error_message = "No such file"; 
     return; 
      } 
    require_once ($nusoap); 

} 



function onUserAuthenticate($credentials, $options, &$response) 
{ 



     //Without defaults (the plugin crashes on the first get() bellow) 
     $webservice = $this->params->get('webservice', ''); 
     $group  = $this->params->get('group', ''); 
     $whitepaw = $this->params->get('whitepaw', ''); 



     JRequest::checkToken() or die('Invalid Token'); 
     // For JLog 
     $response->type = 'ERS SOAP Webservice'; 

      // MyCompany does not like blank passwords (So does Joomla ;)) 
    if (empty($credentials['password'])) { 
     $response->status = JAuthentication::STATUS_FAILURE; 
     $response->error_message = JText::_('JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED'); 
     return false; 
    } 

    if (empty($credentials['username'])) { 
     $response->status = JAuthentication::STATUS_FAILURE; 
     $response->error_message = JText::_('Please enter a username'); 
     return false; 
    } 

      // Add a user to joomla 
       function addJoomlaUser($name, $username, $password, $email, $group) { 

          $data = array(
           "name"=>$name, 
           "username"=>$username, 
           "password"=>$password, 
           "password2"=>$password, 
           "email"=>$email, 
           "block"=>0, 
           "groups"=>array("1","2", $group) // the uer is added into the group "public" and "registered" as well as a group of the user's choice. 

          ); 

          $user = clone(JFactory::getUser()); 
          //Write to database 
          if(!$user->bind($data)) { 
           throw new Exception("Could not bind data. Error: " . $user->getError()); 
          } 
          if (!$user->save()) { 
           throw new Exception("Could not save user. Error: " . $user->getError()); 
          } 

         return $user->id; 
       } 


      // Pour supprimer le cache du web-service 
      ini_set('soap.wsdl_cache_enabled', 0); 

      // Nouveau Client SOAP 
      try { 

       // Nouvelle instance de la classe soapClient 
       $client = new SoapClient($webservice, array('trace' => true)); 


       $username = $credentials['username']; 
       $password = $credentials['password']; 



       $result = $client->CheckLogin(array('whitepaw'=>$whitepaw, 'username'=>$username, 'password'=>$password)); 

       if($result->isInDB){ 


         $name = $result->fname.' '.$result->lname; 
         $email = $result->email; 

         $response->error_message = $username.'<br>'.$password.'<br>'.$name.'<br>'.$email."<br><br>". 
           "<b>Request :</b><br>".htmlentities($client->__getLastRequest())."<br><br>". 
           "<b>RESPONSE :</b><br>".htmlentities($client->__getLastResponse())."<br><br>"; 

         if(!$result->email == '' || empty ($result)) { 
          //Todo: check if the user is already in joomla db 
          $user_id = addJoomlaUser($name, $username, $password, $email,$group); 
          $response->status = JAuthentication::STATUS_SUCCESS; 
          //for testing purposes 
          $response->error_message = $user_id; 
         } else { 
          $response->error_message = "The webservice did not return data".$email.'did you see it?'; 

         } 

       } else { 
        $response->status = JAuthentication::STATUS_FAILURE; 
        $response->error_message = 'You do not have yet an account in <a href="http://my.ersnet.org">myers</a>. Please register.<br>'; 
        $response->error_message .= $result->isInDB; 

       } 
       } catch (Exception $fault) { 
        $response->error_message = $fault->getMessage(); 
       } 




} 

}

回答

1

既然你有你自己的構造函數,你需要調用這樣的父類的構造:

public function __construct(& $subject, $params = array()) { 
    $nusoap = JPATH_SITE . '/plugins/authentication/ers/nusoap/lib/nusoap.php'; 
    if (! file_exists ($nusoap)){ 
       $response->error_message = "No such file"; 
     return; 
      } 
    require_once ($nusoap); 
    // call the parent constructor 
    parent::__construct($subject, $params); 
} 

父構造函數是$this->params對象被設置的地方,所以如果你不叫它,那麼$this->params從不設置。這就是爲什麼你得到錯誤說params不是一個對象。

+0

謝謝。我理解你的答案的邏輯。我已經嘗試過,但現在它要求我缺少理由......爲什麼這樣呢?在我的構造函數中,我沒有。 – Samuel

+0

什麼是錯誤? – MrCode

+0

'警告:JPlugin :: __ construct()的參數1丟失,在第30行調用/home/forum/public_html/plugins/authentication/ers/ers.php並在/ home/forum/public_html/libraries/joomla /第55行的plugin/plugin.php致命錯誤:調用第39行的/home/forum/public_html/libraries/joomla/event/event.php中的非對象上的成員函數attach(),但如果刪除構造函數,並在插件方法中調用lib nusoap,每件事情都很好... @MrCode – Samuel

相關問題