Hello
yii2.0.5
I have the following problem in my web application :
There are 2 entities - invoiceheader and invoiceline
In a special view I show an invoice header and : the corresponding lines with kartik\builder\TabularForm
Problem is that the delete action of one line does not work
I first tried to use the kartrik standard way :
'actionColumn'=>['class' => '\kartik\grid\ActionColumn', ],
But as this did not work I used custom action liek this :
'actionColumn'=>['class' => '\kartik\grid\ActionColumn',
'template' => '{delete}',
'buttons' => [
'delete' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, ['data-method' => 'post', 'data-confirm' => Yii::t('app', 'model.invoiceline.confirmdelete')]);
}
],
'urlCreator' => function ($action, $model, $key, $index) {
if ($action === 'delete') {
$url = Url::toRoute(['invoiceline/delete', 'id' => $model->id]);
return $url;
}
}
],
But this too does not work.
What suprises me is that when I inspecte the button on the invoice line, the route is as attended :
<a href="/yii2ti01/ti0102/backend/web/index.php?r=invoiceline%2Fdelete&id=4" data-method="post" data-confirm=…
But when I click on the button does not go to the invoiceline delete action !
Here is some code to give you more information :
InvoiceheaderController.php - Invoicetabular action :
public function actionInvoicetabular($id)
{
$defaultcurrencyname = \common\models\Company::getDefaultcurrency($id);
$headermodel = $this->findModel($id);
$currencyname = \common\models\Currency::getCurrency($headermodel->currency_id);
$sourceLineModel = new \common\models\InvoicelineSearch;
$lineQuery = \common\models\Invoiceline::find()->indexBy('id');
$lineQuery->andWhere('invoiceheader_id = :id', [':id' => $id]);
$lineDataProvider = new \yii\data\ActiveDataProvider([
'query' => $lineQuery,
'pagination' => [ 'pagesize' => 5 ]
]);
if ($headermodel->load(Yii::$app->request->post())) {
//$lineDataProvider = $sourceLineModel->search(Yii::$app->request->getQueryParams());
$models = $lineDataProvider->getModels();
if (\common\models\Invoiceline::loadMultiple($models, Yii::$app->request->post()) && \common\models\Invoiceline::validateMultiple($models)) {
foreach ($models as $index => $model) {
if ($model->quantity == '') { $model->quantity = 0; }
if ($model->unitpriceht == '') { $model->unitpriceht = 0; }
if ($model->discountamount == '') { $model->discountamount = 0; }
if ($model->discountpercentage == '') { $model->discountpercentage = 0; }
if ($model->isAttributeChanged('discountamount')) {
$model->amountht = ($model->unitpriceht * $model->quantity) - $model->discountamount;
if ($model->quantity * $model->unitpriceht == 0) {
$model->discountpercentage = 0;
} else {
$model->discountpercentage = 100 * ( 1 - ( $model->amountht / ($model->quantity * $model->unitpriceht)));
}
} else {
$model->amountht = $model->quantity * $model->unitpriceht * (1 - ($model->discountpercentage / 100));
$model->discountamount = ($model->unitpriceht * $model->quantity) - $model->amountht;
}
if (!$model->save()) {
Yii::$app->session->setFlash('error', "Invoice Line Error.");
return $this->render('invoicetabular', [
'headermodel'=>$headermodel,
'model'=>$sourceLineModel,
'DataProvider'=>$lineDataProvider
]);
}
}
if (!$headermodel->save()) {
Yii::$app->session->setFlash('error', "Invoice Header Error.");
return $this->render('invoicetabular', [
'headermodel'=>$headermodel,
'model'=>$sourceLineModel,
'DataProvider'=>$lineDataProvider
]);
}
$headermodel->updateFields($id); // update header
Yii::$app->session->setFlash('success', Yii::t('app', 'success.update'));
return $this->redirect(['invoicetabular', 'id' => $headermodel->id]);
} else {
return $this->render('invoicetabular', [
'headermodel'=>$headermodel,
'model'=>$sourceLineModel,
'DataProvider'=>$lineDataProvider,
'defaultcurrencyname'=>$defaultcurrencyname,
'currencyname'=>$currencyname,
'fpnl'=>[$headermodel->getPreviousId($id), $headermodel->getNextId($id)]
]);
}
} else {
return $this->render('invoicetabular', [
'headermodel'=>$headermodel,
'model'=>$sourceLineModel,
'DataProvider'=>$lineDataProvider,
'defaultcurrencyname'=>$defaultcurrencyname,
'currencyname'=>$currencyname,
'fpnl'=>[$headermodel->getFirstId($id), $headermodel->getPreviousId($id), $headermodel->getNextId($id), $headermodel->getLastId($id)]
]);
}
}
the view invoicetabular.php :
...
<?php echo TabularForm::widget([
'dataProvider'=>$DataProvider,
'form'=>$form,
'attributes'=>$model->formAttribs,
'checkboxColumn'=>false,
'actionColumn'=>['class' => '\kartik\grid\ActionColumn',
'template' => '{delete}',
'buttons' => [
'delete' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, ['data-method' => 'post', 'data-confirm' => Yii::t('app', 'model.invoiceline.confirmdelete')]);
}
],
'urlCreator' => function ($action, $model, $key, $index) {
if ($action === 'delete') {
//$url = Url::toRoute(['invoiceline/delete', 'id' => $model->id]);
$url = Url::to(['invoiceline/delete', 'id' => $model->id]);
return $url;
}
}
],
'gridSettings'=>[
'floatHeader'=>true,
'panel'=>[
//'heading' => '<h3 class="panel-title"><i class="glyphicon glyphicon-book"></i> Manage Books</h3>',
'type' => GridView::TYPE_PRIMARY,
'before'=>false,
'footer'=>false,
]
]
]); ?>
...
I would be grateful for any help !