web-dev-qa-db-ja.com

joomlaから特定のメニュー項目を取得するにはどうすればよいですか?

この質問はJoomlaに少し固有です。

私は以下からなるメインメニューを持っています:

ホーム|米国について|プライバシーポリシー|ポートフォリオ|米国へのお問い合わせ

各メニュー項目は記事へのリンクです。

現在、完全なサイトでは、コンポーネントとモジュールの中に、プライバシーポリシーとポートフォリオの2つのリンクを表示する必要がある場所がたくさんあります。

誰かが私を案内してもらえますか?アイテムIDは本番環境で異なるため、リンクをハードコーディングしたくありません。

18
jtanmay

あなたがそれをすることができる2つの方法があります:

オプション1:

Joomlaは、ページが読み込まれるたびにメニューを読み込みます。次のメソッドを呼び出すと、メニューにアクセスできます。

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

データベースにクエリを実行する必要がないため、この方法の方が高速です。メモリ内の簡単な操作。

オプション2:

データベースから取得します。エイリアスなどに基づいてjos_menuからメニューリンクを取得するか、記事エイリアスによってjos_contentから記事#を取得してからリンクを作成します

$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");
32
Alex

2.5以降でこれを実現する最も簡単な方法は次のとおりです。

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

'mainmenu'をプルしたいmenutypeに置き換えるだけです。これは、メニューモジュールで選択するのと同じように、メニューのシステム名と同じになります。

以下の@betweenbrainの質問に答えて編集します:上記と同じ方法でメニューオブジェクトを取得し、次に:

// 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();
16
Don Gilbert

Joomlaには、特定のハイパーリンクオプションを使用して任意のメニューにリンクするオプションがあります。記事のリンクを配置するバックエンドメニュー構造から、そこから他のリンクを選択することもできます。

2
roy712

それを行う標準的な方法はここにあります: http://docs.joomla.org/Help32:Menus_Menu_Item_Menu_Item_Alias

プライバシーポリシーとポートフォリオのみを含む2番目のメニューを作成し、メニュー項目タイプとして[システムリンク]> [メニューエイリアス項目]を選択します。次に、作成済みのメニューからメニュー項目にリンクすることを選択できます。

このようにして、いつでも元の記事のリンクを変更することができ、すべてのエイリアスが更新されます。

1
tristanbailey
<?php

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

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

?>
0
ursitesion

Joomlaで新しいメニューを作成してから、エイリアスタイプのメニュー項目を作成する必要があると思います。これは、重複コンテンツの問題が発生しないようにするためです。アレックスの答えは、コードでやりたいのであれば大丈夫だと思いますが、維持するのが難しく、誰かが誰がやってくるのかを理解するのは難しいです。メニュー項目なので、私の意見ではコンポーネントやモジュールには属していません。

0
landed

必要なメニューの2つのエイリアスを含む新しいメニューを作成し、{loadposition}などを使用してWebサイトの任意の場所にロードする方が簡単ではありませんか?

0
Ahmad Alfy

Joomlaバックエンド/管理者のすべてのメニュー項目を取得します。 Joomla3.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
);
0
Gunjan Patel