在第四天的心得中,我留下了一个小问题:
一个小bug:现在的情况是,只能用点击那个按钮的方式来提交新的tags,如果输入了一些tags然后用回车的话,会出错。这个问题我将留在日后解决。先让我得意一会吧……
当时我认为这个问题很容易解决,因为我想到了至少两种解决方法:
- 在jQuery中截获回车,然后不加任何处理;
- 在
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的教程。
Leave a Reply