Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ajax, нужно обновить данные в SMF 1.1.4, Нашел пару функций с запросами, но что с 
V
    Опции темы
Ghirik
Дата 14.5.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Вот всё, что я смог найти JavaScript-е SMF похожее на Ajax-функции.


Код

var smf_formSubmitted = false;
if (!window.XMLHttpRequest && window.ActiveXObject)
    window.XMLHttpRequest = function ()
    {
        return new ActiveXObject(navigator.userAgent.indexOf("MSIE 5") != -1 ? "Microsoft.XMLHTTP" : "MSXML2.XMLHTTP");
    };

function getXMLDocument(url, callback)
{
    if (!window.XMLHttpRequest)
        return false;

    var myDoc = new XMLHttpRequest();
    if (typeof(callback) != "undefined")
    {
        myDoc.onreadystatechange = function ()
        {
            if (myDoc.readyState != 4)
                return;

            if (myDoc.responseXML != null && myDoc.status == 200)
                callback(myDoc.responseXML);
        };
    }
    myDoc.open('GET', url, true);
    myDoc.send(null);

    return true;
}

function sendXMLDocument(url, content, callback)
{
    if (!window.XMLHttpRequest)
        return false;

    var sendDoc = new window.XMLHttpRequest();
    if (typeof(callback) != "undefined")
    {
        sendDoc.onreadystatechange = function ()
        {
            if (sendDoc.readyState != 4)
                return;

            if (sendDoc.responseXML != null && sendDoc.status == 200)
                callback(sendDoc.responseXML);
            else
                callback(false);
        };
    }
    sendDoc.open('POST', url, true);
    if (typeof(sendDoc.setRequestHeader) != "undefined")
        sendDoc.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    sendDoc.send(content);

    return true;
}


При загрузке страницы, в файле index.template.php, волшебным образом, появляется массив $context, набитый всякой разной инфой. Я забираю в JavaScript-овый сценарий последние сообщения форума - $context[news_lines].
И вот, встал вопрос. Как мне через Ajax получить $context[news_lines]? Как найти то место в php-файлах, где происходит запрос к базе (по каким словам искать?)? Ну и как воспользоваться приведенными функциями? И чего мне делать потом с этим XML?

У меня есть ещё вопросы.... ну, да ладно, не буду наглеть. smile 

Да, и кто такой callback? smile 





--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Grig
Дата 15.5.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 2
Всего: 16



callback - очевидно функция, обрабатывающая пришедший XML.
из файла  который передается в url тебе следует вернуть примерно такой xml-ник:
Код

<root>
<new_line>fghfhfh</new_line>
<new_line>6346873</new_line>
</root>


и распарсить его ф-ций callback



--------------------
        
PM MAIL ICQ   Вверх
Fortop
Дата 15.5.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(Ghirik @  14.5.2008,  18:30 Найти цитируемый пост)
Да, и кто такой callback?

Функция smile А точнее, дословно, обратный вызов
Пример, есть одна функция внутри которой вызывается другая.
Так вот используя технологию callback - ты можешь указать любую функцию в качестве этой другой ;)



Цитата(Ghirik @  14.5.2008,  18:30 Найти цитируемый пост)
 забираю в JavaScript-овый сценарий последние сообщения форума - $context[news_lines].
И вот, встал вопрос. Как мне через Ajax получить $context[news_lines]? 

Непонятен вопрос.
Чем в этом вопросе Ajax отличается от JavaScript?

Там же где и забираешь в JavaScript или в каком-то отдельном месте.

Код

$('#target').load('http://mysite/index.php?view=main&id=1&context=news_lines');


Ну, а уже внутри своего PHP разруливай что делать, и что отдавать, когда тебе пришел какой-либо набор параметров.
Код

$key = isAllowed($_GET['context']) ? $_GET['context']; 'error_key';
echo $context[$key];
//или
echo json_encode($context[$key]);



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Ghirik
Дата 15.5.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Спасибо.

Цитата

Непонятен вопрос.
Чем в этом вопросе Ajax отличается от JavaScript?


