Tag: redirect

  • 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的教程。