2014-01-20 2 views
5

Предположим, у меня есть комментарии в нескольких местах на веб-сайте. Как я могу создать что-то вроде {{render_widget ('comments', {"object": object})}}? Это отобразит форму и список со всеми комментариями к этому объекту?Symfony, как создать многоразовый виджет с PHP и twig

+0

Возможно, попробуйте использовать [сервис] (http://symfony.com/doc/current/book/service_container.html) для этого? –

+0

Затем передайте эту услугу в шаблон ветки. –

+0

@ Виктор, пожалуйста, дайте мне пример кода. :) – CappY

ответ

5

Создание службы:

// src/Acme/HelloBundle/Service/Widget.php 
namespace Acme\HelloBundle\Service; 

use Symfony\Component\DependencyInjection\ContainerInterface; 

class Widget 
{ 
    protected $container; 

    public function __construct(ContainerInterface $container) 
    { 
     $this->container = $container; 
    } 

    public function getComments() 
    { 
     $request = $this->container->get('request'); // use service_container to access request, doctrine, twig, etc... 
    } 
} 

Declare службу:

# src/Acme/HelloBundle/Resources/config/services.yml 
parameters: 
    # ... 
    my_widget.class: Acme\HelloBundle\Service\Widget 

services: 
    my_widget: 
     class:  "%my_widget.class%" 
     arguments: ["@service_container"] 
     # scope: container can be omitted as it is the default 

Используйте службу в контроллере:

namespace Acme\HelloBundle\Controller; 

class BlogController { 

    public function getPostAction($id) { 
     // get post from db 
     $widget = $this->get('my_widget'); // get your widget in controller 
     $comments = $widget->getComments(); // do something with comments 

     return $this->render('AcmeHelloBundle:Blog:index.html.twig', 
      array('widget' => $widget) // pass widget to twig 
     ); 
    } 
} 

или прутик, если вы передаете свой сервис в шаблоне как указано выше в render() функция:

#AcmeHelloBundle:Blog:index.html.twig 

{{ widget.getComments()|raw }} 

И полезно прочитать документацию о How to work with Scopes

+0

Я попробую это. :) Мне не очень нравится добавлять | сырой фильтр везде ... – CappY

+0

И как можно получить экземпляр службы в Twig? – CappY

+0

Я должен, но я еще не нашел предложения, как не использовать фильтр '| raw'. Если вы нашли - скажите мне;) –

1

Я сделал это по-другому. Я зарегистрировал расширение Twig с функцией {{комментариев (объект)}}

Функция зарегистрирована таким образом

'comments' => new \Twig_Function_Method($this, 'comments', array(
     'needs_environment' => true, 
     'is_safe' => array('html') 
      )) 

Таким образом, мне не нужно указывать | необработанный фильтр.

+0

Что такое 'object' в' {{comments (object)}} '? –

+0

Переменная? : D Прокомментированный объект – CappY

Смежные вопросы