Как правильно вставить в определенное место страницы (не в область <head>) инлайновый js

Главные вкладки

Аватар пользователя sikwel sikwel 7 апреля 2011 в 13:51

Здравствуйте, умные люди.

Растолкуйте пожалуйста верстальщику, как же всетаки правильно вставить в тело страницы кусок инлайнового яваскрипта, в моем случае кусок кода с вызовом jquery-функций.
У Вандюка в "Pro Drupal development" есть отдельная глава по использованию джейквери в друпале. Здесь тоже вроде бы сказано, что если выводить этой функцией кусок js-кода, друпал сам его обернет в теги и подключит джейквери автоматом на этой странице.

Но у него там в примерах вставка инлайнового яваскрипта происходит в нодах, через админку, через php-фильтр посредством функции drupal_add_js() с параметром 'inline':

<?php
drupal_add_js
(
'$(document).ready(function() {...});',
'inline'
);
?>

У меня это тоже срабатывает, в этом случае инлайновый яваскрипт помещается в области <head>
Но мне необходимо, чтобы этот яваскрипт располагался именно в теле страницы, к примеру до закрывающего тега </body>
Пробовал выводить этой же функцией в page.tpl.php, но результат нулевой. Ни код не выводится, ни друпал джейквери не подключает.

На всякий случай проверил, подключает ли друпал джейквери если мой код запихнуть в файл и подключить его через .info-файл, все работает.
Варианты с ручным подключением jQuery и ручной вставкой скрипта в нужное место естественно сразу отметается.

Комментарии

Аватар пользователя Ch Ch 7 апреля 2011 в 14:28

У drupal_add_js есть не обязательный параметр $scope. В page.tpl.php должна присутствовать переменная $closure.

Аватар пользователя sikwel sikwel 7 апреля 2011 в 15:42

Что-то всеравно не вкурю:)

У меня в файле page.tpl.php перед закрывающим </body> следующий код:

<?php print $closure ?>
<?php
drupal_add_js
($scope 'header',
'$(document).ready(function() {моя_jQuery_конструкция});',
'inline'
);
?>

даже с явным указанием параметра $scope всеравно на страницу ничего не выводится

Аватар пользователя sikwel sikwel 7 апреля 2011 в 15:50

Или надо так?

<?php print $closure ?>
<?php
drupal_add_js('header',
'$(document).ready(function() {моя_jQuery_конструкция});',
'inline'
);
?>

так тоже не работает Smile

Аватар пользователя Ch Ch 7 апреля 2011 в 17:54

Не выполняется, потому что переменная $scripts уже сформирована к тому времени когда обрабатывается шаблон. Она собственно для этого шаблона и формируется. Добавляйте в template_preprocess_page. Если нужно дабавить код на каждой странице, то вставьте его просто в шаблон page.tpl.php перед без всяких функций.
Либо создайте дополнительную переменную с вашим js кодом в tempate_preprocess_page. Либо измените там же переменную $closure.
Мульён вариантов в общем ...

Аватар пользователя sikwel sikwel 7 апреля 2011 в 18:05

вроде как мне этот мульен вариантов не подходит;) мне нужно чтобы друпал "увидел" что я конструкцию на джейквери подключаю этой функцией, и подключил интегрированную джейквери на именно одну эту страницу Wink

Аватар пользователя sikwel sikwel 7 апреля 2011 в 18:33

В общем вот что я придумал, т.к. в page.tpl.php у нас эта функция уже известно что работать не будет, мы извратимся, и зарегистрируем в .info-файле региончик. Сбросим кеш и пойдем в настройки блоков, создадим блок с пустым заголовком, не забудем включить модуль PHP filter, и зафигачим вызов функции добавления моей jquery-конструкции, причем если мы хотим зафигачить наш инлайновый js непосредственно перед закрывающим тегом body, добавляем после параметра 'inline' (!именно после а не до, если до - то не работает), параметр 'footer'.

<?php
drupal_add_js('$(document).ready(function() {моя_jQuery_конструкция});',
'inline', 'footer' );
?>

Я не понял только одно, на странице документации по функции drupal_add_js, про этот параметр сказано не очень то и много:

$scope (optional) The location in which you want to place the script. Possible values are 'header' and 'footer' by default. If your theme implements different locations, however, you can also use these.

т.е.

$scope (опционально) Локация в которую вы хотите положить ваш скрипт. Возможные значения - 'header' и 'footer' по-умолчанию. Если ваша тема содержит другие локации, вы тоже можете их указывать

