1

Symfony2 でアプリケーションを開発しましたが、問題があります。

私は User Entity クラスを持っています。このクラスには次のものがあります。

/**
* @ORM\OneToOne(targetEntity="UserProperty", mappedBy="user")
*/
protected $properties;

/**
 * Add properties
 *
 * @param Flashwand\UserBundle\Entity\UserProperty $property
 * @return User
 */
public function addProperties(\Warski\Flashwand\UserBundle\Entity\UserProperty $property)
{
    $this->properties[] = $property;

    return $this;
}

/**
 * Remove properties
 *
 * @param Flashwand\UserBundle\Entity\UserProperty $propertie
 */
public function removeProperties(\Warski\Flashwand\UserBundle\Entity\UserProperty $property)
{
    $this->properties->removeElement($property);
}

/**
 * Get properties
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getProperties()
{
    return $this->properties;
}

私が持っているUserPropertyクラスで:

/**
 * @ORM\Id
 * @ORM\OneToOne(targetEntity="User", inversedBy="properties")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

/**
 * @ORM\Column(name="phone", type="string", length=55, nullable=true)
 */
protected $phone = null;

/**
 * @ORM\Column(name="fax", type="string", length=55, nullable=true)
 */
protected $fax = null;

/**
 * @ORM\Column(name="company", type="string", length=150, nullable=true)
 */
protected $company = null;

/**
 * @ORM\Column(name="job_description", type="string", length=255, nullable=true)
 */
protected $job_description = null;

そして今、私は UserProperty からユーザー名、電子メール、パスワード、および会社名を使用して登録フォームを作成しようとしています。

ユーザーがフィールドに入力すると、新しいユーザーとプロパティを作成したいと思います。

私のフォームビルダーは次のようになります。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('email', 'email', array(
        'label' => 'Email',
        'label_attr' => array('class' => 'control-label')
    ));
    $builder->add('password', 'repeated', array(
        'type' => 'password',
        'invalid_message' => 'Password don\'t match.',
        'first_options'  => array(
            'label' => 'Password', 
            'label_attr' => array('class' => 'control-label')
        ),
        'second_options' => array(
            'label' => 'Retype password', 
            'label_attr' => array('class' => 'control-label')
        ),
    ));
    $builder->add('firstname', 'text', array(
        'label' => 'Firstname',
        'label_attr' => array('class' => 'control-label')
    ));
    $builder->add('lastname', 'text', array(
        'label' => 'Lastname',
        'label_attr' => array('class' => 'control-label')
    ));
    $builder->add('email', 'email', array(
        'label' => 'Email',
        'label_attr' => array('class' => 'control-label')
    ));
    $builder->add('properties', 'entity', array(
        'class' => 'FlashwandUserBundle:UserProperty',
        'property' => 'company',
        'multiple' => false,
        'expanded' => false,
        'label' => 'Company',
        'label_attr' => array('class' => 'control-label')
    ));
}

選択やラジオボタンではなく、テキストのようなフィールド「会社」を作成したい。はいの場合、どのようにそれを行うことができますか?

4

3 に答える 3

0

このシナリオでは、データトランスフォーマーhttp://symfony.com/doc/2.0/cookbook/form/data_transformers.htmlを調べてください。文字列(この場合は会社名)でコンテンツを受け取りますが、もちろんエラーをスローする代わりにエンティティを作成することもできます。

于 2012-11-26T11:41:46.897 に答える
0

カスタムフォームフィールドタイプを作成する必要があります

例のように:

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

class PropertiesType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('company')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Flashwand\UserBundle\Entity\UserProperty',
        ));
    }

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

}

そして、フォームビルダーを変更します

$builder->add('properties', new PropertiesType(), array(
    'label' => 'Company',
    'label_attr' => array('class' => 'control-label')
));
于 2012-11-27T15:00:36.987 に答える
0

そのためにproperty_pathを使用できると思います。ところで、OneToOne 関係で何かを間違えているようです。これが OneToOne の場合、user.properties がコレクション/配列であり、User エンティティに addProperty/removeProperty メソッドがあるのはなぜですか? ここで、それを解決する方法の小さな例をいくつか用意しました(要点)。

于 2012-12-01T12:42:30.830 に答える