2017-02-13 9 views
-1

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

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

Так что в основном это действие контроллера должно принимать некоторый парам «тип», а затем возвращать разные результаты на основе этого типа. Цель состоит в том, чтобы не иметь 2-х контроллеров, чтобы отображать представление twig, которое делает почти то же самое, кроме извлечения различной информации на основе типа param. Однако я не могу заставить его работать. Это либо то, что обе вкладки оказывают одинаковые результаты, поскольку, по-видимому, вид только представлен как OR, что я получаю исключение в шаблоне веточки во время рендеринга. что бы правильно подойти к этой проблеме?

Большого спасибо.

+1

Пожалуйста, обновите вопрос с соответствующим кодом (контроллеры/просмотров) – DarkBee

+0

Был ли один из ответов ответом на ваш вопрос? –

ответ

2

Есть несколько способов для достижения этой цели Вы можете использовать инструкции if/else в шаблоне Twig, но вы также можете установить шаблон в своем контроллере. Это зависит от вас, что лучше всего подходит.

Способ 1: пользовательский шаблон

По умолчанию, Symfony использует 'foobar.html.twig' на вашем foobarAction() метод, но вы можете изменить это в методе:

public function recentArticlesAction($max = 3) 
    { 
     // make a database call or other logic 
     // to get the "$max" most recent articles 
     $articles = ...; 

     return $this->render(
      'article/recent_list.html.twig', 
      array('articles' => $articles) 
     ); 
    } 

(предупреждение: например, от How to Embed Controllers in a Template, но сама статья не имеет ничего общего с вопросом)

Вы можете установить переменную (например $templateName) и изменить его:

$templateName = 'recent_list.html.twig'; 
if ($admin) { 
    $templateName = 'another_template.html.twig'; 
} 

//or using parameters from you Request 
if ($type = $request->request->get('type')) { 
    $templateName = $type . '.html.twig'; 
} 

return $this->render(
    $templateName, 
    array('articles' => $articles) 
); 

Способ 2: с помощью Twig

Контроллер:

public function foobarAction(Request $request) 
{ 
    return [ 
     'type' => $request->request->get('type'); 
    ]; 
} 

Вы Twig шаблон:

{% if type == 'foo' %} 
<h1>Foo!</h1> 
<p>Hi, welcome you the foo page!</p> 
{% elseif type == 'bar' %} 
<h1>Bar!</h1> 
<p>Hi, you've reached the Bar page.</p> 
{% else %} 
<h1>Error!</h1> 
<p>Type not found.</p> 
{% endif %} 
0

Попробуйте вынести вручную каждый вид:

if ($type) { 
     return $this->render('home/template.html.twig', array('data' => $data)); 
    } 
    return $this->render('home/another.html.twig', array('another_data' => $another_data)); 
0

Большое спасибо за ответы здесь , но они действительно не помогли мне. В следующий раз я пытаюсь добавить больше примеров кода;)

Моя цель состояла в том, чтобы сделать из действия в шаблон, но с разными параметрами и сделать эти различные содержимое как обертонов в родительском представлении.

Пример: с учетом шаблона «view.html.twig», который включает в себя 2 раза шаблон «myPartial.html.twig», но первый раз с параметром и вторым временем без параметра. На основе этого параметра необходимо вернуть другое содержимое.

Мой вопрос был теперь, почему, по-видимому, только первое действие отображается в Symfony, так как мои частичные представления имеют одинаковый контент.

Так это то, что я в настоящее время:

1 контроллер, 2 Действия, как называют 3-го действия для извлечения данных и вернуть значение к действию вызова. Затем оба действия вызывают метод рендеринга со значениями, отображаемыми из третьего действия.

Это то, что он выглядит сейчас:

<div class="tab-content clearfix"> 
    <div class="tab-pane" id="1b"> 
    {% render controller('MyBundle:MyController:list1') %} 
    </div> 
    <div class="tab-pane" id="2b"> 
    {% render controller('MyBundle:MyController:list2', {'type' : 1}) %} 
    </div> 

Но то, что я хотел достичь было сделать что-то вроде этого (который не работал, потому что тогда обе вкладки будут показывать одинаковое содержание):

<div class="tab-content clearfix"> 
    <div class="tab-pane" id="1b"> 
    {% render controller('MyBundle:MyController:list') %} 
    </div> 
    <div class="tab-pane" id="2b"> 
    {% render controller('MyBundle:MyController:list', {'type' : 1}) %} 
    </div> 

Что я нахожу в заблуждение, поскольку в обоих случаях "визуализации" я s, поэтому я ожидал бы, что контроллер будет вызван в оба раза, так что и частичный вид в контроллере будет отображаться оба раза. Но, видимо, это было не так :(Сам контроллер выглядит примерно так:

public function list1Action() 
{ 
    $twigVars = //do something to build the twig vars without param; 
    return $this->render('@MyBundle/Test/partial_list.html.twig', array(
     'vars' => $twigVars, 
    )); 
} 

public function list2Action($param) 
{ 
    $twigVars = //do something to build the twig vars with param; 
    return $this->render('@MyBundle/Test/partial_list.html.twig', array(
     'vars' => $twigVars, 
    )); 
} 

Хотя то, что я хотел было что-то вроде этого:

public function listAction($param = '') 
{ 
    if ($param) { 
     $twigVars = //do something to return the twig vars with param; 
    } else { 
     $twigVars = //do something else to return twig vars without param; 
    } 
    return $this->render('@MyBundle/Test/partial_list.html.twig', array(
     'vars' => $twigVars, 
    )); 
}