Друпал предоставляет замечательную возможность - сортировать пункты в любом меню с применением прозрачной системы "весомости" того или иного пункта. Это удобно ровно до тех пор, пока осуществляется простое управление порядком меню через интерфейс администрирования, где пункты можно растащить мышкой по нужным местам. А когда дело доходит до включения нового пункта в меню, будь то при создании материала или в админчасти, удобство улетучивается. А почему?
Потому что при создании нового пункта меню Друпал предлагает указать пункт-родитель и вес этого пункта и указать сходу нужный вес не получится, т.к. неизвестны веса пунктов-соседей. Хорошо, если все пункты меню у вас имеют вес 0 и сортируются по алфавиту, а если нет?
Например, имеется следующая структура меню и нам нужно вставить после "Сына Гоши" "Сына Альберта":
Родитель Сын Вася 0 Сын Петя 0 Сын Гоша 12 Сын Миша 13
// я указал предполагаемые веса существующих элементов
Заметим, что при создании пункта меню "Сын Альберт" в поле "Вес" будет выбрано значение 0 и если мы оставим его без изменения, Сын Альберт скорее всего окажется первым, хотя нам нужно поставить его после Гоши, и для получения нужного порядка нам нужно указать значение больше 12 (12 - реальное значение, которое может быть получено в ходе предыдущих изменений меню). Но мы ведь не знаем, что у Гоши вес 12, т.к. этого нигде не видно. И нам придется после сохранения нового пункта проводить перетасовку, либо подбирать вес методом тыка, раз за разом пересохраняя результат и теряя время до получения удовлетворения.
Решением проблемы может стать показ весов пунктов в списке выбора родителя (как с делал в примере), либо смена концепции выбора места для вновь создаваемого пункта. Например, убрать поле веса совсем, а выбор родителя заменить на выбор "предшествующего" пункта меню (мы выбрали бы в качестве предшествующего - Гошу), предоставив ядру возможность самостоятельно перестроить веса для "сдвинутых" в результате изменений пунктов (в нашем случае - вытеснить с 13 места Мишу).
Пользуясь читательским вниманием и потакая своей лени, вопрошаю - как показать веса пунктов в списке выбора родителя?
Комментарии
Хороший концепт для будущего модулька
[почикано]
Рыть функции menu_form_alter() и menu_parent_options(). Это там.
Спасибо.
Хак ядра
menu.module, строка 224, вписать в нужное место $data['link']['weight']
Модулем
Скопировать из menu.module фунции:
menu_form_alter() //переименовать в modulename_form_alter()
menu_parent_options() //переименовать в menu_parent_options2()
_menu_parents_recurse //переименовать в _menu_parents_recurse2()
Вписать в последней функции $data['link']['weight']
Как-то так