Что не так с этим скриптом импорта контактов Gmail для Drupal?

StackOverflow https://stackoverflow.com/questions/827343

Вопрос

В Drupal есть модуль импорта контактов gmail, который уже почти 7 месяцев близок к работе. У меня нет возможности решить проблему, сопровождающий исчез, и я думаю, что это важная часть работы. Поэтому я обращаюсь к StackOverflow за помощью.

Проблема: когда вы вводите свои учетные данные и говорите сценарию вернуть ваши контакты, по умолчанию он получает значение 25. Это прекрасно работает.

Когда вы говорите ему искать больше контактов, изменяя URL-адрес, который вы запрашиваете, из этого:

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

на это:

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

Вы получаете следующую фатальную ошибку:

  

Неустранимая ошибка: вызов функции-члена getAttribute () для необъекта в path / to / site / sites / all / modules / dcl_importer / scripts / importGData.class. php в строке 97

Вот сценарий:

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

Строка 97 - это строка $ email = $ mnode- > getAttribute ('address'); в конце.

Что я могу изменить здесь, чтобы больше не получать эту ошибку, чтобы это работало на сообщество Drupal? Я хочу получить список контактов всех людей, а не только 25. Я полагаю, что если я отправлю номер достаточно высоко, он будет достаточно близко, чтобы обойтись.

Это было полезно?

Решение

Без непосредственного тестирования я попытался бы заменить строки 96 - 104 на это:

$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: электронная почта является необязательным элементом в соответствии с API данных Google . Это также необязательно в реализации Gmail. Модуль, который вы используете, предполагает, что он существует, и отказывает, когда его нет.

Несколько адресов электронной почты для каждого контакта остаются необработанными, как указано в ПРИМЕЧАНИЕ. Комментарий.

scroll top