Pregunta

Drupal tiene un módulo de importación de contactos de Gmail que ha estado tan cerca de trabajar desde hace aproximadamente 7 meses. No tengo las habilidades para solucionar el problema, el mantenedor desapareció y creo que esta es una pieza importante para el trabajo. Así que me dirijo a StackOverflow en busca de ayuda.

El problema: cuando rellenas tus credenciales y le dices al script que devuelva tus contactos, de forma predeterminada, obtiene 25. Eso funciona bien.

Cuando le pida que busque más contactos cambiando la URL que está consultando desde aquí:

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

a esto:

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

Obtienes el siguiente error fatal:

  

Error grave: llame a una función miembro getAttribute () en un no-objeto en la ruta / a / site / sites / all / modules / dcl_importer / scripts / importGData.class. php en la línea 97

Aquí está el 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 línea 97 es ese $ email = $ mnode- > getAttribute ('dirección'); línea cerca del final.

¿Qué puedo cambiar aquí para no volver a tener ese error y hacer que esto funcione para la comunidad Drupal? Quiero ingresar toda la lista de contactos de una persona, no solo 25. Me imagino que si envié el número lo suficientemente alto, será lo suficientemente cerca para sobrevivir.

¿Fue útil?

Solución

Sin probarlo directamente, intentaría reemplazar las líneas 96 - 104 con esto:

$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: el correo electrónico es un elemento opcional de acuerdo con API de datos de Google . Es opcional en la implementación de Gmail también. El módulo que está utilizando asume que existe y falla cuando no lo hace.

Las múltiples direcciones de correo electrónico por contacto no se manejan, según la NOTA: comentario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top