2010-09-24 13 views
15

Esta pregunta es un poco específica para Joomla.¿Cómo obtener elementos de menú específicos de joomla?

que tienen un menú principal que consiste en:

Home | Política de privacidad Cartera Contactos estadounidenses.

Cada elemento del menú es el enlace a un artículo.

Ahora en el sitio completo hay muchos lugares en los componentes y módulos donde necesito mostrar dos enlaces: Política de privacidad & Cartera.

¿Puede alguien por favor guiarme? No quiero codificar los enlaces ya que la identificación del artículo diferiría en la producción.

Respuesta

28

Hay 2 maneras en que puede hacerlo:

Opción 1:

Joomla cargas menús cada página el tiempo es cargas. Puede acceder a los menús llamando a los siguientes métodos.

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

Este método es más rápido porque no necesita consultar la base de datos. Operación simple en la memoria.

Opción 2:

la obtiene de la base de datos. O bien obtener el enlace del menú de jos_menu basado en alias o algo, o conseguir el artículo # de jos_content por el artículo alias, a continuación, crear el enlace

$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

Gracias Alex. Opté por la opción 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

, esto no funcionará porque si se encuentra en la vista del componente, el Itemid será del elemento del menú que conduce al componente. Esto está muy lejos. – Alex

+0

'JRequest' está en desuso. Necesitas usar 'JFactory :: getApplication() -> input' –

14

La forma más sencilla de lograr esto es en 2.5+:

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

Simplemente reemplace 'mainmenu' con el menutipo que desea extraer. Esto equivaldría al nombre del sistema para su menú, el mismo que seleccionaría en el módulo del menú.

Editar en respuesta a la siguiente pregunta de @ betweenbrain: obtener el menú objeto de la misma manera que el anterior, entonces:

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

Gracias Don! ¡Parece que valió la pena revisar mi propia pregunta nuevamente! :) – jtanmay

+0

me alegro de que podría ayudar. Lo he usado mucho en mis aplicaciones de Joomla, y me tomó un tiempo encontrarlo, ¡así que pensé en archivarlo en alguna parte! –

+0

Don Gilbert: ¿hay alguna forma de usar esto en 2.5 para obtener todos los elementos del menú de todos los menús? Veo que _items está protegido. – betweenbrain

0

¿No es más fácil crear un nuevo menú que contiene dos alias para el menús que desee y luego cárguelos en cualquier lugar del sitio web usando {loadposition} o lo que sea?

2

En Joomla hay una opción para vincular con cualquier menú con una opción de hipervínculo particular. Desde la estructura del menú de back-end donde pones el enlace del artículo, desde allí también puedes seleccionar otro enlace.

0

Creo que debería crear un nuevo menú en joomla y luego hacer alias tipo de elementos de menú, debe hacer esto para asegurarse de no tener problemas de contenido duplicado. Creo que la respuesta de Alex está bien si quieres hacerlo con el código, pero es más difícil de mantener y que alguien entienda quién viene. Como es un elemento de menú, no pertenece a un componente o módulo en mi opinión.

2

La forma habitual de hacerlo es aquí: http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias

Sólo hacer un segundo menú con la Política de Privacidad solo & Cartera en y como un tipo de elemento de menú seleccione Vínculos del sistema> Menú Alias ​​artículo. Luego puede elegir vincularlo al elemento del menú que ya creó.

De esta manera usted podrá cambiar el enlace del artículo original en cualquier momento y se actualizará todo el alias.

0

Para obtener todos los elementos de menú en joomla backend/administrator. Probado en 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 
); 
Cuestiones relacionadas