使用Sonata Admin显示字段的问题 - Symfony 2.0

时间:2013-04-11 11:37:33

标签: symfony sonata-admin

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

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

有可能吗?

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

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

我可以使用Sonata Admin进行此操作吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

我想你最好的方法就是在你的实体中制作自定义的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;
        }

答案 1 :(得分:4)

感谢您的回答。但是,我一直在寻找互联网上的信息,我找到了其他方法来做到这一点。您可以为您的字段呈现特定模板。在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_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 %}

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