Was ist los mit diesem gmail Kontakt Importeur Skript für Drupal?
-
05-07-2019 - |
Frage
Drupal hat einen gmail Kontakt Importeur Modul, das gewesen ist, ach so nah jetzt etwa 7 Monate. Ich habe nicht den Koteletts, das Problem zu debuggen, der Maintainer verschwunden, und ich denke, das ist ein wichtiges Stück Arbeit zu haben. Also wende ich mich an Stackoverflow um Hilfe.
Das Problem:. Wenn Sie in Ihren Anmeldeinformationen füllen und dem Skript anweisen, Ihre Kontakte zu bringen, die standardmäßig in 25 zieht das funktioniert gut
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
folgt aus:
http://www.google.com/m8/feeds/contacts/default/thin?max-results=1000
Sie erhalten folgende fatale Fehler:
Fatal error: Call auf eine Elementfunktion
getAttribute()
auf einem Nicht-Objekt inpath/to/site/sites/all/modules/dcl_importer/scripts/importGData.class.php
auf Linie 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, dass $email = $mnode->getAttribute('address');
Linie nahe dem Ende.
Was kann ich ändern nicht diesen Fehler nicht mehr bekommen und diese Arbeit für die Drupal-Community? Ich möchte alle eine Person, der Kontaktliste ziehen, nicht nur 25. Ich glaube, wenn ich die Zahl hoch genug geschickt, es in der Nähe sein wird genug, um von zu erhalten.
Lösung
Ohne es direkt zu testen, würde ich versuchen, Zeilen 96 zu ersetzen - 104 mit diesem:
$mnode = $enodes->item(0);
if (isset($mnode) && is_object($mnode)) {
$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($email)) {
if (empty($name)) {
$contacts[] = $email;
} else {
$contacts[$name] = $email;
}
}
}
gd: E-Mail ist ein optionales Element nach dem Google Data API . Es ist optional in Google Mail zu Implementierung. Das Modul Sie verwenden übernimmt es existiert und schlägt fehl, wenn es nicht.
Mehrere E-Mail-Adressen pro Kontakt bleiben nicht behandelte, gemäß dem HINWEIS:. Kommentar