2012-10-30 98 views
2

我有一個簡單的Joomla控制器,但我不能重定向任何東西。Joomla setRedirect不工作

根據文檔:

class MyController extends MyBaseController { 

function import() { 
    $link = JRoute::_('index.php?option=com_foo&ctrl=bar'); 
    $this->setRedirect($link); 
    } 

} 
//The url contains & html escaped character instead of "&" 

這應該工作,但我得到一個錯誤的URL。有什麼我在這裏失蹤?爲什麼Joomla會將所有「&」字符轉換爲&?我想如何使用setRedirect?

謝謝

回答

10

好的,我修好了。所以,如果有人需要它:的

代替

$link = JRoute::_('index.php?option=com_foo&ctrl=bar'); 
$this->setRedirect($link); 

使用

$link = JRoute::_('index.php?option=com_foo&ctrl=bar',false); 
$this->setRedirect($link); 

,使其工作。

1

很高興能找到答案,順便說一句,JRoute::_()中的布爾參數默認爲true,並且對xml遵從性有用。它所做的是在靜態方法中,它使用如下所示的htmlspecialchars php函數:$url = htmlspecialchars($url)替換xml的&。

1

試試這個。

$mainframe = &JFactory::getApplication(); 
$mainframe->redirect(JURI::root()."index.php?option=com_foo&ctrl=bar","your custom message[optional]","message type[optional- warning,error,information etc]"); 
+0

我同意你的回答@jobin導致$ this-> setRedirect($ link); setRedirect()沒有在你的自定義類中定義,所以使用jobin回答它真的有效 –

+0

實際上我有它,它只是我在JController和我自己之間放置了一個控制器,所以我自己的控制器可以共享某些功能。但是,謝謝 – Opi

0

檢查的Joomla源,你可以很快看到爲什麼發生這種情況後:

if (headers_sent()) 
    { 
     echo "<script>document.location.href='" . htmlspecialchars($url) . "';</script>\n"; 
    } 
    else 
    { 
    ... ... ... 

的問題是,你的頁面有可能已經輸出了一些數據(通過回聲或其他方式)。 在這種情況下,Joomla被編程爲使用簡單的JavaScript重定向。但是,在此JavaScript重定向中,它將htmlspecialchars()應用於URL。

一個簡單的解決方法就是不要使用Joomlas功能,直接編寫JavaScript的方式,更有意義:

echo "<script>document.location.href='" . $url . "';</script>\n"; 

這對我的作品:)

-3

/庫/的Joomla /應用/application.php

查找線路400

// If the headers have been sent, then we cannot send an additional location header 
    // so we will output a javascript redirect statement. 
    if (headers_sent()) 
    { 
     echo "<script>document.location.href='" . htmlspecialchars($url) . "';</script>\n"; 
    } 

替換爲

// If the headers have been sent, then we cannot send an additional location header 
    // so we will output a javascript redirect statement. 
    if (headers_sent()) 
    { 
     echo "<script>document.location.href='" . $url . "';</script>\n"; 
    } 

This Works!

+1

這是最糟糕的解決方案。切勿修改第三方庫來修復**不是bug **的內容。除非您對發佈核心Joomla人員的合併變更的請求感到滿意,否則您不應該進行更改。事實上,你可能會嚴重地破壞應用程序的* rest *,從根本上改變Joomla的行爲,以至於其他第三方庫可能依賴它。 – meagar