Как вернуть массив ветке в symfony2 и как его использовать?

1

Я написал действие в контроллере. Я хочу передать массив результатов в файл twig и также использовать его для цикла.

Вот мой код действия в контроллере

public function searchBookAction(Request $request)
{
       $q="PC";
       $conn = $this->get('database_connection');
       $results = $conn->fetchAll("SELECT name FROM products where name like '%".$q."%'");
    return array('results' => $results);
}

вот мой код сводки:

{%for data in results%}
<li>{{ data.name|e }}</li>
{% endfor %}
</ul>

В этом коде я получаю эту ошибку: переменные "результаты" не существуют в NimoProBundle: Product: product.html.twig

Теги:
symfony-2.6

3 ответа

1
Лучший ответ

Если вы хотите позвонить, чтобы использовать searchBookAction из javascript (как вы уже указали в своем комментарии), я бы предложил вам взглянуть на JsonResponse. Он выполняет разбор массива в JsonFormat. Json может быть декодирован javascript без проблем.

В вашем контроллере:

public function searchBookAction(Request $request)
{
    $q="PC";
    $conn = $this->get('database_connection');
    $results = $conn->fetchAll("SELECT name FROM products where name like '%".$q."%'");
    return new JsonResponse(array('results' => $results);
}

В вашем javascript-коде (я предполагаю, что вы используете jQuery вместо написания запроса самостоятельно):

<script>
$.get('path/to/your/controller', {}, function(response){
    response.results  //<- here you have your results
});
</script>
  • 0
    И могу ли я использовать этот код JavaScript в ветке?
  • 0
    И немного перепутанный с 'path / to / your / controller', вы можете написать пример пути?
Показать ещё 8 комментариев
3

Вы должны использовать $this->render() на контроллере

return $this->render('template.html.twig', array(
    'data' => $results,
));

в Twig вы сделали добро. Также не используйте соединение, подобное этому. Лучше использовать Doctrine ORM для своих моделей.

Заметка:

Если вы хотите использовать метод визуализации, вам необходимо расширить

Symfony\Bundle\FrameworkBundle\Controller\Controller;

сделать это

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

имя и использование выше класса extend на ваш класс.

Вы также можете использовать

class YourController extends Symfony\Bundle\FrameworkBundle\Controller\Controller

но это не довольно решение

Это хорошая лекция для вас:

  • 0
    Но я не хочу отображать элемент управления, я просто хочу вернуть массив просто
  • 0
    Я звоню searchBookAction () из javascript, поэтому мне просто нужно, чтобы массив результатов был доступен на странице веток
Показать ещё 3 комментария
1

Поскольку вы не хотите ничего отображать в своем контроллере:

Если массив НЕ является сущностью, тогда вы можете использовать класс JsonResponse, который превращает массив в формат JSON, сериализуя его.

В вашем контроллере используйте: return new JsonResponse(array('name' => $name));

Затем вы можете использовать resp = JSON.parse(your_json_response); в вашем javascript, чтобы декодировать его или просто сваливать в свою ветку. Или декодирование в веточке.

  • 0
    пробовал но не работает
  • 0
    Вы, вероятно, делаете что-то не так / отсутствует по линии. Я давно пользуюсь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню