symfony 2表单字符串缺少第一个字符

时间:2014-01-13 19:32:40

标签: php forms symfony

我有一个使用 symfony 2.2 的应用,它有一个文件上传表单和另一个'reportbuilder'表单。

我遇到的问题是当我的任何输入字段值以'c'开头时,该字母被删除。因此,如果字段的值为“cat”,则绑定后的值将变为“at”。

  • 仅在以'c'
  • 开头的字符串中出现
  • 此问题发生在我的任何表单上的任何字符串上
  • 问题发生在$ form-> bind()方法中(或其中某处 - 我已经验证了帖子变量到目前为止是正确的)
  • 这个问题发生在我的PREPROD盒子上,但不是我的DEV盒子(环境应该是相同的,没有做大量比较以找到大海捞针......两个Redhat都安装)

基于我已经完成的一些搜索,我怀疑它可能与字符编码有关(我试图在环境之间进行比较),但我有些不知所措。

如果它有帮助,我可以提供一些代码,但由于问题只发生在一台服务器而不是另一台服务器上,我不确定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';
    }
}

2 个答案:

答案 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()的方式有问题。调试的好方法是检查ViewModelNormModel中的ModelData

4 也许你有一个生命周期回调

/** @PrePersist */
public function doStuffOnPrePersist()
{
    $this->name = 'changed from prePersist callback!';
}