多个未映射的隐藏输入 symfony2
multiple not mapped hidden input symfony2
我有一个文章实体。当我创建一篇文章时,我希望能够向其中添加零到 n 个图像。
为此,我将带有 jQuery 插件的文件上传到一个临时目录中,然后将 <input type=hidden>
添加到我的表单中,并将文件的完整路径作为值。
当没有验证错误时,它工作正常。但是当有时,我收到一条错误消息:
An exception has been thrown during the rendering of a template ("Notice: Array to string conversion") in form_div_layout.html.twig at line 13
我很确定这是因为它试图这样做:
ErrorHandler ->handleError ('8', 'Array to string conversion', '/var/www/project/app/cache/dev/twig/47/a4/ac9a00176739f843e919f5f89883191930038a6e0aaa218869e4966ab7c6.php', '175', array('context' => array('value' => array('njm4uqsa9y6@54edfdaedd0736w3wstk.jpeg'),...
这是我的表单类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('content')
->add('maxVote')
->add('expireAt', 'datetime', array(
'widget' => 'single_text',
'input' => 'string',
'format' => 'dd-mm-yyyy',
)
)
->add('category', 'entity', array(
'class' => 'AppBundle:StoryCategory',
'required' => true
)
)
->add('answers', 'collection', array(
'type' => new AnswerType()
)
)
->add('visibility', 'choice', array(
'choices' => array(1 => "label.public", 2 => "label.semiprivate", 3 => "label.private"),
'expanded' => false,
'multiple' => false
)
)
->add('attachment', 'hidden', array(
'mapped' => false,
'required' => false
)
)
->add('save', 'submit')
;
}
你知道发生了什么吗,或者我应该怎么做?
编辑:
表单为空。我创建了一个新的故事实例
$story = new Story();
$form = $this->createForm(new StoryType(), $story);
当我提交表格时,我会这样做
$form->handleRequest($request);
编辑 2:
Story.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Story
*
* @ORM\Table(name="story")
* @ORM\Entity(repositoryClass="AppBundle\Repository\StoryRepository")
*/
class Story
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
* @Assert\NotBlank()
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="content", type="text")
* @Assert\NotBlank()
*/
private $content;
/**
* @var string
*
* @ORM\Column(name="token", type="string", length=70, unique=true)
*/
private $token;
/**
* @var \DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
private $createdAt;
/**
* @var \DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
private $updatedAt;
/**
* @var \DateTime
*
* @ORM\Column(name="expire_at", type="datetime")
* @Assert\NotBlank()
*/
private $expireAt;
/**
* @var string
*
* @ORM\Column(name="author_ip", type="string", length=50, nullable=true)
*/
private $authorIp;
/**
* @var integer
*
* @ORM\Column(name="max_vote", type="integer", nullable=true)
* @Assert\Type(type="integer")
* @Assert\Range(
* min = 0,
* max = 20000,
* minMessage = "validation.story.maxvote.min",
* maxMessage = "validation.story.maxvote.max"
* )
*/
private $maxVote;
/**
* @var integer
*
* @ORM\Column(name="nb_vote", type="integer")
*/
private $nbVote;
/**
* @var integer
* 1 = public, 2 = semi-private, 3 = private (only invited members)
*
* @ORM\Column(name="visibility", type="integer")
*
*/
private $visibility;
/**
* @var boolean
*
* @ORM\Column(name="is_active", type="boolean")
*/
private $isActive;
/**
* @var StoryCategory
*
* @ORM\ManyToOne(targetEntity="StoryCategory", inversedBy="stories")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* })
* @Assert\NotNull()
*/
private $category;
/**
* @ORM\OneToMany(targetEntity="Answer", mappedBy="story", cascade={"persist", "remove"})
* @Assert\Count(
* min = "2",
* max = "4",
* minMessage = "validation.story.answer.min",
* maxMessage = "validation.story.answer.max",
* groups={"premium"}
* )
* @Assert\Count(
* min = "2",
* max = "2",
* minMessage = "validation.story.answer.min",
* maxMessage = "validation.story.answer.max",
* )
*/
private $answers;
/**
* @ORM\OneToMany(targetEntity="Attachment", mappedBy="story", cascade={"persist", "remove"})
*/
private $attachments;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="stories")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $author;
public function __construct()
{
$datetime = new \DateTime();
$this->createdAt = $datetime;
$this->updatedAt = $datetime;
$this->token = base_convert(time(), 10, 36).\AppBundle\Library\StringHelper::randomString();
$this->isActive = false;
$this->nbVote = 0;
}
}
树枝视图:
{% extends '::base.html.twig' %}
{% block basecontent %}
{{ form_errors(form) }}
{{ form_start(form, {attr: {id: 'story-form', novalidate: 'novalidate'}}) }}
{{ form_row(form.title) }}
{{ form_row(form.content) }}
{{ form_row(form.category) }}
<h3>Les choix de réponses possibles</h3>
{% for answer in form.answers %}
{{ form_widget(answer) }}
{% endfor %}
{{ form_row(form.visibility) }}
{{ form_row(form.expireAt) }}
{% for attachement in form.attachment %}
{{ form_row(attachment) }}
{% endfor %}
{{ form_end(form) }}
{# upload zone #}
<div class="upload-block">
<form action='{{ path('story_file_upload') }}' id="dropzone" class="dropzone">
</form>
</div>
{% endblock basecontent %}
这是我用javascript添加的:
$("#story-form").append('<input type="hidden" name="story_form[attachment][]" value="'+response.filename+'"/>');
所以我尝试不使用它作为数组(我删除了名称中的结尾 []),并且它有效。所以我假设问题来自于此,我必须告诉 formType 它是一个数组。但是如何?
谢谢
您在视图中使用:
{% for attachement in form.attachment %}
{{ form_row(attachment) }}
{% endfor %}
您将 attachment
声明为隐藏字段的位置:
->add('attachment', 'hidden', array(
'mapped' => false,
'required' => false
)
)
隐藏字段只不过是存储在 <input type="hidden">
中的字符串,您无法遍历它。
我无法让它工作,所以我从 formType 中删除了 "attachments" 字段。
当我上传文件时,我使用 javascript 添加一个 <input type="hidden">
,其名称与 formType 中的字段不匹配。
例如,Symfony 生成的字段被命名为 story_form['name']
。我刚刚将我的命名为 attachments[]
。这样 Symfony 就不会告诉我有一个额外的字段。
在我的控制器中,我使用 $request->request->get('attachments')
获取值。
可能有更好的方法,但我还没有找到。
我有一个文章实体。当我创建一篇文章时,我希望能够向其中添加零到 n 个图像。
为此,我将带有 jQuery 插件的文件上传到一个临时目录中,然后将 <input type=hidden>
添加到我的表单中,并将文件的完整路径作为值。
当没有验证错误时,它工作正常。但是当有时,我收到一条错误消息:
An exception has been thrown during the rendering of a template ("Notice: Array to string conversion") in form_div_layout.html.twig at line 13
我很确定这是因为它试图这样做:
ErrorHandler ->handleError ('8', 'Array to string conversion', '/var/www/project/app/cache/dev/twig/47/a4/ac9a00176739f843e919f5f89883191930038a6e0aaa218869e4966ab7c6.php', '175', array('context' => array('value' => array('njm4uqsa9y6@54edfdaedd0736w3wstk.jpeg'),...
这是我的表单类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('content')
->add('maxVote')
->add('expireAt', 'datetime', array(
'widget' => 'single_text',
'input' => 'string',
'format' => 'dd-mm-yyyy',
)
)
->add('category', 'entity', array(
'class' => 'AppBundle:StoryCategory',
'required' => true
)
)
->add('answers', 'collection', array(
'type' => new AnswerType()
)
)
->add('visibility', 'choice', array(
'choices' => array(1 => "label.public", 2 => "label.semiprivate", 3 => "label.private"),
'expanded' => false,
'multiple' => false
)
)
->add('attachment', 'hidden', array(
'mapped' => false,
'required' => false
)
)
->add('save', 'submit')
;
}
你知道发生了什么吗,或者我应该怎么做?
编辑:
表单为空。我创建了一个新的故事实例
$story = new Story();
$form = $this->createForm(new StoryType(), $story);
当我提交表格时,我会这样做
$form->handleRequest($request);
编辑 2: Story.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Story
*
* @ORM\Table(name="story")
* @ORM\Entity(repositoryClass="AppBundle\Repository\StoryRepository")
*/
class Story
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
* @Assert\NotBlank()
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="content", type="text")
* @Assert\NotBlank()
*/
private $content;
/**
* @var string
*
* @ORM\Column(name="token", type="string", length=70, unique=true)
*/
private $token;
/**
* @var \DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
private $createdAt;
/**
* @var \DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
private $updatedAt;
/**
* @var \DateTime
*
* @ORM\Column(name="expire_at", type="datetime")
* @Assert\NotBlank()
*/
private $expireAt;
/**
* @var string
*
* @ORM\Column(name="author_ip", type="string", length=50, nullable=true)
*/
private $authorIp;
/**
* @var integer
*
* @ORM\Column(name="max_vote", type="integer", nullable=true)
* @Assert\Type(type="integer")
* @Assert\Range(
* min = 0,
* max = 20000,
* minMessage = "validation.story.maxvote.min",
* maxMessage = "validation.story.maxvote.max"
* )
*/
private $maxVote;
/**
* @var integer
*
* @ORM\Column(name="nb_vote", type="integer")
*/
private $nbVote;
/**
* @var integer
* 1 = public, 2 = semi-private, 3 = private (only invited members)
*
* @ORM\Column(name="visibility", type="integer")
*
*/
private $visibility;
/**
* @var boolean
*
* @ORM\Column(name="is_active", type="boolean")
*/
private $isActive;
/**
* @var StoryCategory
*
* @ORM\ManyToOne(targetEntity="StoryCategory", inversedBy="stories")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* })
* @Assert\NotNull()
*/
private $category;
/**
* @ORM\OneToMany(targetEntity="Answer", mappedBy="story", cascade={"persist", "remove"})
* @Assert\Count(
* min = "2",
* max = "4",
* minMessage = "validation.story.answer.min",
* maxMessage = "validation.story.answer.max",
* groups={"premium"}
* )
* @Assert\Count(
* min = "2",
* max = "2",
* minMessage = "validation.story.answer.min",
* maxMessage = "validation.story.answer.max",
* )
*/
private $answers;
/**
* @ORM\OneToMany(targetEntity="Attachment", mappedBy="story", cascade={"persist", "remove"})
*/
private $attachments;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="stories")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $author;
public function __construct()
{
$datetime = new \DateTime();
$this->createdAt = $datetime;
$this->updatedAt = $datetime;
$this->token = base_convert(time(), 10, 36).\AppBundle\Library\StringHelper::randomString();
$this->isActive = false;
$this->nbVote = 0;
}
}
树枝视图:
{% extends '::base.html.twig' %}
{% block basecontent %}
{{ form_errors(form) }}
{{ form_start(form, {attr: {id: 'story-form', novalidate: 'novalidate'}}) }}
{{ form_row(form.title) }}
{{ form_row(form.content) }}
{{ form_row(form.category) }}
<h3>Les choix de réponses possibles</h3>
{% for answer in form.answers %}
{{ form_widget(answer) }}
{% endfor %}
{{ form_row(form.visibility) }}
{{ form_row(form.expireAt) }}
{% for attachement in form.attachment %}
{{ form_row(attachment) }}
{% endfor %}
{{ form_end(form) }}
{# upload zone #}
<div class="upload-block">
<form action='{{ path('story_file_upload') }}' id="dropzone" class="dropzone">
</form>
</div>
{% endblock basecontent %}
这是我用javascript添加的:
$("#story-form").append('<input type="hidden" name="story_form[attachment][]" value="'+response.filename+'"/>');
所以我尝试不使用它作为数组(我删除了名称中的结尾 []),并且它有效。所以我假设问题来自于此,我必须告诉 formType 它是一个数组。但是如何?
谢谢
您在视图中使用:
{% for attachement in form.attachment %}
{{ form_row(attachment) }}
{% endfor %}
您将 attachment
声明为隐藏字段的位置:
->add('attachment', 'hidden', array(
'mapped' => false,
'required' => false
)
)
隐藏字段只不过是存储在 <input type="hidden">
中的字符串,您无法遍历它。
我无法让它工作,所以我从 formType 中删除了 "attachments" 字段。
当我上传文件时,我使用 javascript 添加一个 <input type="hidden">
,其名称与 formType 中的字段不匹配。
例如,Symfony 生成的字段被命名为 story_form['name']
。我刚刚将我的命名为 attachments[]
。这样 Symfony 就不会告诉我有一个额外的字段。
在我的控制器中,我使用 $request->request->get('attachments')
获取值。
可能有更好的方法,但我还没有找到。