奏鸣曲管理员自定义列表字段(不是来自实体)

时间:2014-10-01 11:50:02

标签: symfony sonata-admin symfony-sonata

Sonata管理包文档似乎很少,我找不到实现此方法。

目标:在字段列表中显示布尔值。应为其他属性中的每个对象计算值。

我设法为datagridFilter实现了这个doctrine_orm_callback,但没有为listFields实现。

configureDatagridFilters()的工作代码:

// LicenceAdmin.php
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add('isValid', 'doctrine_orm_callback', [
            'callback' => [$this, 'isValidFilterCallback'],
            'field_type' => 'checkbox',
        ]);
}
public function isValidFilterCallback($queryBuilder, $alias, $field, $value)
{
    // if no value or value == false means unchecked checkbox - show all instances
    if (!$value || empty($value['value'])) {
        return;
    }
    // if checked, display only by active logic
    $dateNow = new \DateTime();
    $queryBuilder
        ->andWhere("{$alias}.isActive = 1")
        ->andWhere("{$alias}.validFrom <= :date")
        ->andWhere("{$alias}.validTo > :date")
        ->setParameter('date', $dateNow)
    ;
}

问题

  1. 我如何为configureListFields()实现此功能?尝试使用相同的逻辑来处理configureDatagridFilters()但没有成功。
  2. 如果没有queryBuilder和DQL,这可能吗?我宁愿使用实体对象及其属性作为逻辑。类似的东西:

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper->add('isValid', 'callback', [
            'callback' => function($object) { <-- IMAGINARY FUNCTIONALITY
                if ($object->getIsValid()) return true;
                else return false;
            }
        ]);
    }
    

1 个答案:

答案 0 :(得分:7)

我相信答案比你想要的更容易,除非我没有得到你想要的东西。

在您的实体中,创建以下方法

public function isValid()
{
// do your business logic here
}

在您的管理表单列表中

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper->add('isValid', 'boolean');
}

希望这有帮助。