Drupal hat ein Kontaktmodul für Google Mail-Kontakte, das seit ca. 7 Monaten so gut funktioniert. Ich habe nicht die Schnauze, um das Problem zu debuggen, der Betreuer ist verschwunden, und ich denke, das ist ein wichtiges Stück Arbeit zu haben. Also wende ich mich an StackOverflow, um Hilfe zu bekommen.Was ist los mit diesem Gmail-Kontakt-Import-Skript für Drupal?
Das Problem: Wenn Sie Ihre Anmeldeinformationen eingeben und das Skript anweisen, Ihre Kontakte zurück zu holen, wird standardmäßig 25 eingezogen. Das funktioniert einwandfrei.
Wenn Sie es sagen, um weitere Kontakte zu suchen, indem Sie die URL Ändern Sie dies hier Abfrage:
http://www.google.com/m8/feeds/contacts/default/thin
dazu:
http://www.google.com/m8/feeds/contacts/default/thin?max-results=1000
Sie die folgende fatale Fehler:
Fatal error: Call to a member function
getAttribute()
on a non-object inpath/to/site/sites/all/modules/dcl_importer/scripts/importGData.class.php
on line 97
Hier ist das Skript:
class GDataMailer {
static $url_ClientLogin = 'https://www.google.com/accounts/ClientLogin';
static $url_Feed = 'http://www.google.com/m8/feeds/contacts/default/thin?max-results=65535';
function newCurlSession($URL, $auth = null) {
$curl = curl_init();
$opts = array(
CURLOPT_URL => $URL,
CURLOPT_REFERER => '',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
);
if (null != $auth) {
$opts[CURLOPT_HTTPHEADER] = array(
'Authorization: GoogleLogin auth='.$auth,
);
}
curl_setopt_array($curl, $opts);
return $curl;
}
function useCurlForPost($curl, $params) {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
return $curl;
}
function getAuthToken($login, $password) {
$curl = $this->useCurlForPost($this->newCurlSession(self::$url_ClientLogin), array(
'accountType' => 'HOSTED_OR_GOOGLE',
'Email' => $login,
'Passwd' => $password,
'service' => 'cp',
'source' => 'Drupal-Contact-Importer',
));
$resp = curl_exec($curl);
// Look for the important stuff:
preg_match_all('/Auth=([^\s]*)/si', $resp, $matches);
if (isset($matches[1][0])) {
return $matches[1][0];
} else {
return false;
}
}
function getAddressbook($login, $password) {
// check if username and password was given:
if ((isset($login) && trim($login)=="") || (isset($password) && trim($password)==""))
{
$args = func_get_args();
drupal_set_message('Incorrect login information given: '.print_r($args, true), 'error');
return false;
}
// Get the GData auth token:
$auth = $this->getAuthToken($login, $password);
if (false === $auth) {
drupal_set_message('Login failed', 'error');
return false;
}
$curl = $this->newCurlSession(self::$url_Feed, $auth);
$data = curl_exec($curl);
$doc = new DOMDocument();
$doc->loadXML($data);
$path = new DOMXPath($doc);
$path->registerNamespace('a', 'http://www.w3.org/2005/Atom');
$path->registerNamespace('gd', 'http://schemas.google.com/g/2005');
$nodes = $path->query('//a:entry');
$num = $nodes->length;
$contacts = array();
for ($x = 0; $x < $num; $x++) {
$entry = $nodes->item($x);
$tnodes = $path->query('a:title', $entry);
$nnode = $tnodes->item(0);
$name = $nnode->textContent;
$enodes = $path->query('gd:email', $entry);
$mnode = $enodes->item(0);
$email = $mnode->getAttribute('address');
// NOTE: Keep in mind that $mnode->getAttribute('rel') tells you what kind of email it is.
// NOTE: Also remember that there can be multiple emails per entry!
if (empty($name)) {
$contacts[] = $email;
} else {
$contacts[$name] = $email;
}
}
return $contacts;
}
}
Linie 97 ist die $email = $mnode->getAttribute('address');
Linie nahe dem Ende.
Was kann ich hier ändern, um diesen Fehler nicht mehr zu bekommen und das funktioniert für die Drupal-Community? Ich möchte die gesamte Kontaktliste einer Person einbeziehen, nicht nur 25. Ich denke, wenn ich die Nummer hoch genug sende, ist sie nah genug, um durchzukommen.