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

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

28 октября 2010, 00:02 (2917 дней назад, №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 - с доступом ко всем объектам.

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

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

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

6375 дней назад, 15:2510 мая 2001 Adok/Hugi сообщает, что вышел 22-й номер журнала Hugi Russian Edition: Hugi is the leading free international electronical magazine (diskmag) in the PC Scene. On May 3rd, the Russian Edition of Hugi 22 was released. "Hugi #22 - Russian Edition has been released. Thanks to the great work of iliks, Aquila, slash, Virtual, most of the articles from Hugi 22 were translated to the Russian language. The remaining ones are included in English. I hope the Russian-speaking people among you will enjoy it! BTW: Feedback on this edition, as well as on the international ...далее

Избранное

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

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