2

FOSUserBundle登録フォームを上書きしたいときに問題が発生しました。

取引は、ユーザーエンティティでは、一部のユーザーが「スポンサー」(スポンサーは同じエンティティのManyToOne)を持つことができます。より明確に言うと、これはユーザーエンティティです。

<?php

namespace Diz\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;


    /**
     * create FK "sponsor_id" referenced to the id field on the same table 
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="sponsor_id", referencedColumnName="id", onDelete="SET NULL")
     */
    protected $sponsor;


    public function __construct()
    {
        // import FOSUserBundle properities ->
        parent::__construct();

    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set sponsor
     *
     * @param Dizsurf\UserBundle\Entity\User $sponsor
     */
    public function setSponsor(\Dizsurf\UserBundle\Entity\User $sponsor)
    {
        $this->sponsor = $sponsor;
    }

    /**
     * Get sponsor
     *
     * @return Dizsurf\UserBundle\Entity\User 
     */
    public function getSponsor()
    {
        return $this->sponsor;
    }

}

分かりますか ?

次に、RegistrationFormTypeをオーバーライドするために、公式のヘルプを使用して作成しました。

<?php

namespace Diz\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationFormType extends BaseType
{
    public function buildForm(FormBuilder $builder, array $options)
    {

        parent::buildForm($builder, $options);

        // add your custom field
        $builder->add('sponsor', 'fos_user_username');

    }

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

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Diz\UserBundle\Entity\User', // Ni de modifier la classe ici.
        );
    }
}

そしてそれがすべてです!とてもシンプルに見えます!だが...

ユーザー名をユーザーエンティティに変換するだけの場合、FOSはビルダーで「 fos_user_username 」を使用することをお勧めします。

私にとっては大丈夫ですが、このフォームをテストすると:

  • スポンサーが存在するので、「パスワードを入力してください」というエラーが表示されます。(もちろん、パスワードを2回入力しました。)

  • しかし、存在しないユーザーでフォームを送信すると、登録フォームは正常に送信されました。

私は何か間違ったことをした ?ご協力ありがとうございました !;-)

ディズダ。

4

1 に答える 1

2

修理済み。

symfony を 2.0.10 から 2.1 にアップグレードしたところ、問題はなくなりました!

于 2012-02-29T20:33:11.163 に答える