使用Sonata Admin-Symfony 2.0显示字段时出现问题

使用Sonata Admin-Symfony 2.0显示字段时出现问题,symfony,sonata-admin,Symfony,Sonata Admin,我想用SonataAdmin显示对象的一些字段。其中一个字段是数据库中的整数状态,但我不想显示整数,否则根据此字段的值显示特定字符串 public function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('name') ->add('notice') ->add('start') ->add(

我想用SonataAdmin显示对象的一些字段。其中一个字段是数据库中的整数状态,但我不想显示整数,否则根据此字段的值显示特定字符串

public function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('name')
        ->add('notice')
        ->add('start')
        ->add('end')
        ->add('status')            
    ;
}
可能吗

第二个问题: 在同一个示例中,我想添加一个未映射到数据库people中的字段,因为这是使用与其他对象相关的数据计算的

public function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('name')
        ->add('notice')
        ->add('start')
        ->add('end')
        ->add('status')
        ->add('people')         
    ;
}
我可以和索纳塔管理员一起做这个吗


提前感谢。

我想最好的方法是在您的实体中定制setter和getter

例如,您有实体用户:

private $customState; // NOTE -> NO ORM MAPPING because you don't want an actual column

public function setCustomState()   {
         if($this->state){
            $this->customState = 'yup!';
            return $this;
         }
         $this->customState = 'nope!';
         return $this;
    }

public function getCustomState()   {
             return $this->customState;
        }

我想最好的方法是在您的实体中定制setter和getter

例如,您有实体用户:

private $customState; // NOTE -> NO ORM MAPPING because you don't want an actual column

public function setCustomState()   {
         if($this->state){
            $this->customState = 'yup!';
            return $this;
         }
         $this->customState = 'nope!';
         return $this;
    }

public function getCustomState()   {
             return $this->customState;
        }

谢谢你的回答。然而,我一直在互联网上寻找信息,我找到了其他方法。可以为字段渲染特定模板。在Admin类中,可以在configureListFields函数中执行以下操作:

public function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('name')
        ->add('notice')
        ->add('start')
        ->add('end')
        ->add('status', 'string', array('template' => 'YourBundle:YourController:status_field.html.twig'))
        ->add('Resources', 'string', array('template' => 'YourBundle:YourController:resources_field.html.twig'))
}
对于status字段,status_field.html.twig模板将呈现如下:

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        {% if object.status == 0 %} 
            <strong>Inactivo</strong>
        {% elseif object.status == 1 %}
            <strong>Activo</strong>
        {% endif %}
    </div>
{% endblock %}
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        <strong>{{ object.getResources|length }}</strong>
    </div>
{% endblock %}
对于我的第二个问题,同样的解决方案是有效的。为资源字段呈现的模板如下所示:

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        {% if object.status == 0 %} 
            <strong>Inactivo</strong>
        {% elseif object.status == 1 %}
            <strong>Activo</strong>
        {% endif %}
    </div>
{% endblock %}
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        <strong>{{ object.getResources|length }}</strong>
    </div>
{% endblock %}

通过这种方式,对象被传递给模板,您可以使用它的方法来获取所需的信息。在本例中,使用getResources方法显示其长度。

谢谢您的回答。然而,我一直在互联网上寻找信息,我找到了其他方法。可以为字段渲染特定模板。在Admin类中,可以在configureListFields函数中执行以下操作:

public function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('name')
        ->add('notice')
        ->add('start')
        ->add('end')
        ->add('status', 'string', array('template' => 'YourBundle:YourController:status_field.html.twig'))
        ->add('Resources', 'string', array('template' => 'YourBundle:YourController:resources_field.html.twig'))
}
对于status字段,status_field.html.twig模板将呈现如下:

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        {% if object.status == 0 %} 
            <strong>Inactivo</strong>
        {% elseif object.status == 1 %}
            <strong>Activo</strong>
        {% endif %}
    </div>
{% endblock %}
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        <strong>{{ object.getResources|length }}</strong>
    </div>
{% endblock %}
对于我的第二个问题,同样的解决方案是有效的。为资源字段呈现的模板如下所示:

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        {% if object.status == 0 %} 
            <strong>Inactivo</strong>
        {% elseif object.status == 1 %}
            <strong>Activo</strong>
        {% endif %}
    </div>
{% endblock %}
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}

{% block field %}
    <div>
        <strong>{{ object.getResources|length }}</strong>
    </div>
{% endblock %}

通过这种方式,对象被传递给模板,您可以使用它的方法来获取所需的信息。在这种情况下,getResources方法用于显示其长度。

作为旁注,在模板中,您还可以通过Admin变量访问Admin类。因此,如果你需要做一些更复杂的事情,你可以把逻辑放在那里,并把你的对象作为一个参数来传递。因此,如果你需要做一些更复杂的事情,你可以把逻辑放在那里,把你的对象作为一个参数来传递。它到底是如何解决按这个自定义字段排序的问题的?我有一个类似的实体,其中一个字段值是动态计算的,并且使getter和setter不能在列表视图中进行排序。在自定义字段上进行AIK排序是不可能的。我已经有很长一段时间没有演奏奏鸣曲了。但基本上,排序将执行的是“全部查找”、“排序依据”,因此对于自定义字段,默认排序将不起作用。您可以通过实现您自己的回调来实现这一点,正如它如何准确地解决按此自定义字段排序的问题所述?我有一个类似的实体,其中一个字段值是动态计算的,并且使getter和setter不能在列表视图中进行排序。在自定义字段上进行AIK排序是不可能的。我已经有很长一段时间没有演奏奏鸣曲了。但基本上,排序将执行的是“全部查找”、“排序依据”,因此对于自定义字段,默认排序将不起作用。您可以通过实现自己的回调来完成这件事,如上所述