【问题标题】:Pulling records from database to javascript by Symfony2 controller通过 Symfony2 控制器将记录从数据库中提取到 javascript
【发布时间】:2013-08-02 10:00:23
【问题描述】:

我正在尝试从我的数据库中获取类别列表并将其放入我的 javascript 代码中,以便我以后可以使用它。但是我遇到了这个任务的问题 - 在将此列表返回到 javascript 之后 - 它们是空的。

这是我的 symfony2 控制器操作代码:

public function fetchCategoriesAction(){
     $categories = $this->getDoctrine()->getRepository('MyDataBundle:Category')->findAll();
     $return=array("responseCode"=>200,  "categories"=>$categories);
     $return=json_encode($return);//jscon encode the array
     return new Response($return,200,array('Content-Type'=>'application/json'));
}

这是我的js代码:

var 类别;

函数 categoriesLoad(){

var url=$("#categories_fetch").val(); //link to my controller

$.post(url,function(data){

     if(data.responseCode==200 ){           
         categories = data.categories;
         console.log(categories);
     }else{
       console.log("An unexpeded error occured.");
    }
});

}

我在跑步 $(document).ready(function() { categoriesLoad(); });

但是在使用 console.log(categories) 之后,我得到了 空对象,尽管它们的数量与数据库中的记录数量相匹配。

我刚开始在 symfony2 中编程,如果有任何帮助,我将不胜感激 :)

编辑:

已解决

我刚刚更改了我的控制器操作代码。 这里更新了:

public function fetchCategoriesAction(){

    $encoders = array(new XmlEncoder(), new JsonEncoder());
    $normalizers = array(new GetSetMethodNormalizer());
    $serializer = new Serializer($normalizers, $encoders);

    $em = $this->getDoctrine()->getManager();
    $categories = $em->createQuery(
            'SELECT u
            FROM MyDataBundle:Category u'
    )->getResult();

    $categories = $serializer->serialize($categories, 'json');
    $return=array("responseCode"=>200,  "categories"=>$categories);
    $return=json_encode($return);
    return new Response($return,200,array('Content-Type'=>'application/json'));
}

现在它工作正常。 感谢@Pawel 和@SAM

【问题讨论】:

  • 小贴士,1.你是否在php端获取$categories数组,2.如果你获取$categories的值,然后尝试console.log(data); 3. 定义类别:var categories = data.categories;让我知道结果
  • @SAM 1. 我之前在 php 端制作了测试函数,它包含看起来像这样的变量: public function testAction(){ $categories = $this->getDoctrine()->getRepository ('VelrezDataBundle:Category')->findAll();返回新的响应(var_dump($categories)); }
  • 你能告诉我2的状态吗?如果你得到$categories的值,那么试试console.log(data);这样我就可以得到一些线索
  • 输出是这样的:array(5) { [0]=> object(Proj\DataBundle\Entity\Category)#333 (2) { ["name":"Proj\DataBundle\Entity\Category":private]=> string(8) "Test2" ["id":"Proj\DataBundle\Entity\Category":private]=> int(17) } [1]=> object(Proj\DataBundle\Entity\Category)#334 (2) { ["name":"Proj\DataBundle\Entity\Category":private]=> string(10) "Multimedia" ["id":"Proj\DataBundle\Entity\Category":private]=> int(15) }... }

标签: javascript jquery ajax database symfony


【解决方案1】:

我的例子: PHP函数:

public function getDistrictListAction($id) {

        $em = $this->getDoctrine()->getManager();

        $query = $em->createQuery(
           // DQL
        );

        return new JsonResponse($query->getArrayResult());
    }

JS代码:

var dropdown = $('.dropdown-selector');
dropdown.change( function() {
    $.ajax({
         url: 'url_to_function'
         beforeSend: function() {
              dropdown.attr('disabled', true);
         },
         success: function(data) {
              dropdown.find('option').not('[value=]').remove();
              $.each( JSON.parse(data), function(key, value) {
                   dropdown.append( $( "<option></option>" ).attr( "value", value.id ).text( value.name ));
              });
              dropdown.attr('disabled', false);
         }
    });
}

您可以将其设置为更改事件,例如作为回调。在发送之前禁用下拉菜单,并在通过 AJAX 选项加载后再次启用它。

【讨论】:

  • 小提示;你没有 json_encode 结果,你可以直接将它提供给 JsonResponse 的构造函数。还要确保在将其放入 json 响应或使用 getArrayResult() 之前使用简单的对象或数组持久化器。
猜你喜欢
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多