如何在prestashop中将控制器中的变量传递给控制器?
问题描述:
有没有办法在prestashop中将变量从控制器传递给另一个控制器?我特林传递的AddressController覆盖这样的NEW_ADDRESS变量:如何在prestashop中将控制器中的变量传递给控制器?
Tools::redirect('index.php?controller='.$back.($mod ? '&back='.$mod : '') . '&new_address=' . $address->id);
注意,这是原线+ . '&new_address=' . $address->id
,所以我要坚持Tools::redirect
。
通过使用该行,$ _GET中的下一页上找不到new_address。从OrderController和ParentOrderController,我也没有看到它。
答
我在Tools :: redirect中找到了原因。它有这样一行:
$url = Tools::strReplaceFirst('&', '?', $url);
在这里,他们基本上排除超过第一个以外的任何queryvar,所以如果你添加一些你不会找到任何。如果你有index.php?a=1&b=2
,你会得到index.php?a=1?b=2
。我真的不明白这一点......也许这是一个错误。
所以我重写工具::重定向这样的(改装成行被注释掉):
public static function redirect($url, $base_uri = __PS_BASE_URI__, Link $link = null, $headers = null){
if (!$link) $link = Context::getContext()->link;
$querystring = array_pop(explode('?', $url)); // MOD: Save the original querystring. I take the last item in array because sometimes (i think it's a bug) the $url is like index.php?controller=order.php?step=1, so 2 question marks.
if (strpos($url, 'http://') === false && strpos($url, 'https://') === false && $link) {
if (strpos($url, $base_uri) === 0) {
$url = substr($url, strlen($base_uri));
}
if (strpos($url, 'index.php?controller=') !== false && strpos($url, 'index.php/') == 0) {
$url = substr($url, strlen('index.php?controller='));
if (Configuration::get('PS_REWRITING_SETTINGS')) {
$url = Tools::strReplaceFirst('&', '?', $url); // ...Don't see the point here...
}
}
$explode = explode('?', $url);
// don't use ssl if url is home page
// used when logout for example
$use_ssl = !empty($url);
$url = $link->getPageLink($explode[0], $use_ssl);
if($querystring) $url .= '?'.$querystring; // MOD: adding full querystring!! Also deleted 3 lines that added $explode[1] instead
}
// Send additional headers
if ($headers) {
if (!is_array($headers)) $headers = array($headers);
foreach ($headers as $header) {
header($header);
}
}
header('Location: '.$url);
exit;
}
确定[这](https://github.com/PrestaShop/PrestaShop/blob/1.6.1 .x/controllers/front/AddressController.php#L243)行正在执行?如果是的话,那么中间可能会有另一个重定向。 – TheDrot
是的,我确定它被执行了,我发现了Tool :: redirect失败的原因,我正在编写一个覆盖,然后我会发布一个官方的答案。 – Stratboy