2010-09-24 16 views
15

To pytanie jest nieco specyficzne dla Joomla.Jak uzyskać konkretne pozycje w menu z joomla?

Mam głównym menu składające się z:

Strona główna | O nas | Polityka prywatności | Portfolio | Kontakt US.

Każdy element menu jest linkiem do artykułu.

Teraz na kompletnej stronie znajduje się wiele miejsc w komponentach i modułach, w których muszę pokazać dwa łącza: Polityka prywatności & Portfolio.

Czy ktoś może mnie poprowadzić? Nie chcę sztywnego kodowania linków, ponieważ identyfikator elementu różni się produkcją.

Odpowiedz

28

Istnieją 2 sposoby, można to zrobić:

Wariant 1:

Joomla ładuje dietetyczne każda strona czasu jest mnóstwo. Dostęp do menu można uzyskać, wywołując następujące metody.

// Get default menu - JMenu object, look at JMenu api docs 
$menu = JFactory::getApplication()->getMenu(); 

// Get menu items - array with menu items 
$items = $menu->getMenu(); 

// Look through the menu structure, once you understand it 
// do a loop and find the link that you need. 
var_dump($items); 

Ta metoda jest szybsza, ponieważ nie trzeba kwerendy bazy danych. Prosta obsługa w pamięci.

Opcja 2:

Pobierz go z bazy danych. Albo dostać odnośnik menu z jos_menu podstawie aliasu lub coś, lub uzyskać z artykułu # artykułu jos_content przez alias, a następnie utworzyć odnośnik

$db = JFactory::getDBO(); 

// Load by menu alias 
$query = "SELECT link FROM #__menu WHERE alias = 'privacy-policy'"; 
$db->setQuery($query); 
$url = $db->loadResult(); 
$url = JRoute::_($url); 


// Load by article alias 
$query = "SELECT id FROM #__content WHERE alias = 'privacy-policy'"; 
$db->setQuery($query); 
$articleId = (int) $db->loadResult(); 
$url = JRoute::_("index.php?option=com_content&view=article&id=$articleId"); 
+0

Dzięki Alex. Wybrałem opcję 2 – jtanmay

0
<?php 

$menuitemid = JRequest::getInt('Itemid'); 
if ($menuitemid) 
{ 
    $menu = JSite::getMenu(); 
    $menuparams = $menu->getParams($menuitemid); 
    $params->merge($menuparams); 
} 

$propvalue= $params->get('property_name'); 

?> 
+0

, to nie zadziała, ponieważ jeśli jesteś w widoku komponentu, Itemid będzie pozycją menu prowadzącą do komponentu. To jest daleko. – Alex

+0

'JRequest' jest przestarzałe. Musisz użyć 'JFactory :: getApplication() -> input' –

14

Najprostszym sposobem do osiągnięcia tego celu jest w 2.5+:

$app = JFactory::getApplication(); 
$menu = $app->getMenu(); 
$menu_items = $menu->getItems('menutype', 'mainmenu'); 

Po prostu zamień "mainmenu" na menutype, które chcesz przeciągnąć. Byłoby to równoznaczne z nazwą systemu dla twojego menu, taką samą, jaką wybrałbyś w module menu.

Edycja w odpowiedzi na użytkownika @ betweenbrain pytanie poniżej: Get menu Object w ten sam sposób jak wyżej, a następnie:

// To get menu items filtered by access level of current user. 
$filtered_menu_items = $menu->getItems(null, null); 

// To get all menu items, unfiltered. 
$all_menu_items = $menu->getMenu(); 
+0

Dzięki Don! Wydaje się, że warto było ponownie sprawdzić moje pytanie! :) – jtanmay

+0

cieszę się, że może pomóc. Używałem tego dużo w aplikacjach Joomla, a znalezienie ich zajęło mi trochę czasu, więc pomyślałem, że go gdzieś zarchiwizuję! –

+0

Don Gilbert - czy istnieje sposób użycia tego w 2.5, aby uzyskać wszystkie elementy menu ze wszystkich menu? Widzę, że _items jest chroniony. – betweenbrain

0

Czy nie łatwiej tworzyć nowe menu zawierające dwa aliasy do menu, które chcesz, a następnie załadować je w dowolnym miejscu na stronie internetowej przy użyciu {loadposition} lub cokolwiek?

2

W Joomla istnieje opcja połączenia z dowolnym menu z konkretną opcją hiperłącza. Z poziomu struktury menu backendu, do którego wstawiasz link do artykułu, możesz tam również wybrać inny link.

0

Myślę, że powinieneś stworzyć nowe menu w joomla, a następnie zrobić aliasy typu pozycji menu, powinieneś to zrobić, aby upewnić się, że nie dostaniesz duplikatów problemów z zawartością. Myślę, że odpowiedź Alex jest w porządku, jeśli chcesz zrobić to z kodem, ale trudniej go utrzymać, i dla kogoś, kto zrozumie, kto przychodzi. Ponieważ jest to pozycja menu, moim zdaniem nie należy ona do komponentu ani modułu.

2

Standardowym sposobem, aby to zrobić jest tutaj: http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias

Wystarczy wykonać drugie menu z polityką prywatności & tylko portfela i jako typ pozycji menu wybierz System Links> menu Alias ​​pozycji. Następnie możesz połączyć go z elementem menu z już utworzonego menu.

W ten sposób będzie można w dowolnym momencie zmienić oryginalne łącze do artykułu, a wszystkie aliasy zostaną zaktualizowane.

0

Aby uzyskać wszystkie elementy menu w joomla backend/administrator. Przetestowano w Joomla 3.3+

<?php 
// Create JApplicationSite instance to get all menu 
$site = new JApplicationSite; 
$menu = $site->getMenu(); 

// Get menu items - array filtered by access level of current user. Replace with `getMenu` to get all items or check @don-gilbert's answer. 
$menuItems = $menu->getItems(null, null); 

// Build please select option for no itemid 
$selectOption = array(); 
$selectOption[] = JHTML::_(
        'select.option', 
        '', 
        JText::_('COM_REDSHOP_PLEASE_SELECT'), 
        'id', 
        'title' 
       ); 

// Merge items to build select list. 
$items = array_merge($selectOption, $menuItems); 

// Just print array to understand the structure 
echo "<pre>"; 
print_r($items); 
echo "</pre>"; 

// Or create a select list directly using array. 
echo JHtml::_(
    'select.genericlist', 
    $items, 
    'menu_item_id', 
    '', 
    'id', 
    'title', 
    $this->detail->menu_item_id 
);