Good day to all,
i’m a newby with Yii framework and PHP.
I call a SQL Stored Procedure with a button; query caller in is controller, while button is in the form; when action is terminated, calling setFlash, i show a message for the user; i would like to show a message also before the action start, or immediately after, something like “Waiting action…”, but i can not.
I try to use beforeAction() or afterAction(), but only “Action done” message appears when action is terminated; i try also with setFlash() and hasFlash(), but the message appears only when action is terminated, two messages in this case, “Waiting” and “Done”.
There is a way to intercept the button pressed in the form and show message “Waiting” ?
Thanks
Yes. AJAX.
I look for documentation and i found everythinks; i try somethink, but i cannot understand what i have to do. In form i have this button:
Blockquote
<?php echo Html::a(’ Backup database’,
[‘backupdb’], [‘class’ => ‘btn btn-warning btn-lg’]); ?>
In controller there is function:
Blockquote
function actionBackupdb($Filepath)
{
try
{
$SqlProcedure = “exec DBBACKUP ‘$Filepath’”;
$SqlProcedureCommand = Yii::$app->db->createCommand($SqlProcedure);
$SqlProcedureCommand->query();
}
catch (Exception $e)
{
$e->rollback();
Yii::$app->session->setFlash(‘error’,'Backup database error: '.$e->getMessage());
return $this->redirect(Yii::$app->request->referrer);
}
if (file_exists($Filepath))
{
Yii::$app->session->setFlash(‘success’, ‘Backup database done.’);
}
else
{
Yii::$app->session->setFlash(‘warning’,‘Backup database failed.’);
}
return $this->redirect(Yii::$app->request->referrer);
}
I try to change button with submitButton and call function in controller, but i have the same result.
What is the best way to show setFlash with waiting message, starting function and then show setFlash with result message ?
Thanks
I have tried some solutions, but it don’t works; i have tried with another view, popup, some js code, but the problem remains: when controller action begin its job, the view don’t update itself, only when the action is terminated.
The last code on controller:
public function actionBeforedbmaintenance($dbaction)
{
Yii::$app->session['dbAction'] = $dbaction;
Yii::$app->session['isWaiting'] = true;
Yii::$app->session->setFlash('WaitFileStat');
return $this->redirect(Yii::$app->request->referrer);
}
public function actionDbmaintenance($dbaction)
{
Yii::$app->session['isWaiting'] = false;
Yii::$app->session['dbAction'] = 'none';
Yii::$app->session->removeFlash('WaitFileStat');
switch ($dbaction)
{
case "FileStatDB":
$this->Test('DB');
break;
case "FileStatLOG":
$this->Test('DB');
break;
}
}
public function Test($type)
{
for ($mul = 1; $mul <= 100000000; ++$mul);
Yii::$app->session->setFlash('success', Yii::t('app', 'Test done.'));
return $this->redirect(Yii::$app->request->referrer);
}
on view
<?php if (Yii::$app->session->getFlash('WaitFileStat')) { ?>
</br>
<h1 style="text-align: center; color: red;"><?= Yii::t('app', 'Waiting...') ?></h1>
<?php
$dbaction = Yii::$app->session['dbAction'];
switch (Yii::$app->session['dbAction'])
{
case 'FileStatDB':
Yii::$app->session['isWaiting'] = false;
Yii::$app->runAction('maintenance/dbmaintenance', ['dbaction' => $dbaction]);
break;
case 'FileStatLOG':
Yii::$app->session['isWaiting'] = false;
Yii::$app->runAction('maintenance/dbmaintenance', ['dbaction' => $dbaction]);
break;
default:
Yii::$app->session['isWaiting'] = false;
}
?>
<?php } else { ?>
<?php echo Html::a('<i class="fas fa-info"></i>'.' '.Yii::t("app", "DB file status"),
['beforedbmaintenance', 'dbaction' => 'FileStatDB'], ['class' => 'btn btn-info btn-lg']); ?>
<?php echo Html::a('<i class="fas fa-info"></i>'.' '.Yii::t("app", "Log file status"),
['beforedbmaintenance', 'dbaction' => 'FileStatLOG'], ['class' => 'btn btn-info btn-lg']); ?>
I also try to use “target = _blank”, but after i have one more tab opened on browser.
I don’t like that the user press one of the buttons, backup or reindex on database begin, and the view remains without warning to wait the end of operation.
At the moment i have no more idea.
Can anyone help me ?
At the end i find a solution; on view:
<?= Html::button('<i class="fas fa-copy"></i>'.' '.Yii::t("app", "Backup database"),
['id' => 'btn-DBBackup', 'class' => 'btn btn-success btn-lg']); ?>
<?php
$urlBtnDBBackup = Url::to(['backupdb', 'filePath' => $backupFilepath]);
echo Dialog::widget(); // widget with default options
$jsButtonActionDB = <<< JS
$("#btn-DBBackup").on("click", function() {
$('#waitingModal').modal({backdrop: "static"})
window.location.replace("$urlBtnDBBackup")
$('#waitingModal').modal('hide')
});
JS;
// register javascripts
$this->registerJs($jsButtonActionDB, View::POS_READY);
?>
<!-- Modal for waiting -->
<div class="modal fade" id="waitingModal" tabindex="-1" role="dialog" aria-labelledby="waitingModal" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-body">
<p> <h1 style="text-align: center; color: red;"><?= Yii::t('app', 'Waiting...') ?> </h1> </p>
</div>
</div>
</div>
</div>
On controller:
/**
* DB backup
*/
public function actionBackupdb($filePath)
{
try
{
$sqlProc = "exec DBBACKUP '$filePath'";
$sqlProcCmd = Yii::$app->db->createCommand($sqlProc);
$sqlProcCmd->query();
}
catch (Exception $e)
{
$e->rollback();
Yii::$app->session['maintenanceResult'] = Yii::t('app', 'Backup database error: ').$e->getMessage();
Yii::$app->session->setFlash('DBMaintenanceError');
return $this->redirect(Yii::$app->request->referrer);
}
if (file_exists($filePath))
{
Yii::$app->session['maintenanceResult'] = Yii::t('app', 'Backup database done.');
Yii::$app->session->setFlash('DBMaintenanceDone');
}
else
{
Yii::$app->session['maintenanceResult'] = Yii::t('app', 'Backup database failed.');
Yii::$app->session->setFlash('DBMaintenanceFailed');
}
return $this->redirect(Yii::$app->request->referrer);
}
Could I have done something wrong ?
Thanks