我有一个带有多选下拉列表的表单。面临储蓄问题。 有3个实体:客户端,客户端标记,标记。
客户标记实体的一部分:
/**
* @ORM\Column(
* type="date",
* nullable=true
* )
* @JMS\Groups({"list", "single"})
*
* @var \DateTime
*/
protected $dateExpiry;
/**
* @ORM\ManyToOne(targetEntity="Client")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id")
* @JMS\Groups("list")
*
* @var Client
*/
protected $client;
/**
* @ORM\ManyToOne(targetEntity="Tag")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
* @JMS\Groups({"list", "single"})
*
* @var Tag
*/
protected $tag;
然后我在客户端标记上有一个表单
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('client')
->add('tag')
->add('dateExpiry', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd', ))
;
}
使用单一选择下拉列表,我发送的值如下:
{tag: 1, client: 1, dateExpire: 2000-10-10}
它运作良好。
现在,当我切换到多选下拉列表时,它不再工作了,所以我发送数据如下:
{tag: [1, 2], client: 1, dateExpire: 2000-10-10}
错误“tag:[”此值无效。“]”。
我已经花了很多时间解决这个问题,请帮忙。
UPD: 我呈现的形式如下:
{% verbatim %}
<md-input-container >
<label>Tag</label>
<md-content >
<md-select multiple class="select-position" required ng-model="formData.tags" placeholder="Select a tag">
<md-option ng-value="tag.id" ng-repeat="tag in allTags">{{ tag.name }}
</md-option>
</md-select>
</md-content>
</md-input-container>
<mdp-date-picker mdp-placeholder="Expire date" mdp-min-date="minTagExpireDate"
mdp-format="YYYY-MM-DD" ng-model="formData.dateExpiry"></mdp-date-picker>
<div data-ng-messages="errors" role="alert" data-ng-show="form.$submitted">
<div data-ng-message="tag" class="autocomplete-error">Tag not found.</div>
</div>
{% endverbatim %}
发送它(代码的一部分):
formVm.customData = angular.copy(formVm.formData);
formVm.customData.client = clientId;
formVm.customData.dateExpiry = $filter('date')(formVm.customData.dateExpiry, 'yyyy-MM-dd');
return $http.post(router.generate('api_client_tag_create'), formVm.customData);
答案 0 :(得分:0)
嗯,问题是他正在使用Angular。在我的代码中,看起来标签的值来自数据库,并且在值是硬编码的文档中并不容易。
我对这个案子的2美分建议是在控制器中使用:
$data = $form->getData();
收集所有表格的数据或
$first_name = $form->get('first_name')->getData();
这种语法只收集来自单个字段的数据。
然后他将不得不针对实体管理器运行查询,使用db中的所有可能选项收集数据,然后使用
http://php.net/manual/ro/function.in-array.php
https://symfony.com/doc/current/doctrine.html
foreach($arrayOfTagsNames as $tagName)
if(in_array($tagName, $arrayOfTagsNames)) {
$tagEntity = new Tag();
$tagEntity->setTag($tagName);
$em->persist($tagEntity);
}
如果您需要从db获取标记,这就是我将如何解决它。因为您需要在后端验证用户是否已修改输入其他值的HTML。