我有一个使用 symfony 2.2 的应用,它有一个文件上传表单和另一个'reportbuilder'表单。
我遇到的问题是当我的任何输入字段值以'c'开头时,该字母被删除。因此,如果字段的值为“cat”,则绑定后的值将变为“at”。
基于我已经完成的一些搜索,我怀疑它可能与字符编码有关(我试图在环境之间进行比较),但我有些不知所措。
如果它有帮助,我可以提供一些代码,但由于问题只发生在一台服务器而不是另一台服务器上,我不确定symfony代码中哪一个(如果有的话)会有用。
这有什么突出的新手编码监督或类似的事情?
编辑: 任意数量的前导'c'都会发生这种情况,因此'cat'和'ccat'以及'Ccccccat'都将转换为'at' < / p>
Edit2: 我可以在绑定后手动设置post变量中的文本字段作为变通方法($document->setName($postvars['name'])
)。对于“Reportbuilder”表单来说,它变得更加严重,它具有可变数量的嵌套表单(报表有一个或多个选项卡,选项卡有一个或多个额外的列等) - 所以类似的解决方法很笨重而且不理想< / em>的
编辑3: 添加代码
class DefaultController extends Controller
{
public function indexAction()
{
...
$document = new Document();
$form = $this->createForm(new DocumentType($em,$user), $document);
/// Here the name variable in the request is 'cat', as expected
$form->bind($this->getRequest());
/// Here the value of the 'name' parameter in the form is 'at'
...
}
}
document.orm.yml:
Finance\GstBundle\Entity\Document:
type: entity
manyToOne:
report:
targetEntity: Report
mappedBy: report
user:
targetEntity: Finance\UserBundle\Entity\User
mappedBy: user
oneToMany:
doctabs:
targetEntity: Doctab
mappedBy: document
tabgroups:
targetEntity: Tabgroup
mappedBy: document
table: document
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string
length: 255
nullable: true
path:
type: string
length: 255
...和DocumentType定义:
namespace Finance\GstBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class DocumentType extends AbstractType
{
protected $em;
protected $user;
public function __construct($em=null,$user=null){
$this->em = $em;
$this->user = $user;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('report','entity',array(
'class' => 'FinanceGstBundle:Report',
'property'=>'name',
'empty_value' => '--Choose a Template--'
))
->add('name')
->add('file')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Finance\GstBundle\Entity\Document'
));
}
public function getName()
{
return 'finance_gstbundle_documenttype';
}
}
答案 0 :(得分:2)
在所有3个(dev / pre / prod)框上修补RHEL后,问题自行解决。我正在进行验尸,试图找出导致我们遇到的错误的特定包。
我们的RHEL版本在不同的服务器上处于不同的“状态”。 PRE / PROD在系统补丁方面显着落后于Dev。
答案 1 :(得分:0)
问题: 'cat'
变为'at'
?
1 禁用javascript以确保它不会在提交时更新您的name
值。
2 确保提交的值为'cat'
$form->get('name')->getData(); //should return 'cat'
注意:已经提到你在帖子中已经完成了这个,但我们没有看到代码。
3 你可能有一个对POST_BIND有反应的监听器:
$builder->addEventListener(FormEvents::POST_BIND, $yourListener);
4 也许您使用的是data transformer,而transform()
和reverseTransform()
的方式有问题。调试的好方法是检查ViewModel和NormModel中的ModelData。
4 也许你有一个生命周期回调
/** @PrePersist */
public function doStuffOnPrePersist()
{
$this->name = 'changed from prePersist callback!';
}