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 in path/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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top