【问题标题】:Problems showing fields with Sonata Admin - Symfony 2.0使用 Sonata Admin 显示字段的问题 - Symfony 2.0
【发布时间】:2013-04-11 11:37:33
【问题描述】:

我想用 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 执行此操作吗?

提前致谢。

【问题讨论】:

    标签: symfony sonata-admin


    【解决方案1】:

    我想您最好的方法是在您的实体中创建自定义设置器和获取器。

    例如你有实体用户:

    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;
            }
    

    【讨论】:

    • 究竟是如何解决这个自定义字段排序的问题的?我有一个类似的实体,其字段值是动态计算的,并且制作 getter 和 setter 不会使其在列表视图中可排序
    • Afaik 无法对自定义字段进行开箱即用的排序。我已经有一段时间没有和索纳塔合作了。但基本上排序会做的是“查找全部,按 排序”,因此对于自定义字段,默认排序将不起作用。您可以按照github.com/sonata-project/SonataAdminBundle/issues/… 中的说明实现自己的回调来做到这一点
    【解决方案2】:

    感谢您的回答。但是,我一直在 Internet 上寻找信息,并找到了其他方法来做到这一点。您可以为您的字段呈现特定模板。在您的 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() 方法用于显示其长度。

    【讨论】:

    • 附带说明,在模板中,您还可以通过“admin”变量访问您的 Admin 类。因此,如果您需要做一些更复杂的事情,您可以将逻辑放在那里并将您的对象作为参数传递。
    猜你喜欢
    • 2021-10-15
    • 2023-04-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多