Уважаемые специалисты, есть вопрос
В template.tpl.php имеем в (моя_тема)_preprocess_page(&$variables):
$js = drupal_add_js(NULL, NULL, 'header');
if (arg(0) == 'admin' || arg(2) == 'edit' || arg(1) == 'add') {
unset($js['core']['misc/tabledrag.js']);
$variables['scripts'] = drupal_get_js('header', $js);
} else { unset($variables['scripts']); }
...И все равно грузит tabledrag.js в node/add и node/номер_ноды/edit.
Что я делаю не так?
Комментарии
никак. наборы скриптов и css хранятся в виде статических переменных внутри функции drupal_add_js. в массивах.
только патчить.
вообще радикально. а вдруг там че нужное?
хотя еще вариант. почитайте код функции drupal_get_js и вместо ее работы с массивом - наваляйте свою. параметризуемую
Ильич Рамирес, спасибо за ответ, но...
что значит "вдруг там че нужное?" Все нужное - только скрипты галереи (это простейший фотоблог), мне на НЕ add/edit/admin страницах ничего не нужно (а drupal.js и прочие jquery дают дополнительно 100к на каждой странице). А скрипт галереи я гружу сразу в page.tpl. Потому что устроить drupal_add_js не выходит - он автоматом добавляет core скрипты. После чего unset для отдельных скриптов опять таки не срабатывает (собственно в этом и был вопрос - почему не работает).
При этом unset($variables['scripts']) - работает, весь core js, включая drupal.js и всякие tabledrag благополучно похериваются.
А в коде drupal_get_js и drupal_add_js тупо не вижу где подгружается tabledrag и другие бесполезные вещи (drupal.js, jqery.js вижу). Казалось бы надо предположить, что tabledrag инклюдиться гденить в drupal.js, но даже unset($js['core']['misc/drupal.js']) всё равно не работает у меня (хотя такая строка есть в jquery_update.module и там по-видимому работает нормально...
Собственно идея была в том, чтобы на add/edit/admin страницах грузить только необходимый core js (a tabledrag = 38Kb и не нужен никому), а на остальных - только кастом скрипты... Не думал, что это так непрозрачно... Кстати попытка засунуть в имя_темы.info названия ненужных js файлов (это работает с css файлами) к успеху не приводит также..
Видимо я упускаю из виду что-то очевидное, но критичное...
Илья, не вводи в заблуждение - [ru-api=drupal_alter]drupal_alter()[/ru-api]
А предпросмотр комментариев так и некому починить...
Большая просьба, если не затруднит - чуть подробней: в чем проблема c unset и немного о drupal_alter - в api (и в русск и в англ) я ничего не понял
"This dispatch function hands off structured Drupal arrays to type-specific *_alter implementations. It ensures a consistent interface for all altering operations." - весьма радует, что она выдает структурированные массивы реализациям _alter, но как это решает проблему с unset($sripts['core']['misc/tabledrag.js'])?
p.s. мне следовало предупредить всех заранее, что я достаточно тупой
http://api.drupal.org/api/function/drupal_get_js/6
андрей, где ты там хуки видишь?
патчить необязательно. Навскидку сразу способ как это сделать без патча.
Функция которая парсит данные выдаваемые drupal_get_js на предмет вырезания от туда ненужного js кода.
Поставить эту функцуию можно в двух местах:
1. своя функция темизации page
где этой функцией убирать ненужные js библиотекки.
2. Для пятого друпала есть такой хитрый хук http://api.drupal.org/api/function/_phptemplate_variables/5 где применять туже функцию.
Для шестого друпала делается тоже самое функциями препроцессинга.
я уже это написал выше. читайте комменты. через тему можно. отказавшись от drupal_get_js и написав свою обработку ВМЕСТО нее
а если я захочу сжатие JS?))
Я не сразу тебя верно понял.
То есть, еcли я верно представил себе то что ты предлагаешь, фактически, переменная scripts будет формироваться дважды - первый раз в теме page или ядерном препроцессе и второй раз оверайдится функцией темы, где уже drupal_get_js будет подменен своей функцией.
Так ничего ж не меняется. Задача моего препроцеса/хука вызваться первым перед обфускатором. Что делается на раз два три.
Уважаемые Ильич Рамирес и Демимурыч, вы почему так увлеченно обсуждаете drupal_get_js?
Как видно из кода (или я что-то упустил снова?) drupal_get_js использует для формирования выходного хтмл-массива только аргументы, доставляемые drupal_add_js, никаких "левых" core файлов она не подключает, фактически она тупо приготавливает хтмл для последующей инъекции через $scripts.
Это должно означать, что их добавляет drupal_add_js (в коде которой это русским языком и написано - она добавляет drupal.js и jquery.js). Но почему она (вернее возвращаемый ей массив) не реагирует на unset? Видимо что-то происходит "по дороге" от drupal_add_js до drupal_get_js? Что и где? В api ни слова, а как это можно выследить? И почему в jquery_update.module (и в куче снипетов на drupal.org) аналогичная элементарная unset нормально и ожидаемо функционирует?
При этом совершенно ясно что можно отпарсить результат drupal_get_js как угодно, но вопрос не про это, а про почему не работает как должно... Дайте компетентное мнение, плиз
Demimurych спасибо за уточнение!
drupal_alter() это основной механизм постобработки всевозможных сущностей. В 6ке для подмены скриптов вероятнее всего нужно пользоваться hook_preprocess_page, ибо это аналог drupal_alter для слоя рендера. Написать свою функцию, как уже озвучили выше можно либо в template.php либо в совем модуле - как пример можно посмотреть jquery_update или css_gzip
И кстати, препроцессинг с компрессией может попасть в ядро 7ки http://drupal.org/node/101227
Андрей, спасибо. Хотя ясности не прибавилось, если по-честному... Собственно функция и есть в темплэйт.тпл, только unset($js['core']['misc/drupal.js']) в ней ничего не ансетит, в этом и заключалась проблема...
А где можно почерпнуть нормальной внятной документации об архитектуре и проч - согласитесь, понять из разрозненных тьюториалов и скудной api документации хотя бы variables preprocess flow в друпале невозможно: например, проследить судьбу $scripts (откуда взялась, какая функция что с ней сделала по дороге к page.tpl). Где например написано в какой момент ее начинает жевать javascript_aggregator, а где - про слой рендеринга, или хоть про какой-нибудь слой...?
Pro Drupal Development - скорее сборник примеров и инструкций на тему как можно сделать несколько простых вещей и не задавать лишних вопросов... Остальные книжки еще менее сексуальны в этом смысле.
На друпал.орг тоже в основном решают вопросы "Как сделать чтобы заработало", а не "Почему не работает".
Вот например типично http://drupal.org/node/368048 - ведь в русле нормальной логики drupal_get_form('user_proile_form') должна как достойный форм-билдер отрендерить форму как любой несумасшедший drupal_get_form('user_login_block') - в любом месте, взяв переменные контеста и более ничего не требуя... но неутомимым американским мужчинам только методом каторжного мозгоштурма удалось выяснить, что в этом конкретном случае нужно почему-то делать дополнительный инклюд... И так с каждой ерундой... Может быть есть какие-нибудь тайные манускрипты почитать? Утомляет на каждую мелочь тратить от нескольких часов до нескольких дней в поисках "какого хрена не работает" и "как это вообще сделать"... Заранее спасибо снова.
Документации на самом деле достаточно, а в подобных случаях нужнго смотреть последовательность вызова функций и делать сие лучше в отладчике - тогда и переменные можно посмотреть. Опять же стоит проверить, что переменная в препроцесс передается по ссылке...
ЗЫЖ что касается вызова формы - это ленность, автор вопроса даже не удосужился посмотреть в каком файле она лежит, иначе не возникло вопроса с инклюдом.
Используйте модуль JS Alter - великолепная штука! Он-то как раз и позволяет творить со скриптами что угодно. Без него я бы задохнулся в хаках.