-
Going for Symfony | 第4.5天
Posted on February 10th, 2009 No comments在第四天的心得中,我留下了一个小问题:
一个小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<br> static public function doUpdateTags($id, $tags)<br> {<br> $book=BookBookPeer::retrieveByPk($id);<br> $currentTagLists=$book->getBookTaglists();<br> $tmp=array();<br> foreach ($currentTagLists as $value)<br> {<br> $tmp[]=$value->getTag();<br> }<br> $tagslist=explode(" ", $tags);<br> foreach ($tagslist as $tag)<br> {<br> if(!in_array($tag, $tmp))<br> {<br> $tl=new BookTaglist();<br> $tl->setId($id);<br> $tl->setTag($tag);<br> $book->addBookTaglist($tl);<br> }<br> }<br> $book->save();<br> return $book->getBookTaglists();<br> }然后我要修改action.class.php中的executeUpdatetags函数:
public function executeUpdatetags(sfWebRequest $request)<br> {<br> if($request->isXmlHttpRequest())<br> {<br> $id=$request->getParameter('id');<br> $tags=$request->getParameter('tags');<br> return $this->renderPartial('books/tags',array('tags'=>BookBookPeer::doUpdateTags($id, $tags)));<br> }<br> else<br> {<br> $id=$request->getParameter('txtBookID');<br> $tags=$request->getParameter('txtNewTag');<br> BookBookPeer::doUpdateTags($id, $tags);<br> $this->book=BookBookPeer::retrieveByPk($id);<br> $this->redirect($this->generateUrl('book_detail', array('id'=>$id)));<br> }<br> }
我用到了isXmlHttpRequest来判断是否是AJAX调用,如果是的话,那么按照AJAX的处理方式;否则就是常规的POST操作:获得参数,进行更新(复用了doUpdateTags函数),重新获得书籍对象,最后是重定向。
这里,我花费了不少时间去找到这个重定向中的URL生成函数,多亏了Symfony的教程。
Going for Symfony | 第4.5天
Posted on February 10th, 2009 No comments在第四天的心得中,我留下了一个小问题:
一个小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<br> static public function doUpdateTags($id, $tags)<br> {<br> $book=BookBookPeer::retrieveByPk($id);<br> $currentTagLists=$book->getBookTaglists();<br> $tmp=array();<br> foreach ($currentTagLists as $value)<br> {<br> $tmp[]=$value->getTag();<br> }<br> $tagslist=explode(" ", $tags);<br> foreach ($tagslist as $tag)<br> {<br> if(!in_array($tag, $tmp))<br> {<br> $tl=new BookTaglist();<br> $tl->setId($id);<br> $tl->setTag($tag);<br> $book->addBookTaglist($tl);<br> }<br> }<br> $book->save();<br> return $book->getBookTaglists();<br> }然后我要修改action.class.php中的executeUpdatetags函数:
public function executeUpdatetags(sfWebRequest $request)<br> {<br> if($request->isXmlHttpRequest())<br> {<br> $id=$request->getParameter('id');<br> $tags=$request->getParameter('tags');<br> return $this->renderPartial('books/tags',array('tags'=>BookBookPeer::doUpdateTags($id, $tags)));<br> }<br> else<br> {<br> $id=$request->getParameter('txtBookID');<br> $tags=$request->getParameter('txtNewTag');<br> BookBookPeer::doUpdateTags($id, $tags);<br> $this->book=BookBookPeer::retrieveByPk($id);<br> $this->redirect($this->generateUrl('book_detail', array('id'=>$id)));<br> }<br> }
我用到了isXmlHttpRequest来判断是否是AJAX调用,如果是的话,那么按照AJAX的处理方式;否则就是常规的POST操作:获得参数,进行更新(复用了doUpdateTags函数),重新获得书籍对象,最后是重定向。
这里,我花费了不少时间去找到这个重定向中的URL生成函数,多亏了Symfony的教程。
Leave a reply


最新回复