28 октября 2010, 00:02 (5122 дня назад, №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_приложения_&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 - с доступом ко всем объектам.
Ну и можно, конечно, одновременно оба виджета использовать.