Я забираю $context['latest_posts'] (ранее ошибочно указал $context[news_lines], но это сути не меняет) во время начальной загрузки, в шаблоне страницы, при php-выдаче HTML-а. Переливаю массив в массив. Но когда страница уже загружена, пользователь на ней работает, мне нужно обновить информацию о последних сообщениях форума - послать запрос.



Это сообщение отредактировал(а) Ghirik - 15.5.2008, 10:24


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Ghirik
Дата 15.5.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



По каким ключевым словам можно поискать в php-файлах функцию, которая посылает/забирает данные при Ajax-обмене?


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Grig
Дата 15.5.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 2
Всего: 16



php-файлу абсолютно безразлично кто его опрашивает, HTTPRequest или браузер пользователя, или еще что-либо. Он просто отдает что просили и всё.


--------------------
        
PM MAIL ICQ   Вверх
Ghirik
Дата 15.5.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Цитата

php-файлу абсолютно безразлично кто его опрашивает, HTTPRequest или браузер пользователя, или еще что-либо. Он просто отдает что просили и всё. 


Ну а как его опросить то? 
Здесь 
Код

getXMLDocument(url, callback)

ведь нужно указать url файла в котором находится php-функция, запрашивающая базу. Или я чего то не понимаю?

Попробую поискать в JavaScript-е вызовы этих функций, может по аналогии чего и сотворю...


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Grig
Дата 15.5.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 2
Всего: 16



Код

//вызов
getXMLDocument("1.php", ttt);


//распарсер
function ttt(xml){
//тут вообще-то будет xml-паресер
}


1.php
Код

<?
echo "<root>jkghjidfhgjkd</root>";
?>


или я не понимаю в чем проблема =(


--------------------
        
PM MAIL ICQ   Вверх
Ghirik
Дата 15.5.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Нехватает уму smile 


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
solenko
Дата 15.5.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



Чтобы не лезть по локоть в исходники можно сделать так:
1. в index.php добавляем в массив $actionArray свой action, по которому будем запрашивать новые посты
2. в нашем фале, который уже прописан в $actionArray, пишем
Код

    if (!empty($settings['number_recent_posts']) && $settings['number_recent_posts'] > 1)
    {
        require_once($sourcedir . '/Recent.php');

        if (($context['latest_posts'] = cache_get_data('boardindex-latest_posts:' . md5($user_info['query_see_board'] . $user_info['language']), 180)) == null)
        {
            $context['latest_posts'] = getLastPosts($settings['number_recent_posts']);
            cache_put_data('boardindex-latest_posts:' . md5($user_info['query_see_board'] . $user_info['language']), $context['latest_posts'], 180);
        }

        // We have to clean up the cached data a bit.
        foreach ($context['latest_posts'] as $k => $post)
        {
            $context['latest_posts'][$k]['time'] = timeformat($post['raw_timestamp']);
            $context['latest_posts'][$k]['timestamp'] = forum_time(true, $post['raw_timestamp']);
        }
    }
//далее преобразовываем этот массив в xml
  die();

3. Ну и, по идее, с javascript'ом у вас проблемм не должно возникнуть


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Ghirik
Дата 15.5.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Самое удивительное, что я как раз этот финт и пытался сделать... Уже даже сделал файл LatestPosts.php именно с таким содержанием, и положил его в Sources. Только не поставил die(); в конце... Но собирался его пришпандорить через require_once, где /MessageIndex.php и  /BoardIndex.php... smile 

Так, всё готово. Прописал так:
Код

        'latestposts' => array('LatestPosts.php', 'LatestPosts'),

А как мне его брать то? Через getXMLDocument(url, callback)? 
url = 'http://domen.ru/index.php?action=latestposts'; ?

И преобразование в xml чем делать? Есть функция в php?


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Ghirik
Дата 16.5.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Судя по дебагеру smile , у меня всё заработало, содержимое респонса он показывает.
 Функцию getXMLDocument(url, callback) вызываю так:
Код

<p align="center"><input type="button" value="" name="ajax" onclick="getXMLDocument(\'' . $scripturl . '?action=latestposts\', alertContents)"></p>


функция alertContents выглядит так:
Код

function alertContents(xmldoc) {
    var root_node = xmldoc.getElementsByTagName('root').item(0);
    alert(root_node.firstChild.data);
}


файл action выглядит так:
Код

<?php

if (!empty($settings['number_recent_posts']) && $settings['number_recent_posts'] > 1)
{
    require_once($sourcedir . '/Recent.php');

    if (($context['latest_posts'] = cache_get_data('boardindex-latest_posts:' . md5($user_info['query_see_board'] . $user_info['language']), 180)) == null)
    {
        $context['latest_posts'] = getLastPosts($settings['number_recent_posts']);
        cache_put_data('boardindex-latest_posts:' . md5($user_info['query_see_board'] . $user_info['language']), $context['latest_posts'], 180);
    }    

    // We have to clean up the cached data a bit.
    foreach ($context['latest_posts'] as $k => $post)
    {
        $context['latest_posts'][$k]['time'] = timeformat($post['raw_timestamp']);
        $context['latest_posts'][$k]['timestamp'] = forum_time(true, $post['raw_timestamp']);
    }
    if (!empty($context['latest_posts'])) {
        shuffle($context['latest_posts']);
        echo '
        <?xml version="1.0" ?> 
        <root>
        ';
        foreach ($context['latest_posts'] as $post)
        echo '
            <new_line>', $post['link'], ' ', $txt[525], ' ', $post['poster']['link'], '</new_line>
        ';
    }
    echo '
        </root>
    ';
}
die();

?>


Алерт не хочет ни в какую выскакивать!

Практически то же самое здесь работает.

Что за фигня? Где я чего не так делаю?




--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
solenko
Дата 16.5.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



У вас в ответ приходит не валидный xml -- перед <?xml стоит перевод строки и пробелы.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Ghirik
Дата 16.5.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Так... Всё заработало после следующих изменений.

Как подсказал solenko, следовало убрать пробелы перед <?xml. Но и этого оказалось мало, пришлось указать кодировку <?xml version="1.0" encoding="UTF-8"?>.
И в личной переписке, solenko, подсказал прописать заголовок header("Content-type: text/xml"); 
, прописал, только после этого стал вылетать alert.
Ну и на всякий случай,  smile  я ещё прописал такие строчки в getXMLDocument() после    var myDoc = new XMLHttpRequest();
Код

if (myDoc.overrideMimeType) {
    myDoc.overrideMimeType('text/xml');
}


Вот последний релиз smile action-а
Код

<?php

if (!empty($settings['number_recent_posts']) && $settings['number_recent_posts'] > 1)
{
    require_once($sourcedir . '/Recent.php');

    if (($context['latest_posts'] = cache_get_data('boardindex-latest_posts:' . md5($user_info['query_see_board'] . $user_info['language']), 180)) == null)
    {
        $context['latest_posts'] = getLastPosts($settings['number_recent_posts']);
        cache_put_data('boardindex-latest_posts:' . md5($user_info['query_see_board'] . $user_info['language']), $context['latest_posts'], 180);
    }    

    // We have to clean up the cached data a bit.
    foreach ($context['latest_posts'] as $k => $post)
    {
        $context['latest_posts'][$k]['time'] = timeformat($post['raw_timestamp']);
        $context['latest_posts'][$k]['timestamp'] = forum_time(true, $post['raw_timestamp']);
    }
    if (!empty($context['latest_posts'])) {
        // shuffle($context['latest_posts']);
        header("Content-type: text/xml"); 
        echo '<?xml version="1.0" encoding="UTF-8"?>
<smf>';
        foreach ($context['latest_posts'] as $post)
        echo '
    <new_line><![CDATA[', $post['link'], ' ', $txt[525], ' ', $post['poster']['link'], ']]></new_line>
    ';
    }
    echo '
</smf>';
}
die();

?>


и callback
Код

function alertContents(xmldoc) {
    alert(xmldoc.getElementsByTagName("smf")[0].getElementsByTagName("new_line")[0].firstChild.nodeValue);
}




Grig, Fortop, solenko, всем огромное спасибо! Ощущение такое, будьто наладил радиосвязь с Марсом.



Это сообщение отредактировал(а) Ghirik - 16.5.2008, 16:47


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1912 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.