Fügen Sie den Verwaltungsseiten JavaScript-Dateien hinzu


18

Wie füge ich mithilfe eines Moduls JavaScript / CSS-Dateien zu jeder Verwaltungsseite hinzu?

Antworten:


25

Mit einem Modul können Sie zwei Methoden anwenden:

Mit der ersten Methode können Sie die zusätzlichen JavaScript- (oder CSS-) Dateien zu Verwaltungsseiten hinzufügen, während Sie mit der zweiten Methode diese Dateien nur zu Seiten hinzufügen können, die Formulare enthalten.

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';
  }
}

Ersetzen Sie "mymodule" durch den Kurznamen Ihres Moduls. Ersetzen Sie "mymodule.js" und "mymodule.css" durch die tatsächlichen Namen der JavaScript- und CSS-Dateien.

system_init () enthält den folgenden Code, um Verwaltungsseiten bestimmte Dateien hinzuzufügen.

  $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 () ist die Funktion, die in der Dokumentation beschrieben wird als:

Ermitteln Sie, ob sich ein Pfad im administrativen Bereich der Site befindet.

Bedenken Sie, dass einige knotenbezogene Pfade, wie z. B. node/<nid>/edit, in den Verwaltungsabschnitt aufgenommen werden können, abhängig von der Einstellung in admin / appear.

Bildschirmfoto

Die Liste der Knotenpfade , die in den Verwaltungsseiten enthalten sein könnten, wird von node_admin_paths () zurückgegeben .

  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;

Wenn Sie aus irgendeinem Grund eine Seite mit einem Pfad wie node / * vermeiden müssen, müssen Sie spezifischen Code hinzufügen, um diese zu vermeiden, wenn Sie verwenden path_is_admin(). Bedenken Sie, dass jedes Modul die Seiten ändern kann, die als Teil der Verwaltungsseiten betrachtet werden.

In beiden Fällen würde die Alternative eine Bibliothek verwenden, wenn das Modul hooks_library () mit einem Code ähnlich dem folgenden implementiert .

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;
}

In diesem Fall würde die vorherige Implementierung von hook_form_alter()wie folgt aussehen.

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

Anstatt und aufzurufen drupal_add_js(), drupal_add_css()sollte der Code aufrufen drupal_add_library('mymodule', 'mymodule.library').

Der Pro der Verwendung hook_library()ist:

  • Abhängigkeiten zwischen Bibliotheken werden automatisch behandelt. Dies geschieht im Fall von system_library (), das zwei Bibliotheken mithilfe der folgenden Definitionen definiert.

      // 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'),
        ),
      );

    Das Aufrufen von drupal_add_library('system', 'drupal.collapse')misc / collapse.js und misc / form.js würde beide enthalten sein.

  • Die der Bibliothek zugeordneten CSS-Dateien werden automatisch zusammen mit den JavaScript-Dateien geladen.

  • Wann immer die Bibliothek mehr JavaScript- oder CSS-Dateien verwenden würde, würde sich der Code zum Einschließen der Bibliothek nicht ändern. es würde immer noch verwenden $form['#attached']['library'][] = array('mymodule', 'mymodule.library');, oder drupal_add_library('mymodule', 'mymodule.library').

 

Es ist nicht erforderlich, current_path () zu verwenden, wenn Sie arg () verwenden können . Wenn der Pfad für die aktuelle Seite admin / structure / block lautet, dann

  • arg(0) wird zurückkehren "admin"
  • arg(1) wird zurückkehren "structure"
  • arg(2) wird zurückkehren "block"

Aktualisieren

hook_init()wird nicht mehr von Drupal 8. Die Alternative für Drupal 8 wird verwendet , um hook_form_alter(), hook_page_attachments()oder hook_page_attachements_alter(). hook_page_build()und hook_page_alter()werden in Drupal 8 nicht mehr verwendet.
Was ich über die Verwendung einer JavaScript-Bibliothek gesagt habe, ist immer noch wahr, auch wenn empfohlen wird, #attachedeine Bibliothek (oder eine Javascript-Datei oder eine CSS-Datei) an eine Seite anzuhängen. Drupal 8 erlaubt nicht mehr nur das Anhängen von JavaScript- oder CSS-Dateien an eine Seite. Sie müssen immer eine Bibliothek anhängen, die eine Reihe von JavaScript- und CSS-Dateien enthält, die schließlich nur aus JavaScript- oder CSS-Dateien bestehen.


Was ist, wenn ich auf jeder Seite Drupal-Zugriff "user_access ('access administration pages')" hinzufügen möchte?
— Confiq

1
Ersetzen arg(0) == 'admin'durch user_access('access administration pages').
— kiamlaluno

4
Der richtige Weg, um zu überprüfen, ob die aktuelle Seite eine Admin-Seite ist, wäre die path_is_adminFunktion. Die Pfade einiger Verwaltungsseiten beginnen nicht mit "admin". Abhängig von der Konfiguration können die node/add/<content-type>Seiten beispielsweise Konfigurationsseiten sein.
— Pierre Buyle

Toller Beitrag, super gründlich, danke, dass du ihn wirklich behandelt hast, sehr hilfreich und geschätzt.
— DrCord

Pierre Buyle Kommentar ist sehr sehr nützlich!
— Moshe Shaham

3

Hier sind zwei Ansätze zum Hinzufügen von JS / CSS zu Seiten.

Sie können JavaScript und CSS direkt zur Vorlagendatei page.tpl.php hinzufügen. Da die Vorlagendateien PHP-Dateien sind, können Sie die URL mit arg () überprüfen und entsprechend anzeigen .

Alternativ und besser , da unabhängige es ist das Thema, erstellen Sie ein Modul , dass Geräte hook_init () und Anruf drupal_add_js () oder drupal_add_css () basierend auf current_path () .

So etwas wie der folgende Code würde funktionieren.

// 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

Ich habe ein Modul mit den hier beschriebenen Schritten erstellt: http://purewebmedia.biz/article/2014/04/23/adding-your-own-css-admin-theme

Kopierte den Modultext wie auf dieser Seite beschrieben:

    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));
  }
}

Die Administratorprüfung war jedoch fehlerhaft, als ich (als eine der Sachen) die Submit-Schaltflächen auf allen Seiten sowie das Node-Edit-Formular formatieren wollte. Da dieser Pfad zu Node / Edit und nicht zu Admin führt, habe ich mich stundenlang am Kopf gekratzt.

Also habe ich mir diese Version ausgedacht, um mein einfaches Modul namens admin_css zu erstellen.

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));
    }
}

Was sich von der Antwort hier unterscheidet, ist zu überprüfen, ob der Pfad im administrativen Teil der Site mit path_is_admin enthalten ist, anstatt arg zu verwenden . Die Verwendung von arg führte dazu, dass meine CSS-Datei nicht auf den Node-Edit- und anderen Seiten geladen wurde.


1

Es wird als schlechte Praxis angesehen, JS und CSS von hinzuzufügen hook_init(). Stattdessen verwenden Sie 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

Ich habe gerade eine andere Methode verwendet, die Front-End-Entwickler ansprechen könnte. Subtheme dein bevorzugtes Admin Theme und füge dann ein einfaches hinzu:

scripts[] = myscripts.js

zu Ihrer theme.info-Datei, die das Javascript enthält, das Sie für Ihre Admin-Seiten benötigen. Wenn Sie möchten, können Sie weitere Überschreibungen hinzufügen, da dies die Ressourcen Ihres bevorzugten Admin-Themas erbt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.