В переводе я использовал слово локация, потому что имеются ввиду не регионы, т.к. у меня вообще такие регионы в теме не зарегистрированы, а те что зарегистрированы и выведены, если их названия в параметр вставлять, то ничего не работает. Хотя друпал функцию видит и подключает файл с джейкверей.

Кто бы мне объяснил что именно под локациями имеется ввиду и как их создавать если это конечно возможно?) Ведь возникают очень часто ситуации когда инлайновый яваскрипт нужно вставлять не в область head или сразу перед закрывающим body, а в других блоках в теле страницы.

Очень буду признателен, если кто-нибудь мне это объяснит.

Аватар пользователя Ch Ch 7 апреля 2011 в 19:00

header — скрипт будет добавлен в переменную $scripts, которая в шаблоне находится внутри <head/>
footer — скрипт будет добавлен в переменную $closure, которую обычно добавляют перед </body>

P.S. то что вы придумали, действительно изврат полный.
Вставляйте свой JS код в page.tpl.php как есть, и не выдумывайте ничего.

Аватар пользователя sikwel sikwel 7 апреля 2011 в 19:04

Ну дык я ж предупредил Wink

Теперь понятно, переменная $closure у меня как раз перед закрывающим </body>
А как мне сделать так, чтобы я смог свою какую-то зарезервированную переменную, пихать в любое место шаблона страницы, и там бы у меня выводился инлайновый яваскрипт?

Только с условием что друпал "увидит" мой код и подключит автоматом джейквери свою интегрированную, именно на той странице где я код вывел функцией

Аватар пользователя sikwel sikwel 7 апреля 2011 в 19:16

"Ch" wrote:
Вставляйте свой JS код в page.tpl.php как есть, и не выдумывайте ничего.

Как так как есть?) я же вначале написал в самом, что у меня не просто чистый js, а джейквери-конструкция, и мне нужна библиотека, и по-правилам, нужно выводить инлайновый js специальной функцией друпала, чтобы друпал подключил джейквери на страницу (http://drupal.org/node/171213 When JavaScript is added to a page through Drupal, jQuery is automatically added to the page.), он ведь не подключит ее, если просто вручную вставить код Wink

Аватар пользователя Ch Ch 7 апреля 2011 в 19:49

"sikwel" wrote:
А как мне сделать так, чтобы я смог свою какую-то зарезервированную переменную, пихать в любое место шаблона страницы

function mytheme_preprocess_page(&$vars) {
  $vars['newVariable'] = 'Скрипт';
}

"sikwel" wrote:
он ведь не подключит ее, если просто вручную вставить код

Откройте для интереса исходный код страницы и посмотрите подключена jQuery или нет.

Аватар пользователя sikwel sikwel 8 апреля 2011 в 10:26

"Ch" wrote:
Откройте для интереса исходный код страницы и посмотрите подключена jQuery или нет.

ну я ж подписался как верстальщик)) естественно я не пустыми словами тут разбрасываюсь когда говорю что джейквери не подключается, естественно я пробовал)) мало того даже ссылку привел где это сказано в первоисточнике)
"Ch" wrote:

<?phpfunction mytheme_preprocess_page(&$vars) {
  $vars['newVariable'] = 'Скрипт';
}?>

а друпал подключит в этом случае джейквери?:) Надо попробовать

Аватар пользователя sikwel sikwel 11 апреля 2011 в 11:36

Что-то я ступил, конечно же друпал в этом случае нифига джейквери не подключит, вывод яваскрипта в переменной посредством фукнции в template.php подобен простой вставке в page.tpl инлайнового кода. Естественно друпал в этом случае библиотеку не подключает.

Вобщем другого, кроме как моего "извращенного" способа вставлять инлайновые jQuery конструкции в область <header>...</header> в место определенное переменной $head и в место до закрывающего тега </body> определенное переменной $closure, я не нашел.

Хотелось бы понять, каким образом и можно ли вообще создавать свои переменные типа $head и $closure в которые можно было бы выводить параметром $scope функции drupal_add_js свой инлайновые jQuery-конструкции, для того чтобы друпал сам подключал библиотеку.

Насчет вызова функции drupal_add_js, я вроде бы понял, вызываем ее в шаблоне более "низкого уровня", т.к. прямо в page.tpl она работать не будет. Но это и хорошо, всеравно ведь все это нужно для вывода инлайново кода на только определенных "страницах" или "разделах" сайта. т.е. в определенных нодах или типах нод.

Вобщем вопрос все еще открыт, если кто предложит варианты или объяснит что кчему, буду очень признателен.