如何解析json对象树枝

问题描述

我尝试在我的视图中解析json。 我在控制器中做到了

    /**
 * @Route(path="/newadmin/invoice/showAllContract",name="showAllContract")
 * @param Request $request
 * @return JsonResponse
 */
public function viewContract(Request $request)
{
    $entityManager = $this->getDoctrine()->getManager();
    $template_id = $request->get('user');
    $getName = explode(" ",$template_id);
    $firstname = $getName[0];
    $lastname = $getName[1];
    $templateRepository = $entityManager->getRepository(ClientContract::class)->getListPerUser($firstname,$lastname);

    return new JsonResponse(json_encode($templateRepository));
}

它将返回一个我想在树枝中使用的json。

                {{ form_start(createInvoice) }}
            {{ form_row(createInvoice.daysWorked) }}
            {{ form_row(createInvoice.bankHolidays) }}
            {{ form_row(createInvoice.workSaturdays) }}
            {{ form_row(createInvoice.workSundays) }}
            {{ form_row(createInvoice.user) }}
           {#      my contract          #}
            {{ form_end(createInvoice) }}

<script>
    $(document).ready(function () {
        $('#invoice_manual_creation_user').change(function (message) {
            $('#hidden').show();

            let userName = $('#invoice_manual_creation_user option:selected').text();
            console.log(userName)

            $.get("{{ path('showAllContract') }}",{'user': userName})
        });
    });
</script>

在帮助我加深理解方面会提供帮助。

编辑:

谢谢您的帮助,我应该添加一些详细信息。

当您选择关联的用户时,我试图获取一份有效的合同,这就是为什么我在存储库中这样做了:

    /**
 * @param $firstname
 * @param $lastname
 * @return mixed
 * @throws DBALException
 */
public function getListPerUser($firstname,$lastname)
{
    $em = $this->getEntityManager();

    $query = '
        SELECT clientname 
        FROM contact_end_client c
        INNER JOIN client_contract cli ON cli.clientname_id = c.id AND  cli.active
        INNER JOIN user u ON u.id = cli.user_id
        WHERE u.firstname = :firstname AND u.lastname = :lastname AND cli.active = 1
        ';

    $stmt = $em->getConnection()->prepare($query);
    $param = ['firstname' => $firstname,'lastname' => $lastname];
    $stmt->execute($param);
    return $stmt->fetchAll();
}

解决方法

1个改进解决方案

  • 在您的控制器中

如果您不知道symfony ParamConverter ,则必须查看它,它将对您有很大帮助。并了解原因 我使用了{id}通配符 / newadmin / invoice / {id} / showAllContract viewContract(User $ user ...)

 /**
 * @Route("/newadmin/invoice/{id}/showAllContract",name="show_all_contract")
 * @param User $user
 * @param Request $request
 * @return JsonResponse
 */
public function viewContract(User $user,Request $request)
{
    $entityManager = $this->getDoctrine()->getManager();
   

    $templateRepository = $entityManager->getRepository(ClientContract::class)->getListPerUser($user->getFirstname(),$user->getLastname());

    return new JsonResponse(['templateRepository' => $templateRepository]);
}
  • 在template.twig
<select id="invoice_manual_creation_user">
    <option data-link="{{ path('show_all_contract',{'id' : createInvoice.user.id}) }}">Firstname Lastname</option>  
</select>

//...

<script>
    $(document).ready(function () {

        $('#invoice_manual_creation_user').change(function (event) {
            event.preventDefault();
            
            $('#hidden').show();         
            var path  = $(this).find(':selected').attr('data-link');


           $.post(path,function(data) {
               var templateRepository = data.templateRepository; 
                    // do what you want with your data
              });

        });

    });
</script>

2为您的解决方案

  • 在模板树枝中

            {{ form_start(createInvoice) }}
            {{ form_row(createInvoice.daysWorked) }}
            {{ form_row(createInvoice.bankHolidays) }}
            {{ form_row(createInvoice.workSaturdays) }}
            {{ form_row(createInvoice.workSundays) }}
            {{ form_row(createInvoice.user) }}

            // your list contract here
             <ul id="my-contract-list">
               
            </ul> 
            
            {{ form_end(createInvoice) }}

<script>
$(document).ready(function() {
    $('#invoice_manual_creation_user').change(function(message) {
        $('#hidden').show();

        let userName = $('#invoice_manual_creation_user option:selected').text();
        console.log(userName);

        const url = "{{ path('showAllContract',{'user': " + userName + "}) }}";

        $.get(url,function(data) {
            var myContractListUl = $("#my-contract-list");

            // if data is empty
            if (data.length === 0) {

                var li = $('<li></li>').text('Contracts not found');
                myContractListUl.append(li);
                return;
            }
            // we loop data and for each item we create li and append it to ul (my-contract-list)
            $.each(data,function(index,item) {
                var li = $('<li></li>').text(item.clinentName);
                myContractListUl.append(li);
            });
        });
    });
});
</script>