【问题标题】:Yii2:Passing variable from controller to javascriptYii2:将变量从控制器传递到javascript
【发布时间】:2017-05-28 15:49:48
【问题描述】:

我正在为我的项目使用 Yii2 框架。 我的控制器中有一个循环,这是代码

detailController.php:

public function actionResult() {
    $connection = \Yii::$app->db;
    $searchModel = new HeaderSearch();
    $dataProvider = new ActiveDataProvider([
        'query' => Header::find()->
                where(['user_id' => Yii::$app->user->identity->id]),
        'pagination' => [
            'pageSize' => 24,
        ],
    ]);
    
    $val = base64_decode($val);
    $txt = base64_decode($txt);
    $arrayVal = explode(",", $val);
    unset($arrayVal[count($arrayVal) - 1]);
    $arrayHeader = explode(",", $txt);
    unset($arrayHeader[count($arrayHeader) - 1]);
    $headerArray = null;
    for ($i = 0; $i < count($arrayVal); $i++) {
        $headerArray[$arrayVal[$i]] = $arrayHeader[$i];
    }
    $userId = Yii::$app->user->id;
    $modelUser = User::find()->where(['id' => $userId])->one();
    $parentId = $modelUser->parent_id;
    $sql = $connection->createCommand("SELECT list_header FROM customize_header WHERE user_id=$userId");
    $modelData = $sql->queryColumn();
    $arrayData = json_decode($modelData[0]); //all data in array form
    $countData = count($arrayData); // count rows of data except header row

    $modelUser = User::find()->where(['id' => Yii::$app->user->id])->one();
    $data = CustomizeHeader::find()->all();
    $command = "DELETE FROM header WHERE user_id = '$userId'";
    $query = Yii::$app->db->createCommand($command)->execute();

    foreach ($arrayHeader as $value) {
        $az = preg_replace('/^([0-9]{1,2})(_.*)/i', "\\2", $value);
        $data = ltrim($az, '_');
        $command = "INSERT INTO header(nama_header, user_id, parent_id) VALUES('$data', '$userId', '$modelUser->parent_id')";
        $query = Yii::$app->db->createCommand($command)->execute();
    }
    $countHeader = count($arrayHeader);    //count of selected header
    $j = 0;
    $point = floor($countData / 4);
    $percent = 0;
    for ($k = $j; $k < $countData; $k++) { 
        if($k % $point == 0 && $k > 0){      //Special Condition
            $percent = $percent + 10;        // Special Variable
        }
        $keyData = array_keys($arrayData[$k]);
        $countKeyData = count($keyData);      
        for ($x = $k; $x <= $countData; $x++) {
            foreach ($arrayHeader as $key => $value) {
                $headerId[] = preg_replace('/^([0-9]{1,2})(_.*)/i', "\\1", $value);
            }
            $n[$k] = [];
            for ($a = 0; $a < $countHeader; $a++) {
                for ($b = 0; $b < $countKeyData; $b++) {
                    if ($headerId[$a] == $keyData[$b]) {
                        $n[$k][] = $arrayData[$k][$b];
                    }
                }
            }
        }
    }
      //some code
    return $this->render('index', [
                'searchModel' => $searchModel,
                'dataProvider' => $dataProvider,
                'userId' => $userId,
    ]);

在上面的代码中,我有一个条件 if($k % $point == 0 &amp;&amp; $k &gt; 0),我将注释标记为 Special Condition,其中包含一个变量 $percent,我将注释标记为 Special Variable。每次条件为 true 时,我都想将此变量(包括值)发送到 upload.js

因此,该变量将在动作处理期间实时发送到 upload.js

上传.js:

function displayResult() {
$('#progress').show();
var x = document.getElementById('bootstrap-duallistbox-selected-list_CustomizeHeader[list_header][]');
if (x.length == 24) {
    var txt = "";
    var val = "";
    for (var i = 0; i < x.length; i++) {
        txt += x[i].text + ",";
        val += x[i].value + ",";
    document.getElementById("progress").innerHTML="<div style=\"width:'percent';background-color:#ddd;\">&nbsp;</div>"; //Here
    }
    window.location = 'result?txt=' + btoa(txt) + '&val=' + btoa(val);
} else {
    alert("At least 24 Headers!");
}
}

我使用这个脚本view.php中显示一个进度条,进度条的宽度(我设置的行代码注释标记为Here) 取决于从控制器传递到此脚本的$percent

那么如何在一个动作执行期间从 PHP Javascript 实时传递变量呢?

知道如何解决这个问题吗? 谢谢你:)

【问题讨论】:

  • 在您的代码中,我看不到您如何获得 $dataProvider 以及与循环中的值和您的 dataProvider 存在何种关系..请更好地解释
  • @scaisEdge,对不起,我忘了在评论中添加通知some code。我没有添加代码,因为它包含超过 30 行代码。我应该添加代码吗?谢谢
  • 是的,添加代码让我看看
  • @scaisEdge 我已经更新了代码,检查问题。

标签: javascript php ajax yii2 real-time


【解决方案1】:

在这种情况下,您应该在返回数组中传递正确的值,然后在视图中管理正确的使用
例如:假设您需要的值在 $percent 变量中

在你的控制器中

   return $this->render('index', [
                  'searchModel' => $searchModel,
                  'dataProvider' => $dataProvider,
                  'userId' => $userId,
                  'percent' => $percent
      ]);

在您的视图中,您可以检查是否正确使用

.......

  <?php  

     if ( $percent > 0) {
      echo "<div>". $percent . "</div>";
     }
  ?>

 .....

【讨论】:

  • 谢谢,但我认为如果我使用渲染发送数据,它会中断动作执行。对不起,我在第一次编辑中更新了标题,我想将数据传递给 javascript。您如何看待 ajax?有人告诉使用ajax实时发送数据,我尝试了一些代码但它没有工作。
  • 为了将数据传递给 javascript 而不是渲染,您可以使用返回(或回显),但这些将发送到操作结束的地方。希望很清楚,否则让我知道你的疑问
  • 感谢学习。如果我使用return,它不会中断动作吗?
  • 是的,如果你使用 return 你结束了这个动作。如果您需要客户端和服务器之间的 ciclic 通信(javascript 到 php),您应该使用例如:一个单独的(快速)操作 .. 由 ajavx 调用只是为了知道您的进程的进展..
  • 分离动作?我们如何使用 ajax 从控制器中获取动作的推进?
【解决方案2】:
if ($percent) {
    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
        'userId' => $userId,
        'percent' => $percent
    ]);
}

return $this->render('index', [
    'searchModel' => $searchModel,
    'dataProvider' => $dataProvider,
    'userId' => $userId,
]);

我对你有用的洞。

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2012-02-10
    • 2016-01-11
    相关资源
    最近更新 更多