私は検索しましたが、この問題を抱えている人は見つかりませんでした。
クックブックに記載されているように独自の Data Transformer を作成しましたが、すべて正しいように見えますが、次のエラーが表示されます。
フォームのビュー データはクラス Niche\SecurityBundle\Entity\BusinessUser のインスタンスであると予想されますが、(n) 整数です。「data_class」オプションを null に設定するか、(n) 整数を Niche\SecurityBundle\Entity\BusinessUser のインスタンスに変換するビュー トランスフォーマーを追加することで、このエラーを回避できます。
トランスは以下です。
<?php
namespace Niche\SecurityBundle\Form\DataTransformer;
use JMS\SecurityExtraBundle\Security\Util\String;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Doctrine\Common\Persistence\ObjectManager;
use Niche\SecurityBundle\Entity\BusinessUser;
class BusinessUserToIdTransformer implements DataTransformerInterface
{
/**
* @var ObjectManager
*/
private $om;
/**
* @param ObjectManager $om
*/
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
/**
* Transforms an object (BusinessUser) to a string (number)
*
* @param BusinessUser|null $businessUser
* @return String
*/
public function transform($businessUser)
{
if (null === $businessUser) {
return "";
}
return $businessUser->getId();
}
/**
* Transforms a string (number) to an object (BusinessUser).
*
* @param string $number
*
* @return BusinessUser|null
*
* @throws TransformationFailedException if object (BusinessUser) is not found.
*/
public function reverseTransform($id)
{
if (!$id) {
return null;
}
$businessUser = $this->om
->getRepository('NicheSecurityBundle:BusinessUser')
->findOneById($id);
if (null === $businessUser) {
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$number
));
}
return $businessUser
}
}
私のフォームコードは
<?php
namespace Niche\JobBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Niche\SecurityBundle\Form\DataTransformer\BusinessUserToIdTransformer;
class JobType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$entityManager = $options['em'];
$transformer = new BusinessUserToIdTransformer($entityManager);
//Get the BusinessUser object passed in.
$businessUser = $options['businessUser'];
$builder->add('title', 'text');
$builder->add('jobDescription', 'textarea', array(
"label" => "Job Description", )
);
$builder->add('companyDescription', 'textarea', array(
"label" => "Company Description", )
);
$builder->add('salary', 'text');
$builder->add('category', 'entity', array(
'class' => 'NicheJobBundle:Category',
'property' => 'name',
));
$builder->add('responsibilities', 'textarea');
$builder->add('closingDate', 'datetime');
//Add Business User to the form - Need a way for a job to be added by site admin in addition, could just be site admin users logged in with a Business user account
$builder->add(
$builder->create('company', 'hidden', array(
'data' => $businessUser,
))->addViewTransformer($transformer)
);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Niche\JobBundle\Entity\Job'
));
$resolver->setRequired(array(
'em', 'businessUser'
));
$resolver->setAllowedTypes(array(
'em' => 'Doctrine\Common\Persistence\ObjectManager',
));
}
public function getName()
{
return 'niche_jobbundle_jobtype';
}
}
エラー メッセージは、BusinessUser クラスを整数に変換したように見えるので、私を混乱させます。また、 data_class => null を入力してフォームをロードしてみましたが、フォームが生成されたときに非表示フィールドの ID が正しく表示されたにもかかわらず、送信時にフィールドが空であるというエラーが発生しました。
誰かが私を正しい方向に向けることができますか?
ありがとう
更新:コントローラーで会社を設定してフォームに渡す必要があることに気付いたので、いくつかの変更を加えました。すべてが機能しているように見えますが、フォームが送信されたときにデータベースでnullを取得するか、フィールドを@Assert\NotBlank() ソースを確認すると非表示フィールドに BusinessUser の ID が表示されていても、フィールドを空白にすることはできないため、フォームは送信されません。
*更新 - 以下の Coma の提案を実装しているときに、最終的にどこが間違っていたかに気付きました - オブジェクトを返さなかったのはトランスフォーマーでした * - 他の誰かがこの質問に出くわした場合は、以下の Coma のソリューションを作成するよりもはるかに優れていることをお勧めします毎回隠しています。それが 1 つの場合、上記のソリューションはオブジェクトを返すように更新されており、正常に動作するはずです。