Вставьте код сразу после тега body, используя функции темы - PullRequest
2 голосов
/ 16 апреля 2011

Я пытаюсь добавить фрагмент кода в начале каждой страницы на сайте Drupal. Поскольку у меня более одного page шаблона, я хочу сделать это программно ... но у меня ничего не получается.

Я все еще новичок, и, хотя я понимаю суть хуков, функций тем и тому подобного, я просто не могу придумать, как этого добиться.

Пока что я переопределил theme_preprocess_page(&$vars), чтобы добавить необходимые css и js:

function mytheme_preprocess_page(&$vars) {
    if(condition) {
        drupal_add_js(drupal_get_path('module', 'mymodule').'/js/modal.js');
    }
}

Как теперь я могу добавить html-код на каждую страницу drupal, желательно сразу после открывающего тега body или в любом другом начальном разделе, с помощью функции в файле template.php?

Спасибо

Ответы [ 6 ]

3 голосов
/ 16 апреля 2011

В вашей функции предварительной обработки любой набор переменных будет доступен в вашем файле page.tpl.php.

function mytheme_preprocess_page(&$vars) {
  if (condition) {
    $vars['foo'] = '<div id="bar">TEST</div>';
  }
}

затем, в ваших шаблонах страниц:

<body>
  <?php print !empty($foo) ? $foo : ''; ?>
...
1 голос
/ 23 марта 2015

Посмотрел https://www.drupal.org/project/google_tag. Вот как они это сделали:

/**
 * Implements hook_page_alter().
 *
 * Adds a post_render callback
 */
function MYMODULE_page_alter(&$page) {
  $page['#post_render'][] = 'MYMODULE_CALLBACK';
}

/**
 * Implements callback_post_render().
 *
 * Inserts JavaScript snippet immediately following the opening body tag.
 */
function MYMODULE_CALLBACK(&$children, $elements) {
  $script = '<script type="text/javascript">console.log(\'hello world\');</script>';
  // Insert snippet after the opening body tag.
  $children = preg_replace('@<body[^>]*>@', '$0' . $script, $children, 1);
  return $children;
}
1 голос
/ 29 октября 2012

Это должно удерживать вас от необходимости изменять любой код в ваших шаблонах:

function MY_MODULE_page_build(&$page)
{
    $page['page_bottom']['my-markup'] = array('#markup' => '<div>My Markup Here</div>');
}
0 голосов
/ 04 июня 2015

Другой способ сделать это - использовать нативные методы drupal drupal_add_js и drupal_get_js.

// сначала добавьте свой JS с настраиваемой «областью действия» (перед фазой процесса)

<?php
drupal_add_js($tag_js, array(
  'type' => 'inline',
  'group' => JS_GROUP_TAGS,
  'every_page' => TRUE,
  'scope' => 'body_start',
  'weight' => 1,
)); 
?>

// безобразный способ: добавьте drupal_get_js непосредственно в html.tpl.php (но для тестирования это полезно):

<body>
<?php print drupal_get_js('body_start'); ?>
...
</body>

// Более чистый способ: использовать промежуточную переменную в методе процесса // Точно так же, как template_process_html, в theme.inc

<?php
function MYMODULEORTHEME_process_html(&$variables){
  $variables['js_body_start'] .= drupal_get_js('body_start');
}
?>

Наслаждайтесь:)

0 голосов
/ 24 марта 2015

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

function THEMENAME_preprocess_page(&$variables) {
   if (condition) {
      drupal_add_js(drupal_get_path('theme', 'THEMENAME') . '/PATH/TO/FILE.js', array('scope' => 'footer'));
   }
}

Это приведет к печати непосредственно перед закрывающим тегом тела через переменную $page_bottom в шаблоне html.tpl.php.

0 голосов
/ 08 мая 2011

Мой подход, наконец, переопределил первый визуализированный блок на странице, в моем случае Language Switcher. Поскольку я уже переопределил его, чтобы настроить его, это было не так уж сложно, но в любом случае это ужасный способ добиться этого.

<?php
function mytheme_languageswitcher($links) {
    // inserting this here like a virus in a dna strip
    if(condition) {
        drupal_add_js(drupal_get_path('module', 'mymodule').'/js/modal.js');
    }
    // the *real* code for the language switcher override
}
?>

Поскольку переключатель языка отображается на каждой странице, он работает. В тот день, когда по какой-либо причине перестанет отображаться переключатель языка, это решение не будет выполнено.

...