Как добавить новые пункты меню администратора без переустановки компонента в Joomla? - PullRequest
4 голосов
/ 05 января 2012

Я разрабатывал компонент для Joomla 1.7.x, во время разработки мне нужно было добавить новые пункты меню компонентов в меню администратора, это было легко, добавив новые строки в таблицу компонентов в БД в Joomla в 1,5 раза, но теперь кажется,Сложно добавить пункт меню, добавив новую строку в таблицу меню из-за изменений структуры базы данных в Joomla 1.7

Есть ли простой способ сделать это без переустановки компонента?

tHanks

Ответы [ 4 ]

3 голосов
/ 28 октября 2012

Самый простой способ, который я нашел:

$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;
}

Удалить:

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

На основе http://docs.joomla.org/Using_nested_sets#Adding_a_new_node

0 голосов
/ 25 сентября 2016

Ответ Admit нуждается в обновлении для Joomla 3.x

Я уверен, что это верно для более старых версий Joomla, поэтому я не редактирую его.

Это сработало для меня после дальнейших исследований и редактирования.

$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;
}
0 голосов
/ 10 мая 2013

Вот несколько 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 голосов
/ 24 января 2012

Пункты меню Joomla 1.6+ хранятся под таблицей #__menu со специальным типом меню, называемым «основным» для меню администратора.

Найдите идентификатор главного меню администратора вашего компонента.Вы можете добавить подпункты этого, объявив столбец parent_id в качестве идентификатора вашего пункта главного меню и установив для столбца уровня значение 2.

Единственная другая проблема, с которой вы столкнетесь, это принятиевложенные множества (столбцы lft и rgt).Это лучший способ обработки отношений между родителями и детьми и упорядочения пунктов меню.Я не уверен, используются ли parent_id или lft / rgt на этом этапе, но они оба заполнены.

Чтобы добавить новый элемент, вам придется «шунтировать» все значения lft / rgtна два для пунктов меню со значением, большим или равным позиции, которую вы хотите добавить в свой пункт меню.Это должно включать rgt вашего родительского элемента.Если ваш родительский элемент не имеет дочерних элементов, lft для вашего нового элемента будет равен значению оставленного + 1 родителя. Значением rgt нового элемента будет lft + 2 родительского элемента.lft и rgt в том, что нумерация применяется к каждому элементу меню (front-end и back-end), поэтому неправильное выполнение этого может привести к поломке всей иерархии меню.Я думаю, именно поэтому столбец parent_id все еще используется, и в административной области есть возможность «перестроить» меню.

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

...