草庐IT

php - 如何仅禁用一个 UserType 而不是另一个?

coder 2024-04-18 原文

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

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

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

据我所知,这在 twig 中是不可行的(我不明白为什么!)但我必须在构建器中这样做?

1,有没有办法在 Twig 中做到这一点,最好的选择! 第二,如何只对我的“UserTypes”之一而不是另一个执行此操作?

所以我的代码如下,

用户类型.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 ]);
}

Twig 文件

   {% 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 ,但这会将其添加到构建器中,这会同时更改添加新用户和编辑所有用户,这是我不想要的!

有什么帮助吗?

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

最佳答案

第一步是在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
));

关于php - 如何仅禁用一个 UserType 而不是另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32485518/

有关php - 如何仅禁用一个 UserType 而不是另一个?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  9. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  10. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

随机推荐