如何将 onkeyup 输入发送到 symfony 控制器
How to send onkeyup input to symfony controller
我正在使用 tetranz/select2entity-bundle 通过 Symfony2 实现 Select2
所以我的表格变成了这样:
$builder->add('nom', Select2EntityType::class, [
'remote_route' => 'find_tags',
'class' => 'Emploi\AppBundle\Entity\Tags',
'primary_key' => 'id',
'text_property' => 'name',
'minimum_input_length' => 2,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'language' => 'fr',
'placeholder' => 'Select a tag',
])
我的路线:
find_tags:
path: /find_tags
defaults: { _controller: EmploiAppBundle:Tags:findTags }
所以现在我需要搜索我在
树枝:
{{ form_start(form) }}
{{ form_widget(form.nom, {'attr': {'id': 'tagsID'}}) }}
{{ form_widget(form.score) }}
<input type="submit" value="Create"/>
{{ form_end(form) }}
我在 TagsController 中的功能,因为 select2entity-bundle 需要一个 JSON 具有两个属性 'id' 和 'text' 的响应:
public function findTagsAction(Request $request)
{
$data = $request->get('input');
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(''
. 'SELECT c.id, c.name '
. 'FROM EmploiAppBundle:Tags c '
. 'WHERE c.name LIKE :data '
. 'ORDER BY c.name ASC'
)
->setParameter('data', '%' . $data . '%');
$tags = $query->getResult();
$arrayCollection = array();
foreach($tags as $item) {
$arrayCollection[] = array(
'id' => $item['id'],
'text' => $item['name']
);
}
return new JsonResponse($arrayCollection);
}
为了发送输入值,我使用了这个 ajax 代码:
$(document).ready(function(){
$("#tagsID").on('keyup', function() {
var input = $(this).val();
if ( input.length >= 2 ) {
var data = {input: input};
$.ajax({
type: "POST",
url: "{{ path('find_tags') }}",
data: data,
dataType: 'json',
timeout: 3000,
success: function(response){
},
});
}
});
});
现在的问题是 findTagsAction() 总是 return 所有标签并且没有检测到输入值。
function goToUrl(id_to_send) {
var path="{{ path('players_team', { 'id':"PLACEHOLDER" }) }}";
var url = path.replace("PLACEHOLDER", id_to_send);
$.ajax({url: url, success: function(result){
$("#players").replaceWith(result);
}});
}
您只需要在 onKeyUp 方法中调用此方法,在我的例子中,我检索了结果并将其替换为 $("#players")。
解决方案很简单,select2entity-bundle 自动分配一个 id 给 form_widget 这就是为什么 javaScript 找不到 id="tagsID" 所以我们需要删除它
{'attr': {'id': 'tagsID'}}
来自这一行:
{{ form_widget(form.nom, {'attr': {'id': 'tagsID'}}) }}
但是将 CSS id 添加到 twig 上的 form_widget 的正确方法是:
{{ form_widget(form.nom, { 'id' : 'tagsID' }) }}
无论何时,当我查看在文本字段上键入时发送的 AJAX 请求时,我发现了这个 GET 方法:
所以现在我们需要在我们的控制器中改变这个:
$data = $request->get('input');
由此:
$data = $request->get('q');
PS: Remove all the JavaScript written previously
我正在使用 tetranz/select2entity-bundle 通过 Symfony2 实现 Select2
所以我的表格变成了这样:
$builder->add('nom', Select2EntityType::class, [
'remote_route' => 'find_tags',
'class' => 'Emploi\AppBundle\Entity\Tags',
'primary_key' => 'id',
'text_property' => 'name',
'minimum_input_length' => 2,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'language' => 'fr',
'placeholder' => 'Select a tag',
])
我的路线:
find_tags:
path: /find_tags
defaults: { _controller: EmploiAppBundle:Tags:findTags }
所以现在我需要搜索我在 树枝:
{{ form_start(form) }}
{{ form_widget(form.nom, {'attr': {'id': 'tagsID'}}) }}
{{ form_widget(form.score) }}
<input type="submit" value="Create"/>
{{ form_end(form) }}
我在 TagsController 中的功能,因为 select2entity-bundle 需要一个 JSON 具有两个属性 'id' 和 'text' 的响应:
public function findTagsAction(Request $request)
{
$data = $request->get('input');
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(''
. 'SELECT c.id, c.name '
. 'FROM EmploiAppBundle:Tags c '
. 'WHERE c.name LIKE :data '
. 'ORDER BY c.name ASC'
)
->setParameter('data', '%' . $data . '%');
$tags = $query->getResult();
$arrayCollection = array();
foreach($tags as $item) {
$arrayCollection[] = array(
'id' => $item['id'],
'text' => $item['name']
);
}
return new JsonResponse($arrayCollection);
}
为了发送输入值,我使用了这个 ajax 代码:
$(document).ready(function(){
$("#tagsID").on('keyup', function() {
var input = $(this).val();
if ( input.length >= 2 ) {
var data = {input: input};
$.ajax({
type: "POST",
url: "{{ path('find_tags') }}",
data: data,
dataType: 'json',
timeout: 3000,
success: function(response){
},
});
}
});
});
现在的问题是 findTagsAction() 总是 return 所有标签并且没有检测到输入值。
function goToUrl(id_to_send) {
var path="{{ path('players_team', { 'id':"PLACEHOLDER" }) }}";
var url = path.replace("PLACEHOLDER", id_to_send);
$.ajax({url: url, success: function(result){
$("#players").replaceWith(result);
}});
}
您只需要在 onKeyUp 方法中调用此方法,在我的例子中,我检索了结果并将其替换为 $("#players")。
解决方案很简单,select2entity-bundle 自动分配一个 id 给 form_widget 这就是为什么 javaScript 找不到 id="tagsID" 所以我们需要删除它
{'attr': {'id': 'tagsID'}}
来自这一行:
{{ form_widget(form.nom, {'attr': {'id': 'tagsID'}}) }}
但是将 CSS id 添加到 twig 上的 form_widget 的正确方法是:
{{ form_widget(form.nom, { 'id' : 'tagsID' }) }}
无论何时,当我查看在文本字段上键入时发送的 AJAX 请求时,我发现了这个 GET 方法:
所以现在我们需要在我们的控制器中改变这个:
$data = $request->get('input');
由此:
$data = $request->get('q');
PS: Remove all the JavaScript written previously