在yii2中使用网格外的select2小部件筛选gridview
我正在尝试通过select2小部件过滤GridView。但是select2小部件不应该在gridview中。就像在截图中一样- 当我选择select2小部件时,数据被过滤。 我的index.php代码是-在yii2中使用网格外的select2小部件筛选gridview,yii2,Yii2,我正在尝试通过select2小部件过滤GridView。但是select2小部件不应该在gridview中。就像在截图中一样- 当我选择select2小部件时,数据被过滤。 我的index.php代码是- <?php use yii\helpers\Html; use yii\grid\GridView; use kartik\select2\Select2; use yii\helpers\ArrayHelper; use frontend\modules\productstockbo
<?php
use yii\helpers\Html;
use yii\grid\GridView;
use kartik\select2\Select2;
use yii\helpers\ArrayHelper;
use frontend\modules\productstockbook\models\Productnames;
use yii\helpers\Json;
/* @var $this yii\web\View */
/* @var $searchModel frontend\modules\productstockbook\models\ProductionSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = 'Product Stock Book';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="production-index">
<h1><?= Html::encode($this->title) ?></h1>
<?php // echo $this->render('_search', ['model' => $searchModel]); ?>
<?php
echo Select2::widget([
'model' => $model,
'attribute' => 'productnames_productname',
'data' => ArrayHelper::map(Productnames::find()->all(),'productnames_productname','productnames_productname'),
'options' => ['placeholder' => 'Select Product', 'id' => 'catid'],
'pluginOptions' => [
'allowClear' => true
],
]);
?>
<div class="row-fluid">
<div class="form-group">
<div class="col-xs-3 col-sm-3 col-lg-3" >
<input type="text" class="form-control" id="production" readonly placeholder ="Production">
</div>
<div class="col-xs-3 col-sm-3 col-lg-3" >
<input type="text" class="form-control" id="sell" readonly placeholder ="Sell">
</div>
<div class="col-xs-3 col-sm-3 col-lg-3" >
<input type="text" class="form-control" id="stock" readonly placeholder ="Stock">
</div>
<div class="col-xs-3 col-sm-3 col-lg-3" >
<button type="button" id="search" class="btn btn-primary"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></button>
</div>
</div>
</div>
<div class= 'col-md-6'>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
//'productionid',
'productiondate',
//'itemid',
'productname',
//'batchno',
'prodqty',
//['class' => 'yii\grid\ActionColumn'],
],
]); ?>
</div>
<div class='col-md-6'>
<?php
echo GridView::widget([
'dataProvider' => $dataProvider2,
'filterModel' => $searchModel2,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'billdate',
'productsales_partyname',
'productname',
'total',
],
]);
?>
</div>
</div>
<?php
/* start getting the textboxes */
$script = <<< JS
$(function(){
//$(document).ready(function(e) { getTotalproduction(); });
$('#catid').change(function(){
getIndexpage();
//getTotalproduction();
//getTotalsell();
//getTotalstock();
});
var catid = $(this).val();
var getIndexpage = function(){
var catid = String($('#catid').val());
window.onbeforeunload = function(e) {return getTotalproduction();};
window.location.href = 'index.php?r=productstockbook/production/index&catid='+catid;
} ;
var getTotalproduction = function(){
var catid = String($('#catid').val());
$.get('index.php?r=productstockbook/production/get-for-production',{ catid : catid }, function(data){
//alert(data);
var data = $.parseJSON(data);
$('#production').attr('value',data.totalproduction);
});
} ;
var getTotalsell = function(){
var catid = String($('#catid').val());
$.get('index.php?r=productstockbook/production/get-for-sales',{ catid : catid }, function(data){
//alert(data);
var data = $.parseJSON(data);
$('#sell').attr('value',data.totalsell);
});
};
var getTotalstock = function(){
var totalproduction = parseInt($('#production').val());
var totalsell = parseInt($('#sell').val());
var totalstock = Math.round(totalproduction - totalsell)
//alert(totalstock);
if (isNaN(totalstock) || totalstock < -10000000 || totalstock > 1000000) {
totalstock = '';
}
$('#stock').val(totalstock);
};
// var getTotalstock = function(){
// var catid = String($('#catid').val());
// $.get('index.php?r=productstockbook/production/get-for-stock',{ catid : catid }, function(data){
// alert(data);
// var data = $.parseJSON(data);
// $('#stock').attr('value',data.stock);
// });
// };
});
JS;
$this->registerJs($script);
/* end getting the textboxes */
?>
<?php
namespace frontend\modules\productstockbook\controllers;
use Yii;
use frontend\modules\productstockbook\models\Production;
use frontend\modules\productstockbook\models\ProductionSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use frontend\modules\productstockbook\models\ProductsalesSearch;
use yii\helpers\Html;
use frontend\modules\productstockbook\models\Productnames;
use frontend\modules\productstockbook\models\Productsales;
use yii\helpers\Json;
use yii\db\Query;
use yii\db\Command;
/**
* ProductionController implements the CRUD actions for Production model.
*/
class ProductionController extends Controller
{
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* Lists all Production models.
* @return mixed
*/
public function actionIndex()
{
$catid = yii::$app->request->get('catid');
$searchModel = new ProductionSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams, $catid);
$searchModel2 = new ProductsalesSearch();
$dataProvider2 = $searchModel2->search(Yii::$app->request->queryParams, $catid);
$model = new Productnames();
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'searchModel2' => $searchModel2,
'dataProvider2' => $dataProvider2,
'model' => $model,
]);
}
/**
* Displays a single Production model.
* @param integer $id
* @return mixed
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new Production model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new Production();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->productionid]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
/**
* Updates an existing Production model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->productionid]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
/**
* Deletes an existing Production model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
/**
* Finds the Production model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return Production the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Production::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
public function actionGetForProduction($catid)
{
$production = Production::find()->select('sum(prodqty) as totalproduction')->where(['productname'=>$catid])->asArray()->one();
echo Json::encode($production);
}
public function actionGetForSales($catid)
{
$sell = Productsales::find()->select('sum(total) as totalsell')->where(['productname'=>$catid])->asArray()->one();
echo Json::encode($sell);
}
// public function actionGetForStock($catid)
// {
// //$stock = Productsales::find()->joinWith('Production')->select('sum(production.prodqty) - sum(productsales.total) as stock')->where(['productname'=>$catid])->asArray()->one();
// //echo Json::encode($stock);
// //$subQuery1 = (new Query())->select(['productname,sum(prodqty) as totalproduction'])->from('production')->where(['productname'=>$catid]);
// $subQuery2 = (new Query())->select(['productname,sum(total) as totalsell'])->from('productsales')->where(['productname'=>$catid]);
// $subQuery3 = (new Query())->select(['productname,(sum(prodqty) - sell.totalsell) as totalstock'])->from('production')->leftJoin(['sell' => $subQuery2],'sell.productname = productname')->where(['productname'=>$catid]);
// echo Json::encode($subQuery3);
// }
}
我不希望页面被重新定位。因为如果它重新定位,我无法在文本框中获得sum(prodqty)和sum(total),正如您在页面beace中看到的那样,使用正在重新定位的页面。如何在不重新定位页面的情况下实现这一点?这和我的问题是一样的
更新目前,在完成Edvin的解决方案后-我面临以下错误-
因为我看到它已经过滤了数据(但使用了页面重新加载),所以我转到了第2部分,在这里您要求提供特定列的总和 目前我想不出更好的解决方案,但现在应该可以了。请注意,这可能只是临时解决方案,因为此代码是“脆弱的”(添加一个额外的列,更改表的ID等),将破坏此代码,您将被迫修改此代码。另外请注意,它取所有打印行的总和(意味着只计算可见行(默认情况下为第一行)) 我以前也用过类似的东西,因为ID是静态的,所以我很少中断
$(document).on('ready', function(e) {
var row0 = $('#w0')[0]['childNodes'][2]['childNodes'][2]['children'];
var row1 = $('#w1')[0]['childNodes'][2]['childNodes'][2]['children'];
var total0 = 0;
var total1 = 0;
for (var i = 0; i < row0.length; i++) {
total0 += parseInt(row0[i]['children'][3]['textContent'], 10);
}
for (var i = 0; i < row1.length; i++) {
total1 += parseInt(row1[i]['children'][4]['textContent'], 10);
}
// ^ This number takes (n+1)th column
console.log('First table total value: ' + total0);
console.log('Second table total value: ' + total1);
console.log('Difference between 1st and 2nd total values: ' + (total0 - total1));
})
因为我看到它已经过滤了数据(但有了页面重新加载),所以我转到了第2部分,在那个里,您需要特定列的总和 目前我想不出更好的解决方案,但现在应该可以了。请注意,这可能只是临时解决方案,因为此代码是“脆弱的”(添加一个额外的列,更改表的ID等),将破坏此代码,您将被迫修改此代码。另外请注意,它取所有打印行的总和(意味着只计算可见行(默认情况下为第一行)) 我以前也用过类似的东西,因为ID是静态的,所以我很少中断
$(document).on('ready', function(e) {
var row0 = $('#w0')[0]['childNodes'][2]['childNodes'][2]['children'];
var row1 = $('#w1')[0]['childNodes'][2]['childNodes'][2]['children'];
var total0 = 0;
var total1 = 0;
for (var i = 0; i < row0.length; i++) {
total0 += parseInt(row0[i]['children'][3]['textContent'], 10);
}
for (var i = 0; i < row1.length; i++) {
total1 += parseInt(row1[i]['children'][4]['textContent'], 10);
}
// ^ This number takes (n+1)th column
console.log('First table total value: ' + total0);
console.log('Second table total value: ' + total1);
console.log('Difference between 1st and 2nd total values: ' + (total0 - total1));
})
当你选择一个选项时,你想对你得到的数据做什么?顺便问一下,你是如何覆盖JS函数的?事实上,我并没有被告知你已经给我发了一条信息。不管怎么说,我是在尝试使用我在网络上获得的数据。我希望在选择select2小部件时发生两件事。1.显示使用选定值筛选的Production和Producsales网格视图。2.要在生产文本框中显示总和(prodqty),在销售文本框中显示总和(productsales),并在库存文本框中显示两者之间的差异。要进行筛选,需要重新加载页面。但是获取所有过滤元素的总值有什么问题?只需使用JavaScript循环遍历每个单元格并获取value.Hi Edvin,在index.php中,我编写了JavaScript代码来获取列的总和。但我想你不是在要求我用同样的方式做。我不太确定如何循环每个单元格并获得值。请与我分享代码。我想你已经掌握了所有的细节。好吧,我可以编写一个代码来计算每个表中最后一列的总和,并给出它们之间的差值。我希望这是你想要的。当你选择一个选项时,你想如何处理你得到的数据?顺便问一下,你是如何覆盖JS函数的?事实上,我并没有被告知你已经给我发了一条信息。不管怎么说,我是在尝试使用我在网络上获得的数据。我希望在选择select2小部件时发生两件事。1.显示使用选定值筛选的Production和Producsales网格视图。2.要在生产文本框中显示总和(prodqty),在销售文本框中显示总和(productsales),并在库存文本框中显示两者之间的差异。要进行筛选,需要重新加载页面。但是获取所有过滤元素的总值有什么问题?只需使用JavaScript循环遍历每个单元格并获取value.Hi Edvin,在index.php中,我编写了JavaScript代码来获取列的总和。但我想你不是在要求我用同样的方式做。我不太确定如何循环每个单元格并获得值。请与我分享代码。我想你已经掌握了所有的细节。好吧,我可以编写一个代码来计算每个表中最后一列的总和,并给出它们之间的差值。我希望这是您想要的。得到错误-TypeError:$(…)[0]。childNodes[2]是未定义的变量row1=$('#w1')[0]['childNodes'][2]['childNodes'][2]['Childrends'];ID是否正确(在网站和代码中匹配)?隐马尔可夫模型。。。你能给我发一个你们网站表格源代码的链接吗?我在一台本地计算机上工作。我已经将production gridview的id设置为“prodtable”,将productsales gridview设置为“selltable”。并将w0更改为prodtable,将w1更改为selltable。但是仍然得到了类似的错误——“TypeError:$(…)[0]。childNodes[2]。childNodes[2]是未定义的var row0=$(“#prodtable”)[0]['childNodes'][2]['childNodes'][2]['childrends'];”错误箭头标记在这里——“var row0=$”.我在问题中添加了截图。@Tanmay如何解决这个问题,我知道,但很难解释。理解如何“创建”有点困难一种通过元素进行单元格的方法…我想知道那个箭头…这是不是意味着它不识别jQuery语法,或者它只是一个随机箭头?。如果删除那个部分并留下另一个(有两个部分)会怎么样。嗨,Edvin,我陷入了这个困境。什么是childNodes和children?出现错误-TypeError:$(…)[0]。childNodes[2]未定义的var row1=$('#w1')[0]['childNodes'][2]['childNodes'][2]['childNodes'];ID是否正确(在网站和代码中匹配)?嗯…你能给我发一个链接到你网站的表的源代码吗?我在一台本地计算机上工作。我已经将Product gridview的ID设置为“prodtable”,将productsales gridview设置为“selltable”。并将w0更改为prodtable,将w1更改为selltable。但仍然会出现相同的错误-“TypeError:$(…)[0]。childNodes[2]。childNodes[2]未定义变量row0=$('#prodtable')[0]['childNodes'][2]['childNodes'
window.location.href = 'index.php?r=productstockbook/production/index&catid='+catid;
$(document).on('ready', function(e) {
var row0 = $('#w0')[0]['childNodes'][2]['childNodes'][2]['children'];
var row1 = $('#w1')[0]['childNodes'][2]['childNodes'][2]['children'];
var total0 = 0;
var total1 = 0;
for (var i = 0; i < row0.length; i++) {
total0 += parseInt(row0[i]['children'][3]['textContent'], 10);
}
for (var i = 0; i < row1.length; i++) {
total1 += parseInt(row1[i]['children'][4]['textContent'], 10);
}
// ^ This number takes (n+1)th column
console.log('First table total value: ' + total0);
console.log('Second table total value: ' + total1);
console.log('Difference between 1st and 2nd total values: ' + (total0 - total1));
})
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 30,
]
]);