2012-12-13 49 views
0

我已经直接修改了FOSUserForm(没有压倒一切的),试图指定一个默认值,而建筑形式,我已经添加了默认值:数据选项不工作

array('data'=>'default value') 

这样如:

namespace FOS\UserBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class RegistrationFormType extends AbstractType 
{ 
private $class; 

/** 
* @param string $class The User class name 
*/ 
public function __construct($class) 
{ 
    $this->class = $class; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('username', null, array('data' => 'Default value','label' => 'form.username', 'translation_domain' => 'FOSUserBundle')) 
     ->add('email', 'email', array('data' => 'Default value','label' => 'form.email', 'translation_domain' => 'FOSUserBundle')) 
     ->add('plainPassword', 'repeated', array(
      'type' => 'password', 
      'options' => array('translation_domain' => 'FOSUserBundle'), 
      'first_options' => array('label' => 'form.password'), 
      'second_options' => array('label' => 'form.password_confirmation'), 
      'invalid_message' => 'fos_user.password.mismatch', 
     )) 
    ; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => $this->class, 
     'intention' => 'registration', 
    )); 
} 

public function getName() 
{ 
    return 'fos_user_registration'; 
} 

它不工作,我一直有一个表单验证消息“请输入用户名” 出了什么问题?

回答

1

您是否尝试将用户名设置为隐藏字段而不是“null”?或者完全从表单中删除用户名,并在实体保存在数据库中之前手动设置。除非在将用户名保存到数据库之前执行了检查以确保用户名是唯一的,否则我不推荐第二种选择。

编辑:

出于好奇,你为什么直接修改供应商类?

编辑2:

输入用户名字段的默认验证可能不应该被删除(如果你这样做,确保它仍然是在数据库(http://symfony.com/doc一个独特的领域/2.0/reference/constraints/UniqueEntity.html)

如果你想设置一个默认的用户名值,而不是设置在表单中的数据选项,创建覆盖缺省的createUser方法自定义RegistrationFormHandler:

<?php 

namespace Acme\UserBundle\Form\Handler; 

use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler; 

class RegistrationFormHandler extends BaseHandler 
{ 
    /** 
    * @return UserInterface 
    */ 
    protected function createUser() 
    { 
     $user = $this->userManager->createUser(); 
     $user->setUsername('customusername'); 

     return $user; 
    } 
} 

上覆盖这个处理器

说明可以在这里找到(朝底部): https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_forms.md

这很简单,只需要一分钟来实现。此外,创建自定义窗体处理程序还可以防止在通过作曲家更新供应商时,您在供应商类中所做的任何更改都不会丢失。

编辑3:

DependencyInjection \ EtienneUserExtension.php:

<?php 

namespace Etienne\UserBundle\DependencyInjection; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 

//if using xml 
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; 

//if using yaml 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 

use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\Config\FileLocator; 

class EtienneUserExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     //if using XML 
     $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
     $loader->load('services.xml'); 

     //or if using yaml services 
     $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
     $loader->load('services.yml'); 
    } 

    public function getAlias() 
    { 
     return 'etienne_user'; 
    } 
} 

的services.xml您味精

<?xml version="1.0" ?> 

<container xmlns="http://symfony.com/schema/dic/services" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> 


<services> 
    <service id="acme_user.form.handler.registration" class="Acme\UserBundle\Form\RegHandler" scope="request" public="false"> 
     <argument type="service" id="fos_user.registration.form" /> 
     <argument type="service" id="request" /> 
     <argument type="service" id="fos_user.user_manager" /> 
     <argument type="service" id="fos_user.mailer" /> 
     <argument type="service" id="fos_user.util.token_generator" /> 
    </service> 
</services> 

</container> 
+0

以及感谢名单...我不是要删除的用户名.. 。我试图删除用户名验证信息,当我打开表单视图 – Matoeil

+0

时,为什么直接修改供应商类?因为它是紧急的,我没有设法覆盖形式 – Matoeil

+0

这里的重点是,我把一个数据选项,不工作 – Matoeil