Получить данные из шаблона веточки в Symfony2? - PullRequest
3 голосов
/ 15 декабря 2011

Я хочу получить данные из базы данных и отобразить их в шаблоне. Обычно я делаю это из контроллера и передаю эти данные как переменную, однако я хочу получать разные объемы данных, используя один и тот же метод, в зависимости от того, какой шаблон вызывает этот метод. Я смотрел на встраиваемые контроллеры, но я хочу только данные, а не визуализированные HTML http://symfony.com/doc/2.0/book/templating.html#embedding-controllers

Пример

{# views/template1.html.twig #}

{% for item in FetchDBdata('someParam', 20)  %}
    {{ item.name }}
    {{ item.title }}
{% endfor %}


{# views/template2.html.twig #}

{% for item in FetchDBdata('someOtherParam', 40)  %}
    {{ item.name }}
    {{ item.title }}
{% endfor %}

где FetchDBdata('someParam', 40) будет в классе обслуживания в приложении

Ответы [ 3 ]

9 голосов
/ 15 декабря 2011

Чтобы добавить мой комментарий выше:

У вас будет контроллер с действием для извлечения ваших данных:

Acme \ SomeBundle \ Controller \ DataController.php

/**
 * @Template
 */
public function fetchDataAction($someParam, $quantity) {
    $data = doSomethingWithDatabase();

    return array('data' => $data);
}

Acme \ SomeBundle \ Resources \ view \ Data \ fetchData.html.twig

{% for item in data %}
    {{ item.name }}
    {{ item.title }}
{% endfor %}

затем в ваших template1 и template2Вы можете жестко закодировать свои значения, если это подходит, или использовать значения, которые передаются в эти шаблоны соответственно.

{% render 'AcmeSomeBundle:Data:fetchData' with {'someParam': 'something', 'quantity': 20} %}
1 голос
/ 04 января 2013

Возможное решение - использовать глобальные переменные ветки.

Например, если вы используете Doctrine2 и ваш метод для извлечения данных findSth реализован в хранилище Your\Model, вы можете определить:

#config.yml
twig:
    globals:
        em: @doctrine.orm.entity_manager

И в вашем шаблоне

{% set data = em.getRepository ("Your \ Model"). FindSth (.. params ...)%}

1 голос
/ 15 декабря 2011

Если вы действительно уверены, что хотите вызывать модель более прямо из вашего шаблона, у меня есть два варианта, которые я вижу:

Либо вы делаете услугу, которая вам нужна, доступной для шаблона, например:

public function viewPostsAction() {
    return array('templatingDataService' => $this->get('templating_data_service'));
}

который, я думаю, вы могли бы затем вызвать методы в представлении:

{% set someData = templatingDataService.someMethod('params', 40) %}

В качестве альтернативы, если вы не хотите передавать службу шаблону для получения необходимых данных, вы можете создать расширение ветки, о котором вы можете прочитать: здесь , здесь и здесь . (Следите за этой последней ссылкой, хотя я думаю, что она включает в себя множество ненужных шагов, поэтому я предоставлю более короткую версию.

Чтобы создать функцию Twig, такую ​​как FetchDbData:

Сначала вам нужен класс, который делает подъем:

Acme \ SomeBundle \ Extension \ TemplateDataExtension.php

class CurrencyExtension extends \Twig_Extension {
    // Read about \Twig_Extension in my second link.

    private $doctrine;

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

    public function getName() {
        return 'AcmeTemplateDataExtension';
    }

    public function getFunctions() {
        return array('FetchDbData' => new \Twig_Function_Method($this, 'fetchDbData'));
    }

    public function fetchDbData($someParam, $quantity) {
        // Do whatever you want and return it.
    }
}

Вы должны быть в состоянии вызвать это прямо из шаблона с FetchDbData($params, $quantity).

Теперь вам также нужно зарегистрировать это как расширение, которое вы делаете через services.yml:

parameters:
  template_data_extension.class: Acme\SomeBundle\Extension\TemplateDataExtension

services:
  template_data_extension:
      class:  %template_data_extension.class%
      arguments: [@doctrine]
      tags:
          -  { name: twig.extension }

По сути, эти шаги должны были позволить вам сделать функцию доступной из ветки (при условии, что я все понял;)). Вы можете добавить столько функций, сколько вы хотите, к расширению в одном классе, чтобы избежать необходимости создавать несколько расширений каждый раз, когда вам нужно больше данных, доступных в представлении - хотя я не совсем уверен, для чего я бы пошел, расширение ветки или передача услуги на просмотр.

Надеюсь, это даст вам еще несколько опций, которые могут вписаться в то, как вы планируете проект вашей шаблонной системы:).

Edit: Также просто примечание, чтобы сказать, что я предполагаю, что в схеме вещей вспомогательный объект (расширение ветки для доступа к сервису или передача сервиса) не кажется плохим, так как на самом деле представление обращается к контроллеру с получить некоторые данные, насколько я могу судить. Также я думаю , возможно, есть способ получить доступ к контроллеру, который визуализировал сам шаблон через _controller, который может быть другим местом для размещения методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...