Добавить файлы JavaScript на административные страницы


18

Как добавить файлы JavaScript / CSS на каждой странице администрирования, используя модуль?

Ответы:


25

Используя модуль, вы можете использовать два метода:

Первый метод позволит вам добавить дополнительные файлы JavaScript (или CSS) на любые страницы администрирования, тогда как второй метод позволит вам добавлять эти файлы только на страницы, содержащие формы.

function mymodule_init() {
  if (arg(0) == 'admin') {
    $path = drupal_get_path('module', 'mymodule');
    drupal_add_js($path . '/mymodule.js');
    drupal_add_css($path . '/mymodule.css');
  }
}
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if (arg(0) == 'admin') {
    $path = drupal_get_path('module', 'mymodule');  
    $form['#attached']['css'][] = $path . '/mymodule.css';
    $form['#attached']['js'][] = $path . '/mymodule.js';
  }
}

Замените «mymodule» на короткое имя вашего модуля; замените «mymodule.js» и «mymodule.css» фактическими именами файлов JavaScript и CSS.

system_init () содержит следующий код для добавления определенных файлов на административные страницы.

  $path = drupal_get_path('module', 'system');
  // Add the CSS for this module. These aren't in system.info, because they
  // need to be in the CSS_SYSTEM group rather than the CSS_DEFAULT group.
  drupal_add_css($path . '/system.base.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));

  // Add the system.admin.css file to the administrative pages.
  if (path_is_admin(current_path())) {
    drupal_add_css($path . '/system.admin.css', array('group' => CSS_SYSTEM));
  }

  drupal_add_css($path . '/system.menus.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
  drupal_add_css($path . '/system.messages.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
  drupal_add_css($path . '/system.theme.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));

path_is_admin () - это функция, которая в документации описывается так:

Определите, находится ли путь в административном разделе сайта.

Учтите, что некоторые пути, связанные с узлами, например node/<nid>/edit, могут быть включены в административный раздел, в зависимости от параметра, найденного в admin / Внешний вид.

Скриншот

Список путей узлов, которые могут быть включены в административные страницы, возвращается из node_admin_paths () .

  if (variable_get('node_admin_theme')) {
    $paths = array(
      'node/*/edit' => TRUE, 
      'node/*/delete' => TRUE, 
      'node/*/revisions' => TRUE, 
      'node/*/revisions/*/revert' => TRUE, 
      'node/*/revisions/*/delete' => TRUE, 
      'node/add' => TRUE, 
      'node/add/*' => TRUE,
    );
    return $paths;

Если по какой-либо причине вам нужно избегать какой-либо страницы с путем, например, узла / *, вам нужно добавить специальный код, чтобы избежать их, если вы используете path_is_admin(). Учтите, что любой модуль может изменить страницы, которые считаются частью административных страниц.

В обоих случаях альтернативой будет использование библиотеки, если модуль реализует hooks_library () с кодом, подобным следующему.

function mymodule_library() {
  $path = drupal_get_path('module', 'mymodule');

  $libraries['mymodule.library'] = array(
    'title' => 'MyModule Library', 
    'version' => '1.0', 
    'js' => array(
      $path . '/mymodule.js' => array(),
    ), 
    'css' => array(
      $path . '/mymodule.css' => array(
        'type' => 'file', 
        'media' => 'screen',
      ),
    ),
  );

  return $libraries;
}

В этом случае предыдущая реализация hook_form_alter()станет следующей.

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if (arg(0) == 'admin') {
    $form['#attached']['library'][] = array('mymodule', 'mymodule.library');
  }
}

Вместо вызова drupal_add_js()и drupal_add_css()код должен вызывать drupal_add_library('mymodule', 'mymodule.library').

Преимущество использования hook_library():

  • Зависимости между библиотеками обрабатываются автоматически. Это то, что происходит в случае system_library (), которая определяет две библиотеки, используя следующие определения.

      // Drupal's form library.
      $libraries['drupal.form'] = array(
        'title' => 'Drupal form library', 
        'version' => VERSION, 
        'js' => array(
          'misc/form.js' => array(
            'group' => JS_LIBRARY,
            'weight' => 1,
          ),
        ),
      );
    
      // Drupal's collapsible fieldset.
      $libraries['drupal.collapse'] = array(
        'title' => 'Drupal collapsible fieldset', 
        'version' => VERSION, 
        'js' => array(
          'misc/collapse.js' => array('group' => JS_DEFAULT),
        ), 
        'dependencies' => array(
          // collapse.js relies on drupalGetSummary in form.js
          array('system', 'drupal.form'),
        ),
      );

    Вызов drupal_add_library('system', 'drupal.collapse'), misc / collapse.js и misc / form.js будут включены.

  • Файлы CSS, связанные с библиотекой, будут автоматически загружаться вместе с файлами JavaScript.

  • Всякий раз, когда библиотека будет использовать больше файлов JavaScript или CSS, код для включения библиотеки не изменится; это все еще будет использовать $form['#attached']['library'][] = array('mymodule', 'mymodule.library');, или drupal_add_library('mymodule', 'mymodule.library').

 

Нет необходимости использовать current_path (), когда вы можете использовать arg () . Если путь для текущей страницы - admin / structure / block, то

  • arg(0) вернется "admin"
  • arg(1) вернется "structure"
  • arg(2) вернется "block"

Обновить

hook_init()не используется больше от Drupal 8. Альтернатива для Drupal 8 использует hook_form_alter(), hook_page_attachments()или hook_page_attachements_alter(). hook_page_build()и hook_page_alter()больше не используются в Drupal 8.
То, что я сказал об использовании библиотеки JavaScript, все еще верно, даже если ее предлагается использовать #attachedдля присоединения библиотеки (или файла Javascript, или файла CSS) к странице. Drupal 8 больше не позволяет прикреплять к странице только файлы JavaScript или CSS; вам нужно всегда прикреплять библиотеку, которая представляет собой набор файлов JavaScript и CSS, в конечном итоге сделанных из файлов JavaScript или CSS.


Что если я хочу добавить на каждую страницу, если я хочу, чтобы drupal имел доступ "user_access ('access admin pages')"?
Confiq

1
Заменить arg(0) == 'admin'на user_access('access administration pages').
kiamlaluno

4
Правильный способ проверить, является ли текущая страница страницей администратора, была бы path_is_adminфункцией. Пути некоторых страниц администрирования не начинаются с «admin». Например, в зависимости от конфигурации, node/add/<content-type>страницы могут быть конфигурационными.
Пьер Байль

Потрясающий пост, очень тщательный, спасибо за то, что действительно осветил этот, очень полезный и ценный.
DrCord

Комментарий Пьера Байля очень и очень полезен!
Моше Шахам

3

Вот два подхода к добавлению JS / CSS на страницы.

Вы можете добавить JavaScript и CSS непосредственно в файл шаблона page.tpl.php, так как файлы шаблона являются файлами PHP, вы можете проверить URL с помощью arg () и представить соответственно.

В качестве альтернативы, и лучше, поскольку он не зависит от темы, создайте модуль, который реализует hook_init () и вызовите drupal_add_js () или drupal_add_css () на основе current_path () .

Что-то вроде следующего кода будет работать.

// Runs on every page load.
function mymodule_init() {
  // Check if current path is under "admin"
  if (substr(current_path(), 0, 5) == 'admin') {
    drupal_add_css('path/to/my/css');
    drupal_add_js('path/to/my/js');
  }
}

1

Я создал модуль, используя шаги, описанные здесь: http://purewebmedia.biz/article/2014/04/23/adding-your-own-css-admin-theme

Скопировал текст модуля, как описано на этой странице:

    function mymodule_preprocess_html(&$variables) {
// Add conditional stylesheets for admin pages on admin theme.
  if (arg(0)=="admin") {
    // reference your current admin theme  
    $theme_path = drupal_get_path('theme', 'commerce_kickstart_admin');
    // reference your own stylesheet    
    drupal_add_css(drupal_get_path('module', 'mymodule') . '/css/mymodule.css', array('weight' => CSS_THEME));
  }
}

Однако проверка администратора была ошибочной, когда я (как одна из вещей) хотел стилизовать кнопки отправки на всех страницах, а также форму редактирования узла. Поскольку этот путь ведет к узлу / редактированию, а не администратору, проверка заставила меня часами чесать голову.

Поэтому я придумал эту версию, чтобы сделать мой простой модуль с именем admin_css.

admin_css.info

name = admin_css
description = Custom css alterations for editor interface
core = 7.x
version = 7.x-1.01

admin_css.module

function admin_css_preprocess_html(&$variables) {
    if (path_is_admin) {
        $theme_path = drupal_get_path('theme', 'seven');
        drupal_add_css(drupal_get_path('module', 'admin_css') . '/css/admin_css.css', array('weight' => 0));
    }
}

Отличие от ответа здесь состоит в том, чтобы проверить, находится ли путь в административной части сайта с помощью path_is_admin вместо использования arg . Использование arg привело к тому, что мой css-файл не загружался на узле edit и других страницах.


1

Добавление JS и CSS считается плохой практикой hook_init(). Вместо этого вы будете использовать hook_page_build():

/**
 * Implements hook_page_build().
 */
function MYMODULE_page_build(&$page) {

  if (path_is_admin(current_path())) {

    drupal_add_js(drupal_get_path('module', 'MYMODULE') . '/scripts/magic.js');
  }
}

1

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

scripts[] = myscripts.js

в ваш файл theme.info, содержащий необходимый вам javascript для ваших страниц администратора. Если вы хотите, вы можете добавить больше переопределений, так как это унаследует ресурсы вашей любимой темы администратора.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.