Going for Symfony | 第4.5天

第四天的心得中,我留下了一个小问题:

一个小bug:现在的情况是,只能用点击那个按钮的方式来提交新的tags,如果输入了一些tags然后用回车的话,会出错。这个问题我将留在日后解决。先让我得意一会吧……

当时我认为这个问题很容易解决,因为我想到了至少两种解决方法:

  1. 在jQuery中截获回车,然后不加任何处理;
  2. action.class.php中进行进一步的操作;

实践证明,第一种方法没有成功,因为我对js的掌握还是没有我对PHP的掌握来的深入。所以我集中在第二种方法。

首先,不论是按回车还是点击按钮,其后台处理方式都是基本一致的。但是,在点击按钮的时候,我需要使用AJAX处理;而在按回车时,是一个标准的POST的处理,牵涉到后台处理和处理完毕后的重定向。

其次,在实践中,发现addBookTaglist并不能很好的判断重复的id+tag。原因在于在我的处理过程中对于每个tag都创建了一个新的BookTagList对象,这个对象和已有的对象必定是"不同"的:Symfony后台的判断只是用了in_array,而没有用严格等于判断。这个错误我是通过Fx下的Firebug调试发现的,感谢Fx,感谢Firebug……

因此,我先改写了doUpdateTags函数

//BookBookPeer.php
static public function doUpdateTags($id, $tags)
{
    $book=BookBookPeer::retrieveByPk($id);
    $currentTagLists=$book->getBookTaglists();
    $tmp=array();
    foreach ($currentTagLists as $value)
    {
        $tmp[]=$value->getTag();
    }
    $tagslist=explode(" ", $tags);
    foreach ($tagslist as $tag)
    {
        if(!in_array($tag, $tmp))
        {
            $tl=new BookTaglist();
            $tl->setId($id);
            $tl->setTag($tag);
            $book->addBookTaglist($tl);
         }
     }
     $book->save();
     return $book->getBookTaglists();
}

然后我要修改action.class.php中的executeUpdatetags函数:

public function executeUpdatetags(sfWebRequest $request)
{
    if($request->isXmlHttpRequest())
    {
        $id=$request->getParameter('id');
        $tags=$request->getParameter('tags');
        return $this->renderPartial('books/tags',array('tags'=>BookBookPeer::doUpdateTags($id, $tags)));
    }
    else
    {
        $id=$request->getParameter('txtBookID');
        $tags=$request->getParameter('txtNewTag');
        BookBookPeer::doUpdateTags($id, $tags);
        $this->book=BookBookPeer::retrieveByPk($id);
        $this->redirect($this->generateUrl('book_detail', array('id'=>$id)));
     }
}

我用到了isXmlHttpRequest来判断是否是AJAX调用,如果是的话,那么按照AJAX的处理方式;否则就是常规的POST操作:获得参数,进行更新(复用了doUpdateTags函数),重新获得书籍对象,最后是重定向。

这里,我花费了不少时间去找到这个重定向中的URL生成函数,多亏了Symfony的教程。

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *