Facebook赞按钮,一个对象,多个URL(区域设置)

时间:2013-05-26 23:04:28

标签: facebook facebook-graph-api symfony facebook-like

我有一个网络应用,其中同一个对象可以有多个网址,具体取决于区域设置参数,如下所示:

http://domain.com/{_locale}/{id}/{slug}

我在这些页面上有一个Like按钮,工作得很好,但问题是每个语言环境中的喜欢都算作单独的OpenGraph对象,因为URL不同。

显而易见的解决方案是使用对象id而不仅仅是Like按钮的href参数,但是it seems like it may not be possible

基本上,我需要一种方式让Like计算两者:

http://domain.com/fr/1/some-slug

http://domain.com/en/1/some-slug

因为它们毕竟都是同一个对象。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我想我必须打字才能搞清楚。这是我对Symfony2的解决方案。

我开始工作的方式是调整现有的localeAction。默认情况下,它是通过访问网站的根目录触发的,但我更改了它以便接受路由和参数:

public function localeAction($route = 'home', $parameters = array())
{
    $this->getRequest()->setLocale($this->getRequest()->getPreferredLanguage(array('en', 'fr')));

    return $this->redirect($this->generateUrl($route, $parameters));
}

然后,我专门为Facebook创建了一个路由配置:

facebook_profile:
  resource: "@AppCoreBundle/Controller/FacebookController.php"
  prefix: /fb
  type: annotation

在该控制器中,我通过id找到对象,从数据库中获取slug并转发到locale控制器,该控制器将负责检测用户的语言环境并相应地重定向。

/**
 * @Route("/profile/{id}", requirements={"id" = "\d+"}, name="fb-profile")
 */
public function profileAction($id)
{
    $dog = $this->getDogManager()->findById($id);

    return $this->forward('AppCoreBundle:Core:locale', array(
        'route' => 'profile',
        'parameters' => array(
            'id' => $id,
            'slug' => $dog->getSlug(),
        ),
    ));
}

最后,视图可以使用类似按钮的新路由,如下所示:

<div class="fb-like" data-href="http://domain.com{{ path('fb-profile', {'id': dog.id}) }}" data-send="false" data-layout="button_count" data-width="450" data-show-faces="false"></div>

这导致以下hrefhttp://domain.com/fb/profile/1

我发现设置og:url元标记非常重要:

<meta property="og:url" content="http://domain.com{{ path('profile', {'id': dog.id, 'slug': dog.slug}) }}">

这导致以下contenthttp://domain.com/fr/profile/1/some-slug

注意这是真正的URL,如果我在这里使用Facebook路由,debugger抱怨循环重定向。哦,按钮也不起作用。

我可以在Facebook路线中使用slug,但如果slug因某种原因而改变,它会破坏此对象的所有现有Likes,这显然不是一个理想的副作用。

就是这样!

http://domain.com/fr/1/some-slug

http://domain.com/en/1/some-slug

现在是Facebook眼中的同一个对象。