2012-01-04 8 views
4

私は開発中にJoomla 1.7.xのコンポーネントを開発していました。管理メニューに新しいコンポーネントメニュー項目を追加する必要がありました.JoomlaのDBのコンポーネントテーブルに新しい行を1.5回追加するのは簡単でしたが、理由はJoomlaの1.7joomlaにコンポーネントを再インストールせずに新しい管理メニュー項目を追加するには?

におけるデータベース構造の変更のメニュー表に新しい行を追加することで、メニュー項目を追加するコンポーネントを再インストールせずにこれを行う簡単な方法はありますか?

おかげ

答えて

0

のJoomla 1.6+メニュー項目は、管理者メニューの「メイン」と呼ばれる特別なメニュータイプで、#__menuテーブルの下に格納されています。

メインコンポーネントの管理メニュー項目のIDを確認します。 parent_id列をメインメニュー項目のIDとして宣言し、レベル列を2に設定することで、そのサブ項目を追加できます。

唯一の問題は、ネストされたセットの採用です(lft列とrgt列)。これは、親子関係とメニュー項目の順序を処理するより良い方法です。この段階でparent_idまたはlft/rgtが使用されているかどうかは不明ですが、両方とも入力されています。

新しい項目を追加するには、すべてのlft/rgt値を2分の1にシャントする必要がありますメニュー項目を追加する位置以上の値を持つメニュー項目の場合これには、親品目の大口額が含まれていなければなりません。あなたの親アイテムに子供がいない場合、新しいアイテムのlftは親のleft + 1の値になります。新しいアイテムのrgtの値は親のlft + 2になります。

lftとrgtは、すべてのメニュー項目(フロントエンドとバックエンド)に番号が付いているため、正しく機能しないとメニュー全体を破壊する可能性があります。私はこれがなぜparent_idカラムがまだ使用されているのか、メニューを "再構築"するための管理領域にオプションがあることだと思います。

http://en.wikipedia.org/wiki/Nested_set_model

3

私が見つけた最も簡単な方法:

$table = JTable::getInstance('menu'); 

$data = array(); 
$data['menutype'] = 'main'; 
$data['client_id'] = 1; 
$data['title'] = 'ITEM TITLE'; 
$data['alias'] = 'com-component-name'; 
$data['link'] = 'index.php?option=com_component_name&view=default'; 
$data['type'] = 'component'; 
$data['published'] = '0'; 
$data['parent_id'] = '117'; // ID, under which you want to add an item 
$data['component_id'] = '10026'; // ID of the component 
$data['img'] = 'components/com_component_name/assets/images/icon.png'; 
$data['home'] = 0; 

if (
     !$table->setLocation(117, 'last-child') // Parent ID, Position of an item 
    || !$table->bind($data) 
    || !$table->check() 
    || !$table->store() 
){ 
    // Install failed, warn user and rollback changes 
    JError::raiseWarning(1, $table->getError()); 
    return false; 
} 

削除するには:http://docs.joomla.org/Using_nested_sets#Adding_a_new_node

0

に基づいて

$table->delete(120); // item ID 
$table->rebuild(); 

ここに私がやったことを思い付いたいくつかのSQLクエリがありますトリック(関連する部分のみ表示):

SET @lastRgt := (SELECT rgt + 1 FROM #__menu WHERE alias="alias-of-preceding-menu-item"); 

UPDATE #__menu SET rgt=rgt+2 WHERE rgt > @lastRgt; 
UPDATE #__menu SET lft=lft+2 WHERE lft > @lastRgt; 

INSERT INTO #__menu (menutype, title, alias, path, link, type, published, parent_id, level, component_id, img, client_id, params, access, lft, rgt) 
VALUES(..., @lastRgt+1, @lastRgt+2); 

Joomla 2.5で働いた。

0

はの答えは、私はそれがなぜ私はそれを編集していないよされ、古いJoomlaのバージョンの正しいだと確信していますJoomlaの3.xの

のアップデートを必要としている認めます。

さらなる研究と編集を経て私はうまくいきました。

$table = JTableNested::getInstance('Menu'); 
$data = array(); 
$data['menutype'] = 'main'; 
$data['client_id'] = 1; 
$data['title'] = 'ITEM TITLE'; 
$data['alias'] = 'com-component-name'; 
$data['link'] = 'index.php?option=com_component_name&view=default'; 
$data['type'] = 'component'; 
$data['published'] = '0'; 
$data['parent_id'] = '117'; // ID, under which you want to add an item 
$data['component_id'] = '10026'; // ID of the component 
$data['img'] = 'components/com_component_name/assets/images/icon.png'; 
$data['home'] = 0; 
$table->setLocation(117, 'last-child') // Parent ID, Position of an item 
if (!$table->bind($data) || !$table->check() || !$table->store()) { 
    // Install failed, warn user and rollback changes 
    JError::raiseWarning(1, $table->getError()); 
    return false; 
} 
関連する問題