Как загрузить функцию контроллера и отобразить ее в теге twig с помощью Symfony2?
Я использую Symfony2 и Twig. У меня есть функция (ниже) в моем контроллере, которая возвращает определенный текст. Можно ли вызвать эту функцию непосредственно из моего шаблона и изменить {{text}} в моем шаблоне на то, что возвращает функция, возможно через Ajax?
Здесь моя функция:
public function generateCode($url) {
$url = $_SERVER['SERVER_NAME'] . '/embed/' . $url;
$return = '<iframe>'.$url.'</iframe>';
return $return;
}
Другая функция контроллера вызывает функцию выше и отображает мой шаблон:
public function getCodeAction($url) {
$text = $this->generateCode($url);
return $this->render('MyMyBundle:User:code.html.twig', array('text' => $text));
}
В моем шаблоне я использую:
{{ text }}
чтобы отобразить значение.
Ответы
Ответ 1
Вы можете использовать ajax, если у вас есть динамические данные, но, насколько я могу судить по вашей краткой информации, вы всегда можете выполнять эту функцию контроллера прямо из вашего представления:
{% render "MyMyBundle:User:generateCode" with { 'url': 'your url here' } %}
Дополнительная информация об этом доступна по адресу:
http://symfony.com/doc/2.0/quick_tour/the_view.html, при вставке других контроллеров
Ответ 2
В Symfony 2.2 это было изменено.
Подписи и аргументы тега рендеринга изменены.
До:
{% render 'BlogBundle:Post:list' with { 'limit': 2 }, { 'alt': BlogBundle:Post:error' } %}
После:
{% render controller('BlogBundle:Post:list', { 'limit': 2 }), { 'alt': 'BlogBundle:Post:error' } %}
или
{{ render(controller('BlogBundle:Post:list', { 'limit': 2 }), { 'alt': 'BlogBundle:Post:error'}) }}
Примечание. Функция является предпочтительным способом.
См. https://github.com/symfony/symfony/blob/2.2/UPGRADE-2.2.md
Ответ 3
Для записи в новых версиях вам необходимо использовать абсолютный URL-адрес:
{{ render url('my_route_id', {'param': value}) }}
Ответ 4
{{render (контроллер ( "AcmeDemoBundle: Demo: topArticles", {'num': 10}))}}
Ответ 5
В Silex я решил это следующим образом:
{{ render(url('route_name', {'param': value})) }}
Если у вас нет имени маршрута, можно использовать URL:
{{ render(app.request.baseUrl ~ '/some-path/' ~ value) }}
Если вы используете URL-адрес, мы всегда должны указывать baseUrl.
Ответ 6
Symfony 2.6 +
в ветке:
{{ render(controller('AppBundle:PropertySearch:featuredProperties', {'limit': 15})) }}
контроллер:
/**
* featuredPropertiesAction
*
* @param Request $request
* @param int $limit
*
* @return Response
*/
public function featuredPropertiesAction(Request $request, $limit)
{
$search = $this->resultsHelper->featuredSearch($limit);
return $this->render('HASearchBundle::featured_properties.html.twig', [
'search' => $search,
]);
}