Php 从Yii2中的小部件内部调用AJAX?
我想为我的Yii2项目创建一个小部件,它将基于视图中给出的几个参数创建一个AJAX调用,用于更新视图的一部分 基本上,我有一个邮政编码字段,更新后将在不同的PHP文件中查找相应的城镇。我创造了一些有用的东西,但我想知道这是否是做我想要的事情的正确(或唯一?)方式。我不想重写AJAX调用,因为我希望能够在项目中的多个表单和字段上重用此功能 我在视图中调用小部件,如下所示:Php 从Yii2中的小部件内部调用AJAX?,php,jquery,ajax,yii,Php,Jquery,Ajax,Yii,我想为我的Yii2项目创建一个小部件,它将基于视图中给出的几个参数创建一个AJAX调用,用于更新视图的一部分 基本上,我有一个邮政编码字段,更新后将在不同的PHP文件中查找相应的城镇。我创造了一些有用的东西,但我想知道这是否是做我想要的事情的正确(或唯一?)方式。我不想重写AJAX调用,因为我希望能够在项目中的多个表单和字段上重用此功能 我在视图中调用小部件,如下所示: <?= SearchWidget::Widget(['id' => 'customerform-postalcod
<?= SearchWidget::Widget(['id' => 'customerform-postalcode',
'dataTarget' => 'cities',
'targetId' => 'customerform-city',
'targetType' => 'dropdown']);?>
在这个小部件中,我基本上只有一个run()函数,它响应对页面的AJAX调用
public function run()
{
$jScript =
'<script>'
. '$("#' . $this->id . '").change(function(){'
.'$.ajax({'
. 'url: "../scripts/search.php",'
. 'data: {'
. 'needle: $("#' . $this->id . '").val(),'
. 'haystack: "' . $this->dataTarget . '"'
. '},'
. 'type: "POST"'
. '}).done(function(data){'
.'var targetType = "' . $this->targetType . '";'
.'if (targetType=="dropdown") {'
. '$("#' . $this->targetId . '").empty();'
. 'var obj = jQuery.parseJSON(data);'
. '$.each(obj, function(key, value) {'
. '$("#' . $this->targetId . '").append("<option>" + value + "</option>");'
. '});'
. '} else {'
. 'var obj = jQuery.parseJSON(data);'
. '$("#' . $this->targetId . '").val(obj);'
. '}'
. '});'
. '})'
.'</script>';
echo $jScript;
}
公共函数运行()
{
$jScript=
''
.change(函数(){'
“$.ajax({”
.url:../scripts/search.php“
“数据:{”
.“针:$(“#”。$this->id.”).val(),'
“'haystack:'.$this->dataTarget.””
. '},'
.“类型:“POST”
'.}).done(函数(数据){'
.'var targetType=“”.$this->targetType.”;'
.'if(targetType==“下拉列表”){'
“$(“#”。$this->targetId.”)。空()
.var obj=jQuery.parseJSON(数据);'
'$.each(对象、函数(键、值){'
“$(“#”。$this->targetId.”。追加(“+value+”);”
. '});'
“}否则{”
.var obj=jQuery.parseJSON(数据);'
.val(obj);'
. '}'
. '});'
. '})'
.'';
echo$jScript;
}
首先,我刚刚开始使用Yii和框架,所以我真的不确定这是否是正确的方法。我的第一反应是这太混乱了,应该有更好的方法来做。非常感谢您的帮助。我个人不喜欢在PHP文件中编写JS代码。因此,我会尝试将JS放在一个单独的.JS文件中 我将更改我的
SearchWidget
,以回显带有一些附加属性的输入字段,这些属性将为JavaScript提供正确的变量。所以我的邮政编码输入字段看起来像:
<input type="text" name="postcode" id="postcode" class="search-field" data-target="cities" data-targetid="customerform-city" data-targettype="dropdown" />
然后,您可以将JS重写为以下内容(未测试)
$('.search field').change(函数(){
var id=$(this.attr('id');
var data_target=$(this).data('target');
var target_id=$(this).data('targetid');
var target_type=$(this).data('targettype');
$.ajax({
url:“../scripts/search.php”,
数据:{
指针:$(“#”+id).val(),
haystack:数据_目标
},
类型:“职位”
}).完成(功能(数据){
如果(目标类型=“下拉列表”){
$(“#”+target_id).empty();
var obj=$.parseJSON(数据);
$。每个(对象、功能(键、值){
$(“#”+target_id).append(“+value+”);
});
}否则{
var obj=$.parseJSON(数据);
$(“#”+target_id).val(obj);
}
});
});
然后将这个JS文件放在某个地方,并将其注册到小部件的init
部分
$('.search-field').change(function() {
var id = $(this).attr('id');
var data_target = $(this).data('target');
var target_id = $(this).data('targetid');
var target_type = $(this).data('targettype');
$.ajax({
url: "../scripts/search.php",
data: {
needle: $("#" + id).val(),
haystack: data_target
},
type: "POST"
}).done(function(data) {
if (target_type == "dropdown") {
$("#" + target_id).empty();
var obj = $.parseJSON(data);
$.each(obj, function(key, value) {
$("#" + target_id).append("<option>" + value + "</option>");
});
} else {
var obj = $.parseJSON(data);
$("#" + target_id).val(obj);
}
});
});