0

我想要的是,当单击按钮时,它会调用 .ajax 请求以通过 url 将三个变量传递给操作,以使用更改的图像 src 字符串更新数据库。

我似乎无法成功执行 .ajax 请求。我收到了我设置的错误警报。

这是执行ajax的jquery

    //click through multiple thumbs
        $(".prev").click(function() {
            $(this).parent().find(".thumb-container").find("div:last").insertBefore($(this).parent().find(".thumb-container").find("div:first"));
            $(this).parent().find(".thumb-container").find(".thumb").removeClass("selected");
            $(this).parent().find(".thumb-container").find("div:first").addClass("selected");
                var selectedImage = $(this).parent().find(".thumb-container").find(".selected").find("img").attr("src");
                var quiltPatchId  = $(this).parent().parent().parent().parent().attr("id");
                var CalendarOfEventsID = <?php print $CalendarOfEventsID        ?>;
                var briefsPatchId;
                //update image to uploadedImage field
                 $.ajax({
                    url: "/cms.php/calendar-of-events/"+CalendarOfEventsID+"/entries/update-image/"+quiltPatchId+"/"+selectedImage,
                    dataType: "json",
                    success: function(data){
                        briefsPatchId   =   data.briefsPatchId;
                    },
                    error: function(jqXHR, textStatus, errorThrown){
                        alert("Oops!  That image was not successfully updated.");
                    }
                 });

        })

所以ajax应该在这里调用带有变量的url到routing.yml中:

calendar_update_image:
  url: /calendar-of-events/:id/entries/update-image/:quiltPatchId/:selectedImage
  param: { module: calendar_of_events, action: updateImage }

然后调用actions.class

//update selected image
    public function executeUpdateImage(sfWebRequest $request){
        $briefsId     = $request->getParameter('id');
        $quiltPatchId = $request->getParameter('quiltPatchId');
        $selectedImage = $request->getParameter('selectedImage');

        $briefsPatch = Doctrine::getTable('CalendarOfEventsEntries')->find($quiltPatchId);

        $briefsPatch['uploadedImage'] = $selectedImage;
        $briefsPatch->save();
        $this->briefsPatchId    =   $briefsPatch['id'];
    }

然后我可以将一些数据传回模板updateImageSuccess.php

<?php
/*
* This page is only called via ajax, so no templating necessary; uses blank template
*/
$data = array('briefsPatchId' => $briefsPatchId);
echo json_encode($data);    
?>

我有这个在另一个模板中工作,使用拖放,所以我想也许我只是错过了一些小东西。有没有办法调试 ajax 调用以查看它在哪里失败?

更新:

主要问题在于 symfony 缓存。清除后,它可以标识页面 url。现在的问题是成功通过url获取图像字符串。我已经使用它对其进行了编码

selectedImage = encodeURIComponent(selectedImage);

它修复了“/”,但扩展正在丢弃 url。这可能需要开始一个新问题。如果是这样,请告诉我。

更新

好的,我已经让它工作了,通过拆分和弹出图像,使其成功通过 url。我认为有更好的方法可以做到这一点,所以如果这是一种不好的方法,请让他们知道。

这就是现在的工作:

var selectedImage = $(this).parent().find(".thumb-container").find(".selected").find("img").attr("src");

            var selectedImage = selectedImage.split('.');
            var imagePath = selectedImage[0];
            var imagePath = selectedImage[0].split("/").pop();
            var imageExt = selectedImage[1];

所以我获取图像字符串,将扩展名拉到另一个 var 中,然后 split.pop 图像字符串位置以删除所有以前的文件夹。

我原来是uploads/images/my_image.jpg,现在分成两个var,分别是imagePath = my_imageand imageExt = jpg,然后我通过url传递了这两个var

url: "/cms_dev.php/calendar-of-events/"+CalendarOfEventsID+"/entries/update-image/"+quiltPatchId+"/"+imagePath+"/"+imageExt,

并在动作中将它们拾起并重新组合在一起。

4

1 回答 1

1

我不会给你答案,但我会描述我将如何调试它:

  • 就在打电话之前$.ajax,发出警报以检查网址是否正常

    alert("/cms.php/calendar-of-events/"+CalendarOfEventsID+"/entries/update-image/"+quiltPatchId+"/"+selectedImage)
    
  • 如果您觉得 url 看起来像,在var_dump里面放一些executeUpdateImage看看参数是否正常:

    public function executeUpdateImage(sfWebRequest $request) {
      $briefsId      = $request->getParameter('id');
      $quiltPatchId  = $request->getParameter('quiltPatchId');
      $selectedImage = $request->getParameter('selectedImage');
    
      var_dump($briefsId);
      var_dump($quiltPatchId);
      var_dump($selectedImage);
      die();
    
  • 然后检查$quiltPatchId您的数据库中是否存在
  • var_dump保存到数据库的结果:

    $result = $briefsPatch->save();
    var_dump($result);
    die();
    
  • 最后,检查 javascript 中的错误消息并在开发模式下测试它(例如 frontend_dev.php):

    error: function(jqXHR, textStatus, errorThrown){
        alert("Oops!:"+textStatus);
    }
    

有了所有这些信息,您将能够找到问题所在。否则,返回有关调试的结果。

于 2013-01-28T16:53:41.270 回答