【问题标题】:Yii2: The Depdrop widget form Kartik keeps loadingYii2:Depdrop 小部件表单 Kartik 不断加载
【发布时间】:2019-07-08 01:52:20
【问题描述】:

我正在使用来自 Kartik 的 Depdrop 小部件,但是当它尝试查找数据以填充下拉列表时,一个字段会继续加载。

我最近通过 Composer 更新了我的小部件并收到此错误(我不确定这是否是原因)

视图中的字段:

        <?= $form->field($model, 'IdCamion')->widget(DepDrop::classname(), [
            'type' => DepDrop::TYPE_SELECT2,
            'pluginOptions' => [
                'depends' => ['produccion-idcliente', 'produccion-tipotarifa'],
                'placeholder' => 'Seleccione...',
                'url' => Url::to(['/operaciones/camiones'])
            ]
        ]); ?>

以及填充下拉列表的操作:

public function actionCamiones()
{
    $out = [];
    if (isset($_POST['depdrop_parents'])) {

        $parents = $_POST['depdrop_parents'];
        $data_lista = array();
        if ($parents != null) {
            $cliente = $parents[0];
            $tarifa = $parents[1];
            $array = Tarifa::find()->where(['IdCliente' => $cliente])->andWhere(['TipoTarifa' => $tarifa])
                ->andWhere(['eliminado' => 0])->andWhere(['estado' => 5])->groupby('TamanoCamion')->all();
            foreach ($array as $key => $value) {
                $camiones = Camiones::find()->where(['Tamano' => $value->TamanoCamion])->andwhere('Estatus = 1 or Estatus = 18')->all();
                foreach ($camiones as $key => $camion) {
                    $data_lista[] = array('id' => $camion->NumeroCamion, 'name' => $camion->NumeroCamion);
                }
            }
            $out = $data_lista;
            echo Json::encode(['output' => $out, 'selected' => '']);
            return;
        }
    }
    echo Json::encode(['output' => '', 'selected' => '']);
}

我正在获取这样的数据(我输入的输出更长,但我将其缩短以免使其乏味):

{"output":[{"id":"124","name":"124"},{"id":"161","name":"161"},        
{"id":"163","name":"163"},{"id":"125","name":"125"}, 
{"id":"112","name":"112"},{"id":"113","name":"113"}, 
{"id":"114","name":"114"},{"id":"115","name":"115"}, 
{"id":"492","name":"492"},{"id":"493","name":"493"}],"selected":""}
An Error occurred while handling another error:
yii\web\HeadersAlreadySentException: Headers already sent in 
/var/www/html/sat2-panama/controllers/OperacionesController.php on line 
1618. in /var/www/html/sat2- 
panama/vendor/yiisoft/yii2/web/Response.php:366
Stack trace:
#0 /var/www/html/sat2-panama/vendor/yiisoft/yii2/web/Response.php(339): 
yii\web\Response->sendHeaders()
#1 /var/www/html/sat2- 
panama/vendor/yiisoft/yii2/web/ErrorHandler.php(135): yii\web\Response- 
>send()
#2 /var/www/html/sat2- 
panama/vendor/yiisoft/yii2/base/ErrorHandler.php(111): 
yii\web\ErrorHandler- 
>renderException(Object(yii\web\HeadersAlreadySentException))
#3 [internal function]: yii\base\ErrorHandler- 
>handleException(Object(yii\web\HeadersAlreadySentException))
#4 {main}
Previous exception:
yii\web\HeadersAlreadySentException: Headers already sent in 
/var/www/html/sat2-panama/controllers/OperacionesController.php on line 
1618. in /var/www/html/sat2- 
panama/vendor/yiisoft/yii2/web/Response.php:366
Stack trace:
#0 /var/www/html/sat2-panama/vendor/yiisoft/yii2/web/Response.php(339): 
yii\web\Response->sendHeaders()
#1 /var/www/html/sat2- 
panama/vendor/yiisoft/yii2/base/Application.php(392): yii\web\Response- 
>send()
#2 /var/www/html/sat2-panama/web/index.php(12): yii\base\Application- 
>run()
#3 {main}

预计会有这样的数据:

{output: [{id: "124", name: "124"}, {id: "161", name: "161"}, {id: "163", 
name: "163"},…],…}
output: [{id: "124", name: "124"}, {id: "161", name: "161"}, {id: "163", 
name: "163"},…]
selected: ""

奇怪的是,当您从父下拉列表中选择另一个选项时,它会使用数据正确填充下拉列表。

问题出在“Tarifa”字段中的选项“Viaje”,我不知道这是否是数据处理或数据大小的问题,但使用其他选项时,数据较小并填充下拉列表正确。

编辑:我做了另一个测试:

我使用另一个函数来填充下拉列表:

public function PruebaDataDrop()
 {
    for ($i = 0; $i < 194; $i++) {
        $data_lista[] = array('id' => $i, 'name' => $i);
    }
    return $data_lista;
}

它仅适用于数组中的 195 个位置 (0-194),当我尝试 195 个或更多时,它给了我同样的问题(下拉列表继续加载)。

提前谢谢你。

【问题讨论】:

  • 首先,您是否为GET 请求关闭了此操作?接下来,如果$_POST 将为空您的echo 响应,但您应该在两种情况下都返回Json。其次,您确定您所做的POST 请求不会引发任何错误吗?也许在某些时候选择字段它没有模型。您能否发布 DepDrop 尝试发布的日期,以及您在两个 foreeach 循环中的控制器中获得了什么?
  • 你好,Serghei,我真的不明白你对第一点的意思,第二点,是的,$_POST 没有任何错误:不工作测试:数组([depdrop_parents] => 数组 ( [0] => 53 [1] => 1 ) [depdrop_all_params] => 数组 ( [produccion-idcliente] => 53 [produccion-tipotarifa] => 1 ) ) 这就是我得到的$_POST。
  • 然后,当它执行查询以获取数据时:测试工作:数组 [0]-[71] 测试不工作:数组 [0]-[162] 我尝试返回 Json两种情况也一样,同样的问题。
  • 我不明白你的EDIT,解释一下。还有关于“点”:您需要将行为添加到verbs 部分'camiones' =&gt; '['POST'],' 以关闭从GET 对控制器操作的访问,并在发生错误时向您发布数据库数据。
  • 我已经更好地解释了我的“编辑”。

标签: php yii2 widget dropdown


【解决方案1】:

你应该使用

return Json::encode(['output' => $out, 'selected' => '']); 

return Json::encode(['output' => '', 'selected' => '']);

这将解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多