簡體   English   中英

強制Joomla JRoute使用菜單項

[英]Force Joomla JRoute to use the menu item

我正在為Joomla構建一個組件! 2.5和內部我使用JRoute::_('index.php?option=com_myapp&view=cpanel')來構建我的所有鏈接。 這有效,但它產生的鏈接看起來像這樣:

/component/myapp/cpanel.html

但是在菜單中我已經定義了index.php?option=com_myapp&view=cpanel的別名為“myapp”,所以鏈接應該是

/myapp/cpanel.html

可以通過此路徑訪問該組件。 如果我這樣做,內部生成的所有鏈接都將具有/myapp前綴。 但是要在模板(特殊登錄鏈接)中使用,如果用戶偶然發現/component/myapp ....我仍然希望所有鏈接都轉到/myapp前綴。

如何強制JRoute單獨使用此菜單項?

//look if there is a menu item set for myapp. if yes, we use that one to redirect
$db  = JFactory::getDBO();
$defaultRedirect = 'index.php?option=com_myapp&view=cpanel';
$db->setQuery('SELECT `id` FROM #__menu WHERE `link` LIKE '. $db->Quote($defaultRedirect) .' LIMIT 1' );
$itemId = ($db->getErrorNum())? 0 : intval($db->loadResult());
if($itemId){
    $rpath = JRequest::getString('return', base64_encode(JRoute::_('index.php?Itemid='.$itemId)));
}else{
    $rpath = JRequest::getString('return', base64_encode(JRoute::_('index.php?option=com_myapp&view=cpanel')));
}

注意:這不是語言安全的。 它需要在db中找到第一個菜單項。 如果為不同的語言設置不同的菜單別名,則還必須在SQL查詢中檢查正確的語言。

因為我在這個問題上遇到了很多困難,所以這是一個快速的功能,我會嘗試根據菜單項找到鏈接。 它主要基於其他答案。

這只是在Joomla 3.5上測試過的。 不推薦使用JRequest,因此使用$ app-> input。 這可能會做得更好,但至少它適用於我的用途。 希望它也可以幫助其他人!

public static function getRouteMenu($default_url) {
    $db = JFactory::getDbo();
    $app = JFactory::getApplication();
    $jinput = $app->input;

    $db->setQuery('SELECT `id` FROM #__menu WHERE `link` LIKE '. $db->Quote($default_url) .' AND `published` = 1 LIMIT 1' );
    $itemId = $db->loadResult();
    if($itemId) {
        $route = $jinput->getString('return', JRoute::_('index.php?Itemid='.$itemId));
        $route = str_replace('index.php/', '', $route);
    } else {
        $route = $jinput->getString('return', JRoute::_($default_url));
    }

    return $route;
}

該參數需要一個未重寫的鏈接,例如: index.php?option=com_content&view=article&id=10 如果您需要確定如何構建此鏈接,請檢查您的數據庫。

理想情況下,您需要將路由器設置為組件的一部分。 菜單管理器將覆蓋組件/ myapp位,但之后的內容將由router.php文件中的內容決定。

http://docs.joomla.org/Supporting_SEF_URLs_in_your_component

但是,如果您只需要創建指向特定菜單項的鏈接,那么您始終只需將Itemid添加到參數中即可

JRoute::_('index.php?Itemid=12')

將指向任何ID為12的菜單項,因此如果這是com_myapp組件的菜單項ID,它將創建指向該頁面的鏈接的菜單版本。

編輯:

您可以在技術上將相同的組件分配給兩個菜單項,因此當您鏈接到菜單項外部的組件而不給鏈接指定itemid時,我不認為處理URL的開頭是默認行為。 Joomla說(在創建JRoute的鏈接時)......

“請注意,可以省略參數選項和Itemid。選項默認為當前正在執行的組件的名稱,而Itemid默認為當前菜單項的ID。”

即,在沒有itemid或選項的情況下,從您的主頁(或一組以外的任何頁面)調用它而不使用itemid或選項,它可能會認為您處於com_content和主頁菜單項。

如果要鏈接到菜單項之外的組件但沒有對itemid進行硬編碼,那么一種方法是將Menuitem字段類型添加到要鏈接的模塊或模板的配置選項中,然后添加它為您的鏈接生成的itemid。

您還可以使用JFactory :: getApplication() - > getMenu()來查找鏈接到組件的菜單項。 沒有機會對此進行測試 - 但使用它也可能意味着您可以在路由器中設置itemid參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM