דָּוִדdavidov777 (daviddavidov777) wrote,
דָּוִדdavidov777
daviddavidov777

www.legnostyle.ru

На моем почти сервере хранится html-страница и js файл. При загрузке страницы данные для отображения (список объявлений) загружается непосредственно с серверов Google.

Отображение данных из таблицы производится с помощью модуля visualization. Взято вот отсюда.
Для этого в заголовок index.html добавляем ссылку на javascript — www.google.com/jsapi, а в файл default.js строку
google.load('visualization', '1');

Более подробно о загрузке модулей Google API в Javascript можно почитать вот здесь.

Помимо этого нужно выполнить запрос к таблице и указать функцию — обработчик ответа.
//формирование запроса
var queryText = 'SELECT id, name FROM 596524;';
//url запроса
var reqUri = 'http://www.google.com/fusiontables/gvizdata?tq=' + encodeURIComponent(queryText);
//создаем объект visualization
var query = new google.visualization.Query(reqUri);
//посылаем запрос и указываем функцию - обработчик ответа
query.send(displayData);


Как уже было написано выше — в качестве имен таблиц в запросах используются их ID (кстати, можно увидеть интересный факт — 26 февраля я создал таблицу с ID = 505 xxx, а созданная сегодня таблица data получила ID 596 524 — можно сделать вывод: ~ 91 000 таблиц меньше чем за месяц было добавлено на FT).

И, наконец, функция вывода результатов на странице
function displayData(response) {

//более детальная информация об объекте response доступна здесь
//http://code.google.com/apis/visualization/documentation/reference.html#QueryResponse
numRows = response.getDataTable().getNumberOfRows();
numCols = response.getDataTable().getNumberOfColumns();

//собираем результат в строку
fusiontabledata = "";
for(i = 0; i < numCols; i++) {
fusiontabledata += response.getDataTable().getColumnLabel(i) + ",";
}
fusiontabledata += "

";

for(i = 0; i < numRows; i++) {
for(j = 0; j < numCols; j++) {
fusiontabledata += response.getDataTable().getValue(i, j) + ", ";
}
fusiontabledata += "
";
}
//вывод на странице
document.getElementById('echoer').innerHTML = fusiontabledata;
}


Пример на jsFiddle

Теперь ложка дегтя. FT использует язык запросов SQL. Подробнее можно почитать здесь. Но! Язык этот имеет несколько неожиданных ограничений — например нет оператора OR в условиях команды SELECT (и даже нет возможности заменить его чем-то вроде (a | b) = !( !a & !b ), поскольку нет оператора NOT), на эту тему даже создали proposal). Хотя есть встроенные функции для работы с координатами. FT вообще направлен на поддержку карт от Google.

Во избежание кеширования запросов (я не разбирался где именно они кешируются — в браузере, visualization или сам FT) на реальном проекте имеет смысл добавить в условие запроса что-то вроде «AND name not equal to 234567», где 234567 — случайное число (см. Math.getRandomInt()).

По-хорошему конечно нужно было бы написать свой собственный класс для отправки запросов и обработки ответов. Если присмотреться — нет ничего сложного. SELECT — отправляется GET-запросом по специальному адресу, ответ от сервера получаем в формате JSON. Я так и поступил — получил довольно сырой код, который здесь выкладывать стыдно. А буквально сегодня наткнулся на замечательный топик от trurl123 и понял, что нужно еще поизучать MVC в js и, возможно, отказаться от своих наработок.

Шаг 3 — добавление данных — PHP + Zend Framework

Когда я взялся за эту часть работы — ничего не предвещало беды. Zend Framework содержит целый API для работы с сервисами от Google. Но не все оказалось так радужно. В общем, класс для работы с FT пришлось писать самому, взяв за основу Zend_Gdata_Base и воспользовавшись нерабочим решением под Drupal.

Файл с классом можно скачать здесь. Стыдно признаться, файл не соответствует стандарту Zend, он содержит 3 класса, плохо документирован. Но он работает.

Для того чтобы его использовать, необходимо подключить собственно сам файл, а также Zend/Gdata/ClientLogin.php.

Пример:
//авторизация (по крайней мере данные для авторизации указываются здесь)
$client = Zend_Gdata_ClientLogin::getHttpClient('your_login_here@gmail.com', 'your_pass_here', 'fusiontables');
//создание экземпляра класса
$base = new Zend_Gdata_Fusion($client);

//запрос на выборку
$sql = "SELECT ROWID FROM 596524 WHERE id = 1;";
$rowdata = $base->query($sql)->get_array();
print_r($rowdata);
//вставка строк - согласно API необходимо перечислить все столбцы таблицы
$newRowId = $base->insertRow('596524',array(
'id' => time(),
'name' => 'trird row',
'added' => date('n/j/y'),
) );
//обновление строки
$base->updateRow(
'596524', //ID таблицы
array('name' => 'new first row'), //ассоциативный массив значений
$rowdata[1][0] //ROWID полученный в запросе на выборку
);


Если дойдут руки, доведу файл до ума и залью на Zend Proposal.

Еще один момент: если нет нужды выполнять INSERT/UPDATE команды, можно использовать Zend_Base, например как описано здесь. Дело в том что по спецификации через GET запрос можно выполнить только SELECT ( http://code.google.com/intl/ru/apis/fusiontables/docs/developers_guide.html#Updating "… To update a row, send an authenticated POST request..." )

На этом все. Любые камни замечания приветствуются. Спасибо.

PS: и конечно, я понимаю, что нет смысла держать коммерческий проект на шаровых услугах, но, если мое приложение станет коммерческим (т.е. если у него появится достаточное количество пользователей и я придумаю как на них заработать), я немедленно мигрирую на собственный сервер. А на данный момент я имею:
— достаточно красивое и быстро работающее приложение при небольших начальных затратах;
— веру что все будет работать так же быстро и под нагрузкой.

PPS: Да, я надеюсь что code highlighter глючит только при предпросмотре



Недавно в сети попалось интересное предложение мебель для ванной комнаты дерево недорого.Если вам интересно обращайтесь!
Tags: мебель
Subscribe

  • продажа недвижимости, дачные дома

    The Guardian обратила внимание на то, что социальные сети могут использоваться не только как информационный канал для революций и потрясений, а для…

  • New age.................

    Заниматься еще больше торговлей!Понять куда пойдет тренд. Учиться , как можно больше задавать как можно больше вопросов.не терять время на всякую…

  • music

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments