在新选项卡中将控制器重定向到外部站点

时间:2018-05-11 16:35:37

标签: redirect yii2

以下代码将抛出异常

  

数组到字符串转换

我的目的是在另一个标签中加载带有特殊参数的外部网站。应该如何正确编码?请注意,重定向不应该呈现内部控制器方法!!

$paramValue = "12";
return $this->redirect("http://example.com?param=$paramValue", ['target' => '_blank']);

我所做的一切 - 没有错误 - 是创建链接,但这不一样。所以,别无选择!

 <center><?php
 echo Html::a('StepStone laden', $url, ['class' => 'btn btn-success btn-block', 'target' => '_blank', 'title' => 'Load StepStone', 'data' => ['pjax' => '0']]);
?></center><?php

编辑(穆罕默德): 这是我的解决方案,因为它实际存在:

/* It's not possible to render external URL in aonther tab using php. So, following order will render external URL in same tab:
    return $this->redirect($url); */

private function RenderBoerse($name, $DynamicModel) {
    $ReplaceJob = $DynamicModel->job;
    $ReplaceTown = $DynamicModel->place;
    $Jobboerse = LJobboersen::findOne(['name' => $name])->ergebnis_seite;
    $url = $this->WebStringErsetzen($Jobboerse, "###", $ReplaceJob);
    $url = $this->WebStringErsetzen($url, "&&&", $ReplaceTown);
    ?>
    <center>
        <?= Html::a("$name laden", $url, ['class' => 'btn btn-success btn-block', 'target' => '_blank', 'title' => "Load $name"]);
        ?></center><?php
}

私有函数WebStringErsetzen($ str,$ suchen,$ ersetzen){     $ string = str_replace($ suchen,$ ersetzen,$ str);     return $ string; }

1 个答案:

答案 0 :(得分:2)

如果您尝试重定向到外部链接并在controller/action内发布参数,那么您可以执行以下操作

$url='http://google.com?'.http_build_query(['param' => 12]);
return $this->redirect($url);

但是,如果您想通过打开新标签重定向到外部链接,那么您将从任何人那里获得的第一个回复是 NO 。最重要的是,如果要在新标签中打开链接,那么我不会说它是 redirection ,因为调用新标签的当前页面仍然存在,所以这意味着仍然打开原始或上一个选项卡并加载视图。

如果这是正确的,那么您可以通过留在controller/action内来打开新标签中的链接。但这并不意味着您正在使用服务器端打开一个新选项卡,它实际上将帮助您完成数据提取以及打开保留在控制器内并仍使用javascript的新链接所需的所有操作。

我们可以在控制器中使用$this->getView()->registerJs();来注册一个打开新标签的javscript coed,一旦视图加载,它将自动打开新标签。

看到此示例操作将其添加到您的控制器中并尝试调用它,只需创建一个要加载的空视图文件。

public function actionExternalLink() {
    $url = 'http://google.com?' . http_build_query ( [ 'param' => 12 ] );
    $script = <<<JS
            function openInNewTab(url) {
              var win = window.open(url, '_blank');
              win.focus();
            }
             openInNewTab('$url');
JS;

    $this->getView ()->registerJs ( $script , \yii\web\View::POS_READY );
    return $this->render ( 'external' );
}