2010-09-24 4 views
15

Diese Frage ist etwas spezifisch für Joomla.Wie bekomme ich bestimmte Menüpunkte von Joomla?

Ich habe ein Hauptmenü, bestehend aus:

Home | Über uns | Datenschutz | Portfolio | Kontakte US.

Jeder Menüeintrag ist ein Link zu einem Artikel.

Jetzt auf der gesamten Website gibt es viele Stellen in den Komponenten und Modulen, wo ich zwei Links zeigen muss: Datenschutz & Portfolio.

Kann mir bitte jemand Anleitung geben? Ich möchte die Links nicht hart codieren, da sich die Artikel-ID in der Produktion unterscheiden würde.

Antwort

28

Es gibt zwei Möglichkeiten, wie Sie es tun können:

Option 1:

Joomla lädt Menüs jedes Mal Seite geladen ist. Sie können auf die Menüs zugreifen, indem Sie die folgenden Methoden aufrufen.

// 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); 

Diese Methode ist schneller, da Sie die Datenbank nicht abfragen müssen. Einfache Bedienung im Speicher.

Option 2:

holen aus der Datenbank. Entweder Menü Link von jos_menu basierend auf Alias ​​oder etwas zu bekommen, oder Artikel # aus jos_content von Artikeln alias bekommen, dann erstellen Sie den Link

$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

Danke Alex. Ich habe die Option 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

gewählt. Dies funktioniert nicht, denn wenn Sie sich in der Komponentenansicht befinden, gehört das Itemid zu dem Menüelement, das zu der Komponente führt. Das ist weit weg. – Alex

+0

'JRequest' ist veraltet. Du brauchst 'JFactory :: getApplication() -> input' –

14

Der einfachste Weg, dies in 2.5+ zu tun ist:

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

Ersetzen Sie einfach 'mainmenu' mit dem Menutyp, den Sie ziehen möchten. Dies entspricht dem Systemnamen für Ihr Menü, genauso wie Sie es im Menümodul auswählen würden.

bearbeitet als Antwort auf @ betweenbrain Frage unten: das Menü auf die gleiche Weise wie oben Objekt erhalten, dann:

// 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

Danke Don! Scheint, dass es sich lohnt, meine eigene Frage noch einmal zu überprüfen! :) – jtanmay

+0

froh, dass es helfen könnte. Ich habe das oft in meinen Joomla-Anwendungen benutzt, und es hat eine Weile gedauert, bis ich es gefunden habe, also dachte ich, ich würde es irgendwo archivieren! –

+0

Don Gilbert - gibt es eine Möglichkeit, diese in 2.5 zu verwenden, um alle Menüpunkte aus allen Menüs zu erhalten? Ich sehe, dass _items geschützt ist. – betweenbrain

0

Ist das nicht einfacher ist es, ein neues Menü, das zwei Aliase die zu erstellen Menüs, die Sie wollen, dann laden Sie sie irgendwo auf der Website mit {loadposition} oder was auch immer?

2

In Joomla gibt es eine Option, mit jedem Menü mit einer bestimmten Hyperlink-Option zu verknüpfen. Von Back-End-Menü-Struktur, wo Sie Artikel Link setzen, von dort aus können Sie auch andere Link auswählen.

0

Ich denke, Sie sollten ein neues Menü in Joomla erstellen und dann Aliase Art von Menüelementen, sollten Sie dies tun, um sicherzustellen, dass Sie nicht doppelte Inhalte Probleme bekommen. Ich denke Alex Antwort ist in Ordnung, wenn Sie es mit Code machen möchten, aber es ist schwieriger zu pflegen und für jemanden zu verstehen, wer kommt. Da es sich um einen Menüpunkt handelt, gehört er meiner Meinung nach nicht in eine Komponente oder ein Modul.

2

Der üblicher Weg, es zu tun ist hier: http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias

Nur ein zweites Menü mit nur Datenschutz & Portfolio machen und als eine Art Menüpunkt wählen Artikel Alias-System Links> Menüs. Dann können Sie wählen, um es mit dem Menüelement aus dem Menü, das Sie bereits erstellt haben, zu verknüpfen.

Auf diese Weise können Sie den ursprünglichen Artikellink jederzeit ändern und alle Alias ​​wird aktualisiert.

0

Um alle Menüelemente in Joomla Backend/Administrator zu erhalten. Getestet in 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 
);