在symfony 1.4中创建"like/dislike"按钮



我想用Symfony 1.4在Ajax中创建一个"喜欢/不喜欢"按钮。

我有这些表格:

| Song | ------- n --------------------------- n ---------- | sfGuardUser |
|
| LikeSong |                 `

我读过symfony AJAX文档,但它是1.0文档。1.4非常轻。所以,以下是我首先尝试做的。

/app/frontend/module/likesong/_voting.php:中

<?php
if($song->hasVote())
{
jq_link_to_remote('I do not like', array('complete' => '[??? Update my link]', 'url' => 'likesong/notlike?id_song='.$song->getId()));
}
else
{
jq_link_to_remote('I like', array('complete' => '[??? Update my link]', 'url' => 'likesong/like?id_song='.$song->getId()));
}
echo ' - '.$song->getNbVote();
?>

/app/frontend/config/routing.yml:中

song_like:
url:      /song-like/:id
param:    { module: song, action: like }
song_notlike:
url:      /song-not-like/:id
param:    { module: song, action: notLike }

/app/frontend/module/likesong/actions.class.php

public function executeLike(sfWebRequest $request)
{
if ($request->isXmlHttpRequest())
{                              
if(USER HAS NOT YET VOTED)
{
$this->vote = new LikeSong();
$this->vote->setSongId($this->song()->getId());
$this->vote->setSfGuardUserId($this->getUser()->getId());
$this->vote->save();
return $this->renderText('notlike');
else
{
// Display flash
}
}
}
public function executeNotLike(sfWebRequest $request)
{
if ($request->isXmlHttpRequest())
{                              
if(USER ALREADY VOTED)
{
// Delete form database
return $this->renderText('like');
else
{
// Display flash
}
}
}

当用户点击时,"我喜欢这首歌"应该替换为"我不喜欢这首歌曲"。

首先,控制器中不应该有业务逻辑。

你的模板代码也很奇怪——我从来没有用过jq_link_to_remote()做任何ajax,快速搜索这个函数,它似乎有很多问题。如果你回到概念上来,你可能会有很多问题得到解决。

  1. 喜欢或不喜欢歌曲的用户应该在Song类中编写。我会写这样的东西:

    class Song extends BaseSong
    {
    public function userLike($user_id)
    {
    return in_array($user_id, $this->getLikers()->getPrimaryKeys()));
    }
    public function switchLike($user_id)
    {
    if ($this->userLike($user_id))
    {
    $this->getLikers()->remove($user_id);
    $this->save();
    return 0;
    }
    else
    {
    $this->getLikers()->add(Doctrine::getTable('User')->find($user_id));
    $this->save();
    return 1;
    }
    }
    }
    
  2. 您应该始终编写干净的控制器,无论是否使用AJAX都可以调用这些控制器。isXmlHttpRequest()功能可能非常强大,但它决不能破坏您网站的可访问性。Javascript必须保持可选,您的链接必须具有标准http调用的功能性回退。我会从这样的东西开始:

    public function executeIndex(sfWebRequest $request)
    {
    // Here the code for the whole song's page, which will include your _vote partial
    }
    public function executeSwitchLike(sfWebRequest $request)
    {
    $this->song = Doctrine::getTable('Song')->find($request->getParameter('id'));
    $this->song->switchLike($this->getUser()->getId());
    $this->redirect('song/index?id='.$request->getParameter('id'));
    }
    

然后,用一个简单的http链接为"喜欢"或"不喜欢"编写模板。您应该具有重新加载整个页面的行为,只需切换"赞"状态即可。

最后,用一个简单的jquery.load()调用重载这个链接,它只替换您想要替换的HTML元素:

$('#like_block').load('/switchLike?id=<?php echo $song->id ?>');

它将导致整个PHP被执行,这是使用AJAX的好方法,但只会重新加载特定的HTML元素。

相关内容

  • 没有找到相关文章

最新更新