2016-09-20 1 views
1

Оказывать TOC (категории деревьев) внутри base.twig зрения я называю функцию render() передав ей соответствующий URL действия:Анализ текущего uri для получения текущих параметров маршрута внутри частичного. Как избежать?

{% block sidebar %} 

    {{ render(url('toc_documents_categories')) }}  

{% endblock %} 

согласующего частичный вид на '/toc/documents' действия (_toc.documents_categories. прут) определяется следующим образом:

{% set category_id = (current_uri|split('/'))[4] %} 

{% macro recursiveCategory(category, active_category_id) %} 

    <li> 

     {% if category.children|length %} 

      <a><span class="icon icon-plus"></span>{{ category.name_displayed }}</a> 

     {% else %} 

      {% set active_class = active_category_id == category.id ? 'active' %} 
      {% set url = app.url_generator.generate('documents_by_category', {category_id: category.id}) %} 

      <a href="{{ url }}" class="{{ active_class }}"> 
       {{ category.name_displayed }} 
      </a> 

     {% endif %} 

     {% if category.children|length %} 
      <ul> 
       {% for child in category.children %} 
        {{ _self.recursiveCategory(child, active_category_id) }} 
       {% endfor %} 
      </ul> 
     {% endif %} 
    </li> 
{% endmacro %} 

{% if categories %} 
    <div id="categories"> 
     <ul> 
      {% for category in categories %} 
       {{ _self.recursiveCategory(category, category_id) }} 
      {% endfor %} 
     </ul> 
    </div> 
{% endif %} 

Как вы можете видеть, я извлекая идентификатор текущей категории путем разбора текущего URL. Этому предшествует путем установки current_uri глобальные:

$app->before(function(Request $request) use ($app) { 
    $app['twig']->addGlobal('current_uri', $request->getRequestUri()); 
}); 

Доступ к информации о маршруте (global.request.attributes.get('_route')) внутри частичного вида показывает соответствующий подзапрос название маршрута, а не фактическое имя запрос маршрута (мастера запрос) ,

Есть ли способ избежать ручного анализа текущего uri и получения текущих параметров маршрута запроса в частичном представлении?

+2

Почему бы не передать category_id в функции 'render'? 'base.twig' всегда будет самым верхним запросом. – keyboardSmasher

+0

@keyboardSmasher Большое спасибо, я думаю, я понял, что вы имели в виду! – lexeme

ответ

0

Вот решение.

render() выдает подзапрос, так что вы должны использовать мастер запроса контекст:

use Symfony\Component\HttpFoundation\Request 

$app->get('/documents_categories', function(Request $request) use($app) { 

    $master_request = $app['request_stack']->getMasterRequest(); 
    $current_route = $master_request->get('_route'); 
    $active_category_id = null; 

    if($current_route === 'documents_by_category') { 
     $active_category_id = $master_request->get('_route_params')['category_id']; 
    } 

    // ... do things: parse toc tree ... 

    return $app['twig']->render('_toc.documents.categories.twig', array(
     "categories" => $toc_tree, 
     "active_category_id" => $active_category_id 
    )); 

})->bind('toc_documents_categories'); 

Затем в частичном виде, вы должны ссылаться только пропущенный active_category_id параметр:

{% if categories %} 
    <div id="categories"> 
     <ul> 
      {% for category in categories %} 
       {{ _self.recursiveCategory(category, active_category_id) }} 
      {% endfor %} 
     </ul> 
    </div> 
{% endif %} 

Благодаря @keyboardSmasher для 'Почему бы не передать category_id в функции render n 'комментарий. Но я не уверен, сделал ли я это так, как он предполагал.

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