Наткнулся я ещё на один ну просто идиотический момент в DLE... На этот раз - панель администратора...
Понадобилось мне поменять в панели администратора кнопочки в шапке. Казалось бы, рядовая задача, но в DLE она решается очень сложно.
Хотя давайте скажем правду, в модулях, даже в штатных самого DLE, ссылки на редактирование новостей - не самая актуальная.
Давайте посмотрим на структуру файлов, которые отвечают за панель администратора.
/engine/skins/default.skin.php - файл шаблона панели администратора. Точнее, не всего шаблона, а его "шапки" и "подвала". Он же отвечает за страницу входа в панель администратора, формирование списка модулей слева, аватарки и информации о пользователе в "шапке", а так же количества личных сообщений.
/engine/inc/include/functions.inc.php - файл основных функций, в том числе и вывода "шапки" и "подвала" сайта...
Что ж, давайте рассмотрим возможные варианты, которые помогут нам заменить или дополнить ссылки в "шапке".
Первое, что приходит в голову, так это динамически генерируемый список ссылок. Давайте проверим:
Скрытое содержимое доступно для зарегистрированных пользователей!
Увы, нет, кусок записан жёстко и не выводится переменными. Можно, конечно, подменить переменные $lang['add_news'] и $lang['edit_news'], но это не правильно и может отразиться на других участках кода.
Подмена переменных - это вообще крайняя мера в программировании на мой взгляд.
Второй вариант, который приходит в голову - это возможность выбора шаблона и замена шаблона по-умолчанию на наш. Звучит очень даже правдоподобно, учитывая, что наш шаблон называется "default". Где есть шаблон "по-умолчанию", там должны быть и другие...
Смотрим функцию, которая выводит шаблон на экран:
Скрытое содержимое доступно для зарегистрированных пользователей!
К сожалению, и здесь нам нечего искать. Никаких условий или переменных, отвечающих за подключение шаблона нет. Единственное, что реализовывает функция - генерация "хлебных крошек" или "спидбара". Это панелька навигации, показывающая в каком разделе Вы сейчас находитесь.
Что ж, DLE на дал нам ни единого варианта, чтобы управлять шаблоном, "шапкой" и т.д. Будем исправлять.
Самый тупой вариант, который приходит в голову - это вкорячить изменения прямиком в файл default.skin.php. Нет, это явно плохая идея, которая приведёт к проблемам с обновлениями. Да и отразится на других участках панели адинистратора.
Вариант лучше - это скорректировать файл functions.inc.php, добавив в него возможность выбора шаблона. К примеру так:
Скрытое содержимое доступно для зарегистрированных пользователей!
В результате, мы получаем в любом куске кода DLE выбор шаблона default.skin.php, но достаточно передать 3-ю переменную - мы подгружаем другой шаблон.
Именно это решение я бы рекомендовал внедрить разработчику DLE, чтобы сильно облегчить работу разработчиков дополнений. Да и решение напрашивается само собой. Думаю, это даже изначально было задумано разработчиком, исходя из структуры папок и файлов, но почему-то не было реализовано.
Но мы - разработчики дополнений, и наша задача - делать модули максимально независимыми от основного движка, чтобы обновление DLE не потребовало новой установки модуля. Хотя это и не возможно полностью - в пользовательской части всё равно придётся править файлы, но минимизировать это необходимо. Хотя опять же, остаётся вопросом - почему в панели администратора реализовано автоматическое подключение модулей, а в пользовательской части - нет.
Но это просто разговор ни о чём, давайте всё же реализовывать задуманное.
Первым делом мы скопируем default.skin.php и сохраним его с именем gorbushka.skin.php (да, я тщеславен). Дальше вносим изменения в файл, которые мы хотели сделать. Меняем ссылки, добавляем новые переменные и т.д. Думаю, с этим справитесь.
Теперь нам надо переопределить функцию echoheader(). Создадим свою функцию и назовём _echoheader() - напомню, переопределять переменные и функции плохая идея. В теле самой функции можем как просто прописать подключение другого шаблона, так и реализовать выбор шаблона, как я писал выше. Это дело вкуса. Остальной текст функции мы полностью копируем из исходной echoheader().
Теперь в своём модуле мы просто вызываем новую функцию _echoheader() вместо echoheader().