Sonata Admin Bundle:添加配置列表中相关实体的链接

时间:2014-04-07 15:00:00

标签: symfony sonata-admin

我想提供与我当前实体列表的相关实体的直接链接。

我尝试将addIdentifier用于相关实体列,但它会将我重定向到我当前的实体。

我在文档中没有发现任何解释如何实现这一点。

这是我正在做的一个例子:

enter image description here

我目前正在列出我的“数据资料”实体。他们有相关的实体,如“Entrainement”,“Niveau”或“Program”。如果我点击“Se defouler”,我希望被重定向到“程序”列表,对于显示相关实体的每个列,我也是如此。

以下是我当前管理员类的configureListFields实现:

/**
  * @param ListMapper $listMapper
  */
protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier( 'type.titre' , null, array ( 'label' => 'Type') )
        ->add('valeur', null, array ( 'label' => 'Valeur' ) )
        ->add('bioprofile.titre', null, array ( 'label' => 'Bio Profile' ) )
        ->add( 'exercicesData.entrainement.niveau.titre', null, array( 'label' => 'Niveau' , 'route' => array( 'name' => 'edit') ) )
        ->add( 'exercicesData.entrainement.titre' , many_to_one, array ( 'label' => 'Entrainement' ) )
        ->add( 'exercicesData.entrainement.niveau.programme.titre' , null , array ( 'label' => 'Programme' ) )
        ->add('_action', 'actions', array(
            'actions' => array(
                'show' => array(),
                'edit' => array(),
                'delete' => array(),
            )
        ))
    ;
}

我尝试了不同的方法:

  • 带有选项“route”的一个,其中包含一个数组,其中相关实体的行为名称重定向(根据官方文档)
  • 具有“many_to_one”列表类型的另一个,根据官方文档,重定向到目标实体。

它们都不起作用。

PS:在屏幕截图中,“Niveau 2”,“Seance 1”和“se defouler”上有一些链接。它们实际上是使用addIdentifier显示的。

2 个答案:

答案 0 :(得分:15)

Sonata仅在添加实体时添加指向相关实体的链接,而不是在添加实体属性时添加。

以下示例将添加指向Entity2的链接:

/**
 * @param ListMapper $listMapper
 */
protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ...
        ->add('Entity2')
        ...
    ;
}

虽然此示例不会添加指向entity2的链接:

/**
 * @param ListMapper $listMapper
 */
protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ...
        ->add('Entity2.name')
        ...
    ;
}

如果您想在链接中显示name属性,则必须在__toString()中添加或更改Entity2方法:

class Entity2
{
    ...
    public function __toString()
    {
        return (string) $this->name;
    }
}

您的管理员类应该是这样的:

/**
 * @param ListMapper $listMapper
 */
protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier( 'type.titre' , null, array ( 'label' => 'Type') )
        ->add('valeur', null, array ( 'label' => 'Valeur' ) )
        ->add('bioprofile.titre', null, array ( 'label' => 'Bio Profile' ) )
        ->add( 'exercicesData.entrainement.niveau', null, array( 'label' => 'Niveau' , 'route' => array( 'name' => 'edit') ) )
        ->add( 'exercicesData.entrainement' , many_to_one, array ( 'label' => 'Entrainement' ) )
        ->add( 'exercicesData.entrainement.niveau.programme' , null , array ( 'label' => 'Programme' ) )
        ->add('_action', 'actions', array(
            'actions' => array(
                'show' => array(),
                'edit' => array(),
                'delete' => array(),
            )
        ))
    ;
}

您应该更改以下实体:

实体Entrainement

class Entrainement
{
    ...
    public function __toString()
    {
        return (string) $this->titre;
    }
}

实体Niveau

class Niveau
{
    ...
    public function __toString()
    {
        return (string) $this->titre;
    }
}

实体Programme

class Programme
{
    ...
    public function __toString()
    {
        return (string) $this->titre;
    }
}

希望这有帮助

答案 1 :(得分:1)

默认路由是编辑,如果在目标实体sonataAdmin服务中禁用编辑路由,则应使用  ->add('{yourRelationAttribute}', null, ['label' => 'label', 'route' => ['name' => 'show']])

我知道这对你来说不是问题,但我也被困住了,我认为它可以帮助别人。