所有的都是幻觉,是幻觉!你吓不倒我的!
RSS icon Home icon
  • Going for Symfony | 第4.5天

    Posted on February 10th, 2009 TR@SOE No comments

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

    一个小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<br>    static public function doUpdateTags($id, $tags)<br>    {<br>        $book=BookBookPeer::retrieveByPk($id);<br>        $currentTagLists=$book-&gt;getBookTaglists();<br>        $tmp=array();<br>        foreach ($currentTagLists as $value)<br>        {<br>            $tmp[]=$value-&gt;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-&gt;setId($id);<br>                $tl-&gt;setTag($tag);<br>                $book-&gt;addBookTaglist($tl);<br>            }<br>        }<br>        $book-&gt;save();<br>        return $book-&gt;getBookTaglists();<br>    }

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

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

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

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

    Going for Symfony | 第4.5天

    Posted on February 10th, 2009 TR@SOE No comments

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

    一个小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<br>    static public function doUpdateTags($id, $tags)<br>    {<br>        $book=BookBookPeer::retrieveByPk($id);<br>        $currentTagLists=$book-&gt;getBookTaglists();<br>        $tmp=array();<br>        foreach ($currentTagLists as $value)<br>        {<br>            $tmp[]=$value-&gt;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-&gt;setId($id);<br>                $tl-&gt;setTag($tag);<br>                $book-&gt;addBookTaglist($tl);<br>            }<br>        }<br>        $book-&gt;save();<br>        return $book-&gt;getBookTaglists();<br>    }

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

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

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

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

    Leave a reply

所有的都是幻觉,是幻觉!你吓不倒我的!
RSS icon Home icon
  • Going for Symfony | 第4.5天

    Posted on February 10th, 2009 TR@SOE No comments

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

    一个小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<br>    static public function doUpdateTags($id, $tags)<br>    {<br>        $book=BookBookPeer::retrieveByPk($id);<br>        $currentTagLists=$book-&gt;getBookTaglists();<br>        $tmp=array();<br>        foreach ($currentTagLists as $value)<br>        {<br>            $tmp[]=$value-&gt;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-&gt;setId($id);<br>                $tl-&gt;setTag($tag);<br>                $book-&gt;addBookTaglist($tl);<br>            }<br>        }<br>        $book-&gt;save();<br>        return $book-&gt;getBookTaglists();<br>    }

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

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

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

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

    Going for Symfony | 第4.5天

    Posted on February 10th, 2009 TR@SOE No comments

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

    一个小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<br>    static public function doUpdateTags($id, $tags)<br>    {<br>        $book=BookBookPeer::retrieveByPk($id);<br>        $currentTagLists=$book-&gt;getBookTaglists();<br>        $tmp=array();<br>        foreach ($currentTagLists as $value)<br>        {<br>            $tmp[]=$value-&gt;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-&gt;setId($id);<br>                $tl-&gt;setTag($tag);<br>                $book-&gt;addBookTaglist($tl);<br>            }<br>        }<br>        $book-&gt;save();<br>        return $book-&gt;getBookTaglists();<br>    }

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

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

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

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

    Leave a reply