【问题标题】:How to disable required for just one UserType and not the other?如何仅禁用一个 UserType 而不是另一个?
【发布时间】:2015-09-09 17:06:55
【问题描述】:

好的,这开始让我陷入困境,我无法做到这一点,所以希望有人能提供帮助!

我正在使用 Symfony 2.3,并且我在“UserType”类中建立了我的用户表单。我在两个地方有这个,一个是当应用程序添加一个新用户时,我希望该字段保持原样。但是我构建了一个新的“用户类型”来查看所有用户,因此该应用程序作为一个管理区域。

所以我希望能够在刚刚编辑表单时从我的用户表单上的密码输入中删除“必填”,例如电子邮件已更新。

根据我的阅读,这在 twig 中是不可行的(我不明白为什么!)但我必须在 builder 中这样做?

1st,有没有办法在树枝中做到这一点,最好的选择! 第二,如何只对我的一个“用户类型”而不是另一个?

所以我的代码如下,

UserType.php

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $RoleOpts = ['ROLE_USER' => 'User','ROLE_ADMIN' => 'Admin'];

        $builder->setMethod('POST');
        $builder->add('username',  'text',    ['label' => 'Username',  'attr' => ['autocomplete' => 'off','class' => 'Admin_Username']]);
        $builder->add('password',  'password',['label' => 'Password',  'attr' => ['autocomplete' => 'off','class' => 'Admin_Pswd']]);
        $builder->add('firstname', 'text',    ['label' => 'First Name','attr' => ['autocomplete' => 'off','class' => 'Admin_Name']]);
        $builder->add('surname',   'text',    ['label' => 'Surname',   'attr' => ['autocomplete' => 'off','class' => 'Admin_Surname']]);
        $builder->add('email',     'email',   ['label' => 'Email',     'attr' => ['autocomplete' => 'off','class' => 'Admin_Email']]);
        $builder->add('userroles', 'choice',  ['label' => 'Role','choices' => $RoleOpts, 'attr' => ['class' => 'Admin_Role']]);
        $builder->add('save',      'submit',  ['label' => 'Save User', 'attr' => ['class' => 'Admin_SaveUser']]);
    }

查看用户操作

public function ViewUsersAction() {
    $GetAllUsers = $this->getDoctrine()
                     ->getRepository('Bundle:Users')
                     ->findAll();

    foreach($GetAllUsers as $UserKey => $UserValue) {
        $UserID = $UserValue->getId();

        $ViewAllUsers[$UserKey] = $this->createForm(new UserType(), 
                                                    $GetAllUsers[$UserKey],
                                                    ['action' => $this->generateUrl('Admin_EditUser', ['id' => $UserID])]
                                                    )->createView();
    }

    return $this->render('Bundle:Admin:Users/view.html.twig', ['ViewUsers' => $ViewAllUsers ]);
}

树枝文件

   {% for View in ViewUsers %}

    {{ form_start(View, {'attr': {'class': 'EditUser'}}) }}
        {{ form_errors(View) }}

        {{ form_row(View.username, {'attr': {'disabled': 'disabled'}}) }}
        {{ form_row(View.password, {'attr': {'required': false}}) }}
        {{ form_row(View.firstname) }}
        {{ form_row(View.surname) }}
        {{ form_row(View.email) }}
        {{ form_row(View.userroles) }}

        {{ form_row(View.save, { 'label': 'Update User' }) }}

    {{ form_end(View) }}

{% endfor %}

我已阅读,Force a field to not be required,但这会将其添加到构建器中,这将更改添加新用户和编辑所有用户,这是我不想要的!

有什么帮助吗?

*如果我忘记了您需要查看的任何代码或其他部分,请告诉我!

【问题讨论】:

  • 如果您没有得到问题的答案,您能否为构建器创建两个功能,一个用于编辑,一个用于添加?我不使用 symfony,但这似乎是可行的。这样,在您的主构建器函数中,您可以相应地调用 buildEditbuildUpdate
  • 嗯,不确定,我对 symfony 还是有点陌生​​。但我认为,这会让它是一个类的事实有点毫无意义?我希望他们有两种形式,可以在同一个文件中,但是如果用户表发生了变化,我仍然需要同时更改:)
  • 这就是为什么我说如果没有人回答你的问题。这是一个临时解决方案,绝对不理想:)
  • 是的,如果我可以让它工作的话,这将是一个快速修复的好主意:) - 我的想法有点不同。我认为,我可以只在模板中通过 html 呈现用户编辑表单,而不是让树枝来呈现它!但我不确定,认为你的想法更好:)
  • 我正在使用编辑模板和添加新模板,所以这并不重要,但谢谢。

标签: php forms symfony twig


【解决方案1】:

第一步是在 setDefaultOptions 方法中编写一个默认选项。 第二步是使用buildForm方法中的选项:

class UserType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ...

        $builder->add('password',  'password',['required' => $options['password_required']]);
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\User',
            'password_required' => TRUE
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'appbundle_user';
    }
}

第三步是从您的 editAction 中调用 createForm 方法或createEditForm 方法(或者在您的情况下是您的 ViewUsersAction),带有一个额外的选项,即 'password_required' => FALSE:

$form = $this->createForm(new UserType(), $entity, array(
    'action' => $this->generateUrl('user_update', array('id' => $entity->getId())),
    'method' => 'PUT',
    'password_required' => FALSE
));

【讨论】:

  • 谢谢,我试试看。另外还向我展示了如何将方法更改为 PUT!
  • 我给了你的答案,但没有奏效,出现以下错误“选项“password_required”不存在。”。所以我将选项更改为“必需”。那种工作,但它所做的是从我所有的输入中删除除了密码之外的必需!
【解决方案2】:

在 v2.3 中可能会有所不同,因为我不确定这是否已被支持,但您可以在预设数据事件上添加事件侦听器。在这里,您可以检查构建器中的给定数据(您的实体)是否具有 id。当它有一个时,您正在编辑数据。如果它没有 id,则您正在添加一个新用户。因此,有了这些信息,您可以轻松删除所需的选项。

http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html 有很多关于此的信息

【讨论】:

  • 谢谢,我想我看过了,但看不到 PRE_SET_DATA (认为这是最好的选择)如何工作,但是按照你所说的,通过检查一个 id,然后是的,我认为可以用,我研究一下,谢谢
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2012-04-25
相关资源
最近更新 更多