Обратите внимание, что новости можно получать по RSS.
X
-

Информационные технологии, LiveJournal cr_it - архив

28 октября 2010, 00:02 (4926 дней назад, №8804)Facebook - виджет комментариев
Решил добавить в свой проект http://bcam.spb.ru возможность комментирования альбомов (страниц сайта). Наиболее удобным и гибким решением посчитал использование фейсбуковского виджета комментариев.

Добавляется всё довольно просто, но есть несколько неочевидных моментов, о которых я бы хотел рассказать.


Идентификатор объекта - что комментируем?

Когда вы добавляете виджет на страницу, то наверняка захотите, чтобы комментарии ассоциировались именно с этой страницей. Для этого там есть такая штука, называемая (в разных местах их документации :) как xid, unique id и еще кое-где ids.
Это строка (т.е. необязательно число) , которая может быть, к примеру, URL'ем вашей страницы. Но есть два момента: 1) обязательно сделайте ей urlencode 2) помните, что url нужно будет привести к единому виду. К примеру, http://bcam.spb.ru/uzbekistan/, http://bcam.spb.ru/uzbekistan/index.html, uzbekistan/index.html , uzbekistan/ и т.п. должны всегда преобразовываться в один и тот же xid="uzbekistan".

Настройка стилей

В документации у Facebook'a об этом нет ни слова (я уже даже не удивляюсь). Но хоть цвета как-то ведь надо привести в соответствие с сайтом! Так что, берём FireBug (меню CSS) или что-нибудь подобное, загружаем любую страницу с виджетом, и смотрим, какие классы за какие элементы виджета отвечают. Смысла их документировать особого нет, т.к. они у них имеют свойство меняться (например, пока я разбирался, они поменяли gray_box на uiBoxGray :)
Можете посмотреть мой CSS, хотя там много лишнего.

Так или иначе, создаём свой .css файлик, и указываем путь к нему в <fb:comments css="yourcss.css" ..>
И да, не забудьте, что css закэшируется, так что по факту вам придётся сделать что-то типа
...  css="yourcss.css?' . rand(0,9999) ...

Помимо цветов, через css можно также избавиться от кнопки Like , которая к комментариям принудительно прилагается: div.like {display:none;}

Странности

Чтобы вы не тратили время на удивление, сразу скажу:

1) Галочка "Publish Feed" ("Добавить комментарий к моему профилю на Facebook") установлена всегда - атрибут publish_feed="0" ни на что не влияет. Снять её можно только в браузере.

2) notify="true" не работает - т.е. никакие уведомления о комментариях никому присылаться не будут.

И то и другое на форумах обсуждают месяцами, так что расслабьтесь - может когда-нибудь починят (если fbml раньше не упразднят ;)

Итак, что у нас получилось?

Что-то типа следующего:

<script src="http://connect.facebook.net/ru_RU/all.js#appId=_id_приложения_&amp;xfbml=1"></script><fb:comments xid="_id_страницы_'" css="yourcss.css?' . rand(0,9999) . '" simple="0" notify="true" publish_feed="0" width="700"></fb:comments></div>

_id_приложения_ - это appid некоего приложения-заглушки, с которым будут ассоциироваться  все комментарии на вашем сайте (и не только - мало ли чего вы еще захотите).
Надо его создать, ввести URL сайта в Web Site / Site URL и посмотреть App ID созданного приложения. См. еще тут

Все опции для fb:comments можно найти здесь http://developers.facebook.com/docs/reference/fbml/comments

Если нужно поменять язык, вместо "ru_RU" пишите, например, "en_US".

Просмотр комментариев

Если у вас 2-3 странички, можно просто на них зайти и посмотреть, чего вам там накомментировали. Но если их сотни, такой вариант, конечно, не годится.

Facebook не предоставляет никакого интерфейса для просмотра всех комментариев.
Но зато у них очень обширный API, и при желании можно вытащить любую информацию, причём даже несколькими способами.
Будем использовать FQL. (на SQL он только похож - нельзя указывать в SELECT большей одной таблицы, и еще много чего нельзя):

require 'inc/facebookclass.php';// новый класс работает только с PHP5!

$facebook = new Facebook(array(
    'appId'  => '_appid_вашего_приложения_',
    'secret' => _secret_вашего_приложения_,
    'cookie' => true,
));

$since = 1;
$app_id = $facebook -> getAppId();

// Внутрь запроса нельзя вставлять переводы строк и другие спецсимволы! Иначе будете долго гадать, что же это за загадочное сообщение об ошибке

$result = $facebook->api(array(
    'method' => 'fql.multiquery',
    'queries' => '{"comments":"SELECT fromid, text, time, id, xid FROM comment WHERE xid IN (SELECT xid FROM comments_info WHERE app_id = ' . $app_id . ' AND updated_time > ' . $since . ') ORDER BY time desc",
    "users":"SELECT id, name, pic_square, url FROM profile WHERE id IN (SELECT fromid  FROM #comments)"}'
));

foreach ($result[0]["fql_result_set"] as $key => $value)
{
    $user =    getUserById($result[1]["fql_result_set"], $value["fromid"]);
    echo($key . ' [' . date("d/m/Y H:i:s",$value["time"]) . ']: <a href="http://bcam.spb.ru/' . $value["xid"] . '">' . 'http://bcam.spb.ru/' . $value["xid"] . '</a> ' . $value["text"] . ' ' . '<a href="' . $user["url"] . '">' . $user["name"] . '</a>' . '<br>');
}//foreach

// Сам знаю, что так не делают :)

function getUserById($raw_user,$id)
{
    foreach ( $raw_user as $k => $v)
        if ($v["id"] == $id) return $v;
}//getUserById


Необязательно использовать FQL. Просто это гибкий способ.
Можно использовать comments.get

Альтернативы?

С практической точки зрения одна - аналогичный виджет ВКонтакта
Он даже кое в чём лучше - можно администрировать все комментарии в одном месте, можно отвечать на комментарии (т.е. ветки образуются).
Основной недостаток - нет такого мощного API, как в Facebook - с доступом ко всем объектам.

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

Опубликовано: Пётр Соболев

Случайная заметка

5326 дней назад, 23:5023 сентября 2009 Хочу порекомендовать программу для изготовления макетов пользовательских интерфейсов - Balsamiq Mockups. Хотя для этой цели разработано уже порядочно инструментов, однако подобный баланс простоты и мощности я вижу лишь второй раз (первый был Denim, неустойчиво работающий и требующий для нормальной работы планшета. Ну и еще пожалуй ...далее

Избранное

2545 дней назад, 01:575 мая 2017 Часть 1: От четырёх до восьми Я люблю читать воспоминания людей, заставших первые шаги вычислительной техники в их стране. В них всегда есть какая-то романтика, причём какого она рода — сильно зависит от того, с каких компьютеров люди начали. Обычно это определяется обстоятельствами — местом работы, учёбы, а иногда и вовсе — ...далее

2057 дней назад, 20:305 сентября 2018 "Finally, we come to the instruction we've all been waiting for – SEX!" / из статьи про микропроцессор CDP1802 / В начале 1970-х в США были весьма популярны простые электронные игры типа Pong (в СССР их аналоги появились в продаже через 5-10 лет). Как правило, такие игры не имели микропроцессора и памяти в современном понимании этих слов, а строились на жёсткой ...далее