生成在SonataAdmin中显示phpcr文档版本的自定义URL时出错

时间:2014-12-09 16:57:05

标签: symfony sonata-admin symfony-cmf doctrine-phpcr

所以我试图扩展SonataAdmin show视图以获得文档的版本列表(phpcr checkpoint或checkin)。

我已正确显示已保存版本的列表,现在我需要将它们显示为显示该内容版本的链接,但我在尝试添加自定义时遇到以下错误路线:

An exception has been thrown during the rendering of a template 
("Parameter "id" for route "admin_cmsbundle_product_show_version" must 
match "[^/]++" ("mstr/product/product-253562" given) to generate a 
corresponding URL.") in CmsBundle:product:show.html.twig at line 18.

这是我的管理类中的configureRoutes:

protected function configureRoutes(RouteCollection $collection)
{
    $collection->add('show_version', $this->getRouterIdParameter() . '/show/{version}');
}

这是我的覆盖模板:

{% block show %}

<ul>
    {% for version in versions %}
        <li><a href="{{  admin.generateObjectUrl('show_version', object, {'version': version.name}) }}">Version: {{ version.name }} </a></li>
    {% endfor %}
</ul>

{{ parent() }}    

{%endblock%}

这是我编辑过的show动作(包括版本列表):

public function showAction($id = null)
{ 
    ...
    return $this->render($this->admin->getTemplate('show'), array(
        'action'   => 'show',
        'object'   => $object,
        'elements' => $this->admin->getShow(),
        'versions' => $this->getVersionHistory($object)
    ));
}

这是我在控制器中的showVersion动作:

public function showVersionAction($id = null, $version = "1.0")
{ 
    ...
    return $this->render($this->admin->getTemplate('show'), array(
        'action'   => 'show',
        'object'   => $this->getVersion($object, $version),
        'elements' => $this->admin->getShow(),
        'versions' => $this->getVersionHistory($object)
    ));
}

注意,generateUrl给出了同样的错误:

<a href="{{  admin.generateUrl('show_version', {'id': object.id, 'version': version.name}) }}">Version: {{ version.name }} </a>

我做错了什么?

任何有关修复此问题的帮助都将非常感激:)

2 个答案:

答案 0 :(得分:0)

根据错误消息,$object存在一些问题。因此,可以使用generateUrl代替generateObjectUrl()并在数组中传递您的ID:

{% block show %}

<ul>
    {% for version in versions %}
        <li><a href="{{  admin.generateUrl('show_version', {'id':object.id,'version': version.name}) }}">Version: {{ version.name }} </a></li>
    {% endfor %}
</ul>

{{ parent() }}
{% endblock %}

答案 1 :(得分:0)

有点挖掘并且答案很简单,只需要覆盖id的模式。+

protected function configureRoutes(RouteCollection $collection)
{
    $collection->add('show_version', $this->getRouterIdParameter() . '/show/{version}', array(), array('id' => '.+'));
}