在呈现小部件之前删除选项


Remove choices before render the widget

我使用的是来自Fresh的doctrineenumundle,我定义了这个类型:

namespace CommonBundle'DBAL'Types;
use Doctrine'DBAL'Platforms'AbstractPlatform;
use Fresh'Bundle'DoctrineEnumBundle'DBAL'Types'AbstractEnumType;
class AdminRoleType extends AbstractEnumType
{
    const ROLE_ADMIN = "ROLE_ADMIN";
    const ROLE_GERENTE = "ROLE_GERENTE";
    const ROLE_FISCAL = "ROLE_FISCAL";
    const ROLE_CENTRO_HIPICO = "ROLE_CENTRO_HIPICO";
    const ROLE_OPERADOR = "ROLE_OPERADOR";
    /**
     * @var string Name of this type
     */
    protected $name = 'AdminRoleType';
    /**
     * @var array Readable choices
     * @static
     */
    protected static $choices = [
        self::ROLE_ADMIN => 'Administrador',
        self::ROLE_GERENTE => 'Gerente',
        self::ROLE_FISCAL => 'Fiscal',
        self::ROLE_CENTRO_HIPICO => 'Centro Hípico',
        self::ROLE_OPERADOR => 'Operadora'
    ];
}

然后在我的表单类型中,我有一个像这样的字段:

....
->add('roleType', 'choice', array(
    'choices' => AdminRoleType::getChoices(),
    'required' => true,
    'label' => "User Type",
    'trim' => true
))
....

在一个视图中,我只需要渲染ROLE_ADMINROLE_OPERADOR,但在另一个视图中,我需要渲染所有的,我怎么做?

我找到了我的问题的解决方案,只需要添加尽可能多的方法,因为我想返回我需要的,见下面的例子:

class RoleType extends AbstractEnumType
{
    const ROLE_ADMIN = "ROLE_ADMIN";
    const ROLE_GERENTE = "ROLE_GERENTE";
    const ROLE_FISCAL = "ROLE_FISCAL";
    const ROLE_CENTRO_HIPICO = "ROLE_CENTRO_HIPICO";
    const ROLE_OPERADOR = "ROLE_OPERADOR";
    /**
     * @var string Name of this type
     */
    protected $name = 'RoleType';
    /**
     * @var array Readable choices
     * @static
     */
    protected static $choices = [
        self::ROLE_ADMIN => 'Administrador',
        self::ROLE_GERENTE => 'Gerente',
        self::ROLE_FISCAL => 'Fiscal',
        self::ROLE_CENTRO_HIPICO => 'Centro Hípico',
        self::ROLE_OPERADOR => 'Operadora'
    ];
    public static function getFrontChoices()
    {
        return [
            self::ROLE_CENTRO_HIPICO => 'Centro Hípico',
            self::ROLE_OPERADOR => 'Operadora'
        ];
    }
}

如果我只想显示ROLE_CENTRO_HIPICOROLE_OPERADOR而不是调用getChoices(),我调用getFrontChoices():

....
->add('roleType', 'choice', array(
    'choices' => AdminRoleType::getFrontChoices(),
    'required' => true,
    'label' => "User Type",
    'trim' => true
))
....