在yii2中使用网格外的select2小部件筛选gridview

在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

我正在尝试通过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\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,
            ]
        ]);