Question

Drupal propose un module d’importateur de contacts Gmail qui fonctionne depuis près de 7 mois maintenant. Je n'ai pas les côtelettes pour résoudre le problème, le responsable a disparu et je pense que c'est un élément important à faire fonctionner. Je me tourne donc vers StackOverflow pour obtenir de l'aide.

Le problème: lorsque vous remplissez vos informations d'identification et que vous indiquez au script de ramener vos contacts, par défaut, il en insère 25. Cela fonctionne très bien.

Lorsque vous lui demandez de rechercher plus de contacts en modifiant l'URL que vous interrogez à partir de ceci:

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

à ceci:

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

Vous obtenez l'erreur fatale suivante:

  

Erreur fatale: appel d'une fonction membre getAttribute () sur un non-objet dans chemin / vers / site / sites / tous / modules / dcl_importer / scripts / importGData.class. php à la ligne 97

Voici le 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 ligne 97 contient cette $ email = $ mnode- & get; getAttribute ('adresse'); ) vers la fin.

Que puis-je changer ici pour ne plus avoir cette erreur et que cela fonctionne pour la communauté Drupal? Je souhaite extraire toute la liste de contacts d'une personne, pas seulement 25. Je pense que si j'ai envoyé le numéro assez haut, il sera suffisamment proche pour que nous puissions nous en sortir.

Était-ce utile?

La solution

Sans le tester directement, je voudrais remplacer les lignes 96 à 104 par ceci:

$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 est un élément facultatif selon API Google Données . C'est également facultatif dans la mise en œuvre de Gmail. Le module que vous utilisez suppose qu'il existe et qu'il échoue s'il ne le fait pas.

Plusieurs adresses de messagerie par contact ne sont pas gérées, conformément au commentaire: remarque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top