Drupal не читает правильные значения из БД - PullRequest
0 голосов
/ 08 апреля 2010

Вот моя текущая проблема. Я работаю с модулем чата и создаю модуль, который уведомляет пользователей через AJAX, что они были приглашены в чат. Текущая структура таблицы для таблицы приглашений выглядит следующим образом:

|-------------------------------------------------------------------------|
|  CCID  |  NID  |  INVITER_UID  | INVITEE_UID  |  NOTIFIED  |  ACCEPTED  |
|-------------------------------------------------------------------------|
|  int   |  int  |     int       |     int      |  (0 or 1)  |  (0 or 1)  |
|-------------------------------------------------------------------------|

Я использую плагин периодического обновления для JQuery, чтобы постоянно опрашивать сервер на предмет наличия приглашений. Когда приглашение найдено, я устанавливаю уведомление от 0 до 1. Однако моя проблема - периодическое обновление. Когда я впервые вижу, что есть приглашение, я уведомляю пользователя и устанавливаю уведомление 1. При следующем выборе я получаю те же результаты и раньше, как если бы обновление не работало. Но когда я проверил базу данных, я увидел, что она работала очень хорошо. Это как если бы запрос запрашивал кеш, но я не могу понять это.

Мой код для периодического средства обновления выглядит следующим образом:

window.onload = function() {


var uid = $('a#chat_uid').html();

$.PeriodicalUpdater(
    '/steelylib/sites/all/modules/_chat_whos_online/ajax/ajax.php',     //url to service
    {
       method: 'get',           //send data via...
       data: {uid: uid},        //data to send
       minTimeout: '1000',      //min time before server is polled (milli-sec.)
       maxTimeout: '20000',     //max time before server is polled (milli-sec.)
       multiplyer: '1.5',       //multiply against curretn poll time every time constant     data is returned
       type: 'text',            //type of data recieved (response type)
       maxCalls: 0,             //max calls to make (0=unlimited)
       autoStop: 0              //max calls with constant data (0=unlimited/disabled)

    },
    function(data)              //callback function
    {
        alert( data ); //for now, until i get it working
    }
);

}



И мой код для вызова ajax выглядит следующим образом:

<?php

#bootstrap Drupal, and call function, passing current user's uid.

function _create_chat_node_check_invites($uid)
{    
    cache_clear_all('chatroom_chat_list', 'cache');
    $query = "SELECT * FROM {chatroom_chat_invite} WHERE notified=0 AND invitee_uid=%d     and accepted=0";
    $query_results = db_query( $query, $uid );
    $json = '{"invites":[';
    while( $row = db_fetch_object($query_results) )
    {
      var_dump($row);
        global $base_url;
        $url = $base_url . '/content/privatechat' . $uid .'-' . $row->inviter_uid;

        $inviter = db_fetch_object( db_query( "SELECT name FROM {users} WHERE uid = %d", $row->inviter_uid ) );
        $invitee = db_fetch_object( db_query( "SELECT name FROM {users} WHERE uid = %d", $row->invitee_uid ) );

      #reset table
      $query = "UPDATE {chatroom_chat_invite} "
                ."SET notified=1 "
                ."WHERE inviter_uid=%d AND invitee_uid=%d";
      db_query( $query, $row->inviter_uid, $row->invitee_uid );

        $json .= '[';
        $json .= '"' . $url . '",';
        $json .= '"' .  ($inviter->name) . '",';
        $json .= '"' . ($invitee->name) . '"' ;
        $json .= '],';
    }
    $json = substr($json, 0, -1);
    $json .= ']}';

    return $json;
}
?>

Я не могу понять, что происходит, любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 23 апреля 2010

Что ж, прошло много времени, и я наконец-то понял свою проблему, но я понял, что если кто-то еще найдет эту страницу и захочет получить ответ, ему не повезет. Так что здесь была проблема.

Поскольку в обработчике вызова AJAX используются функции Drupal, мне пришлось загрузить Drupal (использовался выше, но не показан). Однако, когда я загрузил Drupal, я сделал полную загрузку. Это заставило модуль чата вызвать хук, который проверял наличие приглашений. Я не понимал, что это вызывается, потому что при обычном использовании ничего никогда не уведомляет меня ... В любом случае, ловушка предназначена для проверки уведомлений и оповещения пользователя (каким-то образом .. я не знаю, как) и когда проверил, он установил флаг уведомления в true.

Итак, к моменту вызова моего обработчика AJAX приглашение уже было уведомлено модулем ChatRoom. Таким образом, мое решение состояло только в частичной загрузке. Код для начальной загрузки приведен ниже. Я нашел сценарий на чужом сайте, но я не уверен, что это такое. В любом случае ... вот код:

<?php
    #bootstrap drupal to get access to drupal functions
    define('STRIP_LEN', -41); #length of path to use (strip off stuff like /sites/all/...)
    $base_url =  substr(getcwd(), 0, STRIP_LEN);
    chdir($base_url);
    global $base_url;

    $base_root = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';

    $base_url = $base_root .= '://' . preg_replace('/[^a-z0-9-:._]/i', '', $_SERVER['HTTP_HOST']);

    if( $dir = trim( dirname( $_SERVER['SCRIPT_NAME'] ), '\,/' ) )
    {
        $base_path = "/$dir";
        $base_url .= $base_path;
    }
    $base_url = substr($base_url, 0, STRIP_LEN);


    require_once './includes/bootstrap.inc';
    require_once './includes/common.inc';

    drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

    require_once drupal_get_path('module', '_chat_whos_online') . '/_chat_whos_online.inc';

    #END BOOTSTRAPPING
?>
0 голосов
/ 08 апреля 2010

Браузер может кэшировать вызов GET. Попробуйте добавить значение кэширования к URL-адресу (текущее время работает хорошо) запроса AJAX, чтобы каждый раз вызывать новую загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...