我使用symfony2,现在我尝试保存在实体中或直接在数据库中保存在tag textext Jquery插件的texarea输入中创建的标签。 我不知道保持值的好方法(注意将来我想使用插件的过滤器和建议功能)。
我想这个方法:
使用jquery选择器获取插件创建的隐藏输入中的输入值(在我的情况下:axxon_musicbundle_oeuvretype[tagz]
),所以:
tagz = $('输入[name * =" axxon_musicbundle_oeuvretype [tagz]"]')。val(); 例如:= ["测试"" TEST2"" TEST3"];
通过AJAX向控制器发送值$('#form').submit(function()
{
将值(例如:["test","test2","test3"]
)转换为数组。
验证
发送到数据库。
这是我想要保存值的oeuvre映射实体的摘录。
/**
* @ORM\ManyToMany(targetEntity="tagz",cascade={"persist"})
* @ORM\JoinTable(name="oeuvre_tagz",
* joinColumns={@ORM\JoinColumn(name="oeuvre_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="tagz_id", referencedColumnName="id", nullable=false)})
**/
private $tagz;
在我的表格中:
public function buildForm(FormBuilderInterface $builder, array $options)
{
switch ($options['flowStep']) {
...
case 5:
$builder->add('tagz', 'textarea', array(
'mapped' => false,
'required'=>false,
));
break;
我的观点,我使用多步形式,craue bundle:
{% if flow.getCurrentStep() == 5 %}
<script type="text/javascript">
$().ready(function () {
$('#axxon_musicbundle_oeuvretype_tagz').textext({ plugins: 'tags' });
$('#form').submit(function() {
$('form').get(0).setAttribute('action', '{{ path("axxon_music_ExtractFormTagz") }}');
var tagz = Array;
tagz =$('input[name*="axxon_musicbundle_oeuvretype[tagz]"]').val();
var actionController =$("#form").attr("action");
$.ajax({
type: 'POST',
data: {'tagz': tagz},
url: actionController,
success: function () {
$('form').get(0).setAttribute('action', '{{ path("axxon_music_add_oeuvre") }}');
... is this a good choice to do like that ?
});
});
</script>
<fieldset>
<legend>Etape {{ flow.getCurrentStep() }} / {{ flow.getMaxSteps() }}, Ajouter des mots clefs descriptifs
</legend>
<ul>
<li>
{{ form_row(form.tagz) }}
</li>
</ul>
{% include 'CraueFormFlowBundle:FormFlow:buttons.html.twig' %}
</fieldset>
{% endif %}
我想要接收数据的控制器:
public function ExtractFormTagzAction(){
if ($this->getRequest()->isXmlHttpRequest()) {
$tagz = $this->getRequest()->request->get('tagz');
}
非常感谢。
答案 0 :(得分:1)
这是错误的方法,它可以更简单,更可重复使用。
在您的表单中,而不是
$builder->add('tagz', 'textarea', array(
'mapped' => false,
'required'=>false,
));
你应该
$builder->add('tagz', 'tag_text', .... ));
然后你需要构建新的表单类型,我们称之为TagTextType。它的父母将是“textarea”并命名为“tag_text”。 在表单模板中,您必须进行
{% block tag_text_widget %}....{% endblock %}
您将在其中放置所需的javascript。
现在有了棘手的部分:在TagTextType中,你必须添加将现有标签转换为字符串的addTransformer,或者将文本分解为标签数组。这个主题对我来说太大了,不能在这里写,你在Symfony网站上有很好的文档。
作为一个例子,检查我的小部件。我正在使用其他一些插件,但你会得到一个想法:
{% block jquerytexttags_widget %}
{{ form_widget(form) }}
<script type="text/javascript">
$("#{{ id }}").textntags( {
triggers: {'@': { uniqueTags : false } } ,
onDataRequest: function (mode, query, triggerChar, callback) {
var data = {{ availableUsers|raw }} ;
query = query.toLowerCase();
var found = _.filter(data, function(item) { return item.name.toLowerCase().indexOf(query) > -1; });
callback.call(this, found);
}
} );
</script>
{% endblock %}
开始可能很棘手但是一旦你构建它,你就可以在任何你想要的地方使用它。想象一下大的嵌套表单,只用一行就可以正确呈现
{{ form_widget(form) }}
很酷,不是吗? :)