2017-02-11 13 views
1

Я работаю над проектом с symfony 3 и хочу динамически получать список пользователей из базы данных по имени проекта, над которым они работают.Как включить AJAX в twig с Symfony 3

Это действие контроллера: enter image description here

Таким образом, он не показывает ничего, он показывает только первый пользователь, если я записать действие таким образом: enter image description here

+0

я первый запустить все это с помощью отладчика, сделать точку останова где вы получаете свои результаты и проверяете, что вы получаете в $ pus. Если вы не можете запустить отладчик, просто вставьте несколько var_dump ($ pus) прямо перед foreach. Это даст вам ключ к проблеме. Трудно сказать, не зная вашу структуру ProjectUser, или если findByName на самом деле является встроенной функцией репозитория или что-то, что вы написали. Во всяком случае, то, что ЛеБлобб упомянул в своем ответе, будет гораздо больше в соответствии с тем, что ожидается в Symfony, вместо того, чтобы генерировать HTML внутри контроллера. – userfuser

+0

Проблема была в запросах хранилища, которые я исправил, но теперь цикл foreach ничего не возвращает. любой массив, построенный в foreach, отмечен как undefined, если я использую его позже вне цикла. –

+0

Этого не должно быть. Вы уверены, что правильно строите массив или даже попадаете в этот foreach? У вас включена учетная запись об ошибках? Возможно, что-то происходит, о чем вы не видите. Вы работаете в режиме разработки или производства? – userfuser

ответ

1

Если я понимаю правильно, у вас есть страница, на которой у вас есть запрос AJAX, который должен вернуть некоторые данные, уже полученные с помощью ветки.

Что вам нужно сделать, это:

  1. Один контроллер, который возвращает нормальный HTML страницу

  2. Второй контроллер, который возвращает ваши оказанные данные так же, как ваш первый контроллер делает, но это один использует шаблон, который содержит только HTML, который будет возвращен запросом AJAX.

  3. В запросе AJAX вызовите маршрут, определенный во втором контроллере, и отобразите результат.

Пример1:

ControllerOne.php:

class ControllerOne extends Controller 
{ 
    /** 
    * @Route("/") 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function indexAction() 
    { 
     // show your page 
     return $this->render('index.html.twig'); 
    } 
} 

ControllerTwo.php:

class ControllerTwo extends Controller 
{ 
    /** 
    * @Route("get/data/{userId}") 
    * @param $userId 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function getDataAction($userId) 
    { 
     // get some data 
     $em = $this->getDoctrine()->getManager(); 

     // this example shows retrieving user data 
     // implement your logic for retrieving projecty by user id here 
     $userData = $em->getRepository('AppBundle:User')->findOneBy(array('id' => $userId)); 

     return $this->render('user.data.html.twig', array('user' => $userData)); 
    } 
} 

index.html.twig:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
    <script type="application/javascript"> 

     // call the controller to get the rendered data 
     $.ajax({ 
      url: "/get/data/1" 
     }) 
       .done(function(data) { 
        // insert data into div 
        $("#myDiv").html(data); 
       }); 
    </script> 
</body> 
</html> 

user.data.html.twig:

<div> 
    <p> 
     <!-- you have access to the data passed from controller here --> 
     User name: {{user.name}} 
    </p> 
</div> 

Example2:

JsonResponseController.php:

class JsonResponseController extends Controller 
{ 
    /** 
    * @Route("get/data/{userId}") 
    * @param $userId 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function getDataAction($userId) 
    { 
     // get some data 
     $em = $this->getDoctrine()->getManager(); 

     // this example shows retrieving user data 
     // implement your logic for retrieving projecty by user id here 
     $userData = $em->getRepository('AppBundle:User')->findOneBy(array('id' => $userId)); 

     return new JsonResponse(array('userData' => $userData)); 
    } 
} 
+0

У меня нет другого представления для рендеринга. Я просто хочу, чтобы первые имена пользователей отображались в . –

+0

. Тогда вам просто нужно вернуть Symfony \ Component \ HttpFoundation \ JsonResponse в ваше действие, где вы извлекаете данные: http : //symfony.com/doc/current/components/http_foundation.html#creating-a-json-response Если это помогает, плохо адаптируйте мой ответ, чтобы вы могли принять его – LeBlobb

+0

Я добавил еще один пример – LeBlobb