2011-06-26 80 views
1

我有這樣的包裝從內部的Joomla

class NZGBCComponentHelper { 
    function requestAndFollow($path = '') { 
     $c = 0;$first = 1;$httpcode = 0; 
     $uri = JRequest::getVar('uri'); 
     while ($c <= 4 && ($first || $httpcode == 302)){ 
      $first = 0; 
      $finalSfUrl = NZGBCComponentHelper::buildRequestUri($uri, $path); 

      $ch = curl_init($finalSfUrl); 

      if(JRequest::getMethod() == 'POST' && $httpcode != 302){ 
       curl_setopt($ch, CURLOPT_POST, 1); 
       $postThrough = array_merge(JRequest::get($_POST),array('_csrf_token' => $_POST['_csrf_token'])); 
       curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postThrough)); 
      } 

      // Get sf content 
      curl_setopt($ch, CURLOPT_REFERER, JURI::getInstance()->root().$path); 
      curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader'); 
      curl_setopt($ch, CURLOPT_HEADER, 1); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
      curl_setopt($ch, CURLOPT_COOKIE, 'symfony='.$_COOKIE['symfony']); 

      $return = curl_exec($ch); 
      $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 


      if (!$return){ 
       $error = curl_error($ch); 
      } 

      if($this->headers['Set-Cookie']){ 
       JResponse::setHeader('Set-Cookie', $mainframe->sym_headers['Set-Cookie']); 
      } 
      if ($httpcode >= 400){ 
       $return = "There was an <!--$finalSfUrl--> error "; 
       mail ('[email protected]', 'symfony wrapper error', 
       $finalSfUrl."\r\n". 
       $httpcode."\r\n". 
       $return 
       ); 

      }else if ($httpcode == 302){ 
       $query = parse_url(trim($mainframe->sym_headers['Location']), PHP_URL_QUERY); 
       parse_str($query); 
       parse_str($uri); 
       if ($outside == 'true'){ 
        JApplication::redirect(trim(urldecode($uri))); 
       } 
      } 
      curl_close($ch); 
      $c++; 
     } 
     return $return; 

    } 
    } 

    if (!function_exists('readHeader')){ 
    function readHeader($ch, $header){ 

     $mainframe =& JFactory::getApplication(); 
     if($pos = strpos($header, ':')){ 
      $mainframe->sym_headers[substr($header, 0, $pos)] = substr(strstr($header, ':'), 1); 
     } 

     return strlen($header); 
    } 
} 

requestAndFollow靜態稱爲負載symfony項目。我怎樣才能引用readHeader()而不是把它放到全局函數空間中。我試過了:

curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader'));//didn't expect this to work - no $this when statically called 


curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('NZGBCComponentHelper','readHeader')); 


curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(self,'readHeader')); 
+0

怎麼樣'NZGBCComponentHelper :: readHeader'? – Ben

+1

編輯您的標題爲**使用包裝來加載交響樂項目whitin Joomla?**你會得到更快的響應 – Synxmax

+0

@Syncmax:我得到了一個基於外面的工作包裝。問題是特定於靜態調用此函數。我也有一個解決方法。 – jdog

回答

4

看來這工作正常上

  • 的libcurl 7.19.7,Ubuntu的10.10,PHP 5.3.2

但不是Debian的萊尼上

  • 的libcurl 7.18.2 ,PHP 5.2.6

兩種版本的工作解決方法ns是把頭功能在全球空間

curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader'); 
0

是你得到螞蟻錯誤像curl_init()沒有定義?

啓用顯示錯誤,看看你是否可以得到這個消息。

如果您收到此消息,則說明CURL未正確安裝。

+0

我的錯誤信息是「寫入標題失敗」 – jdog

+0

嘿,我也有同樣的問題。 readHeader方法未被調用。我有一個類,其中我調用了curl_exec()方法,並且方法readHeader是全局定義的。但錯誤仍然存​​在。 你能提供一個例子嗎? – divinedragon

3

這應該工作:

curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this,'readHeader')); 
+0

爲我工作,謝謝。 – RHH