Domanda

Drupal ha un modulo importatore di contatti di Gmail che è stato quasi così vicino a funzionare per circa 7 mesi. Non ho le braciole per il debug del problema, il manutentore è svanito e penso che questo sia un pezzo importante per cui lavorare. Quindi mi rivolgo a StackOverflow per aiuto.

Il problema: quando inserisci le tue credenziali e dici allo script di riportare i tuoi contatti, per impostazione predefinita vengono inseriti 25. Funziona bene.

Quando gli dici di cercare altri contatti cambiando l'URL che stai interrogando da questo:

http://www.google.com/m8/feeds/contacts/default/thin  

a questo:

http://www.google.com/m8/feeds/contacts/default/thin?max-results=1000

Viene visualizzato il seguente errore irreversibile:

  

Errore irreversibile: chiamata a una funzione membro getAttribute () su un non oggetto in path / to / site / sites / all / modules / dcl_importer / scripts / importGData.class. php sulla linea 97

Ecco lo script:

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;
    }
}

La riga 97 è quella $ email = $ mnode- > getAttribute ('address'); vicino alla fine.

Cosa posso cambiare qui per non ottenere più quell'errore e farlo funzionare per la comunità Drupal? Voglio inserire tutta la lista dei contatti di una persona, non solo 25. Immagino che se avessi inviato il numero abbastanza in alto, sarebbe abbastanza vicino da farcela.

È stato utile?

Soluzione

Senza testarlo direttamente, proverei a sostituire le righe 96 - 104 con questo:

$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: l'email è un elemento facoltativo in base alla API dati di Google . È facoltativo anche nell'implementazione di Gmail. Il modulo che stai utilizzando presume che esista e fallisca quando non lo è.

Più indirizzi e-mail per contatto rimangono non gestiti, come da NOTA: commento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top