我搜索了並沒有發現任何人有這個問題。Symfony2隱藏字段上的數據轉換器
我已經創建了自己的數據轉換器所載的食譜,這一切似乎是正確的,但我得到的錯誤:
The form's view data is expected to be an instance of class Niche\SecurityBundle\Entity\BusinessUser, but is a(n) integer. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) integer to an instance of 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';
}
}
該錯誤消息令我困惑,因爲它似乎已經轉換了BusinessUs呃類到一個整數。我也嘗試通過放入data_class => null和表單然後加載,但提交時我得到一個錯誤,該字段是空的,雖然隱藏字段中的ID顯示正確,但表單生成後。
有人能指出我在正確的方向,因爲有一種感覺,它非常簡單,我沒有看到。
感謝
更新:我做了一些變化意識到我應該設定該公司在控制並將其傳遞到表單,並且所有似乎工作,但是當提交表單時我仍然可以在空數據庫或如果我將字段設置爲@Assert \ NotBlank()表單將不會提交爲字段不能爲空即使當我檢查源時,我可以在隱藏字段中看到BusinessUser的Id。
* 更新 - 雖然implemeting下面我終於實現科馬的建議下,我出了毛病 - 這是它沒有返回變壓器對象* - 若有其他人到這個問題,我建議如下昏迷的解決方案是多少比每次創建隱藏都要好。如果它是一個關閉上面的解決方案已更新爲返回對象,應該工作正常。
謝謝,這看起來更有效率,我會嘗試並將其用於我的網站,但我仍然擔心爲什麼我的版本不工作,因爲我覺得我沒有理解它。 – lflanagan
我解決了我所描述的問題,但感謝您的幫助,並將在未來使用您的實施。再次感謝。 – lflanagan
很高興看到它! – coma