【发布时间】:2019-05-26 05:37:41
【问题描述】:
我有一个视图,其中有两个按钮。在单击两个按钮中的任何一个时,会发出某个请求。
查看
<?php Pjax::begin(); ?>
<?=Html::beginForm(['process'],'post');?>
<?=Html::submitButton('Disconnect', ['id'=>'d','name'=>'dco','class' => 'btn btn-primary']);?>
<?=Html::submitButton('Connect', ['id'=>'r','name'=>'rco','class' => 'btn btn-info']);?>
<br><br>
<div class="pre-scrollable">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\CheckboxColumn', 'checkboxOptions' => function($d) {
return ['value' => $d['msn']];
}],
'customer_id',
// 'dept_code:ntext',
'dept_name:ntext',
'sub_div_name',
[
'label' => 'Sub Division Name',
'value' => function ($d) {
return $d->subdiv->name;
},
'filter' => Html::activeDropDownList($searchModel, 'sub_div_code', \common\models\SurveyHescoSubdivision::toArrayList(), ['prompt' => "Sub-Div", 'class' => 'form-control']),
],
'division_name',
'allowed_units',
'msn',
'units_consumed',
[
'label' => 'Disconnected',
'attribute' => 'disconnected',
'format'=>'raw',
'contentOptions' => ['style'=>'text-align:center'],
'value' => function($model){
return $model->disconnected == 1 ? '<span class="glyphicon glyphicon-ok text-success"></span>' : '<span class="glyphicon glyphicon-remove text-danger"></span>';
},
'filter' => Html::activeDropDownList($searchModel, 'disconnected', [''=>'All','1'=>'Yes','0'=>'No'], ['class' => 'form-control']),
],
'active_energy_total_m',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
</div>
<?= Html::endForm();?>
<?php Pjax::end(); ?>
控制器
public function actionProcess()
{
$soapUrl = "http://ip:port/HES/services/Request";
$userName = "user";
$password = "123456";
if (isset($_POST['dco']))
{
if(Yii::$app->request->isPost)
{
$data = Yii::$app->request->post('selection'); //checkbox (array)
foreach($data as $value)
{
$msn = $value;
$xml_post_string = /** @lang text */
'//soap request';
$headers = array(
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Content-length: ".strlen($xml_post_string),
); //SOAPAction: your op URL
$url = $soapUrl;
// PHP cURL for https connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// converting
$response = curl_exec($ch);
curl_close($ch);
$domd=new DOMDocument();
var_dump($response);
if(!$domd->loadXML($response)){
throw new \RuntimeException("failed to parse XML!");
}
$inner_xml=$domd->getElementsByTagName("return")->item(0)->textContent;
if(!($domd2=@DOMDocument::loadXML($inner_xml))){
throw new \RuntimeException("failed to parse inner_xml!");
}
$AsyncReplyFlag=$domd2->getElementsByTagName("AsyncReplyFlag")->item(0)->textContent;
if ($AsyncReplyFlag =='true')
{
$ds = 1;
$disconnected_at = date('Y-m-d H:i:s');
try {
Yii::$app->db->createCommand(/** @lang text */
"update
`accurate_mam`.`daily_log`
set
`disconnected` = '$ds',
`diconnected_at` = '$disconnected_at',
`reconnected_at` = NULL
where `msn` = '$msn' ;
")->execute(); //update master table
Yii::$app->db->createCommand(/** @lang text */
"update
`accurate_mam`.`log_disconnected`
set
`disconnected_at` = '$disconnected_at'
where `msn` = '$msn'")->execute();// update log disconnected table
} catch (Exception $e) {
} // updating the master table
}
}
}
}
}
我想做什么?
单击按钮时,我想显示一个微调器/加载器,它将在发出请求时启动,并在请求完成时停止。
注意
我不想为微调器/加载器添加默认时间。它应该在请求发送时开始,并在请求完成时停止,即进程完成时
我搜索了很多文章,但找不到完整的实现细节。
更新 1
我找到了解决方案here 并尝试通过执行以下操作来实现它
<style>
#loader {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
background: rgba(0, 0, 0, 0.05) url("<?php \yii\helpers\Url::to('@web/images/25.png', true); ?>") no-repeat center center;
z-index: 10000;
}
</style>
JS
$(document).ready(function () {
$('form').submit(function(e) {
e.preventDefault();
spinner.show();
$.ajax({
url:'$url',
data: $(this).serialize()
type: 'POST',
dataType: 'JSON'
}).done(function(resp) {
spinner.hide();
//alert(resp.status);
});
});
});
面临的问题
现在我可以看到一个微调器,但该过程尚未完成。经过进一步调试,我观察到我在提交请求时在var_dump(isset($_POST['dco']));
die(); 中得到了bool(false)
更新 2
我又找到了一个solution 并尝试做同样的事情
-
更新两个按钮
<?= Html::submitButton(Yii::t('app', '<i class="fa fa-times"></i> Disconnect'), ['class' => 'btn red', 'name' => 'dco', 'value' => '0']) ?> <?= Html::submitButton(Yii::t('app', '<i class="fa fa-check"></i> Connect'), ['class' => 'btn blue', 'name' => 'rco', 'value' => '1']) ?>
JS
$('form').submit(function(e) {
e.preventDefault();
var strValue = "";
$('input[name="selection[]"]:checked').each(function() {
if(strValue!=="")
{
strValue = strValue + " , " + this.value;
}
else
strValue = this.value;
});
spinner.show();
$.ajax({
url:'$url',
data: {data :strValue},
type: 'POST',
dataType: 'JSON'
}).done(function(resp) {
spinner.hide();
//alert(resp.status);
});
});
控制器
if (Yii::$app->request->post()) {
if (Yii::$app->request->post('dco') == 0) {
//Code for value 0
}
if (Yii::$app->request->post('rco') == 1) {
//Code for value 1
}
}
面临的问题
当我点击两个按钮中的任何一个时,它总是点击dco 检查,即if (Yii::$app->request->post('dco') == 0) 它没有点击rco 条件
一定有我遗漏的东西。
任何帮助将不胜感激。
【问题讨论】:
标签: ajax yii2 spinner loading yii2-advanced-app