2016-08-05 30 views
0

Ich habe ein Problem mit "#markup" in Formular-API.Arbeiten mit Formularen in Drupal 8

In Drupal 7 können wir "#markup" Formularelement verwendet werden, die wie folgt aussehen:

<?php 
$form['test'] = array(
    '#type' => 'markup', 
    '#markup' => '<div><script src="http://localhost/drupal7/sites/all/libraries/test.js"></script></div>', 
); 
?> 
//Here is my custom test.js 
(function($) { 
    Drupal.behaviors.test = { 
     attach: function(context, settings) { 
      console.log('testttt'); 
      document.write('*Hello, there!*'); 
     } 
    }; 
})(jQuery); 

und über Code gedruckt wird, wenn das Formular übertragen wird "Hallo, da!".

Jetzt in Drupal 8 verwende ich unter Code, aber es druckt nichts.

<?php 
$form['test'] = array(
     '#markup' => '<div><script src="http://localhost/project8/sites/all/libraries/test.js"></script></div>', 
    ); 
?> 

Also wie kann diese Funktionalität in Drupal 8 implementiert werden, die bereits in Drupal 7 funktioniert. Unter Script-Tag kann es lokale Skript oder externes Skript sein .. Bitte helfen ...

Dank

Antwort

0

#markup arbeitet immer noch in Drupal 8, aber jetzt ist es vor der Ausgabe gefiltert.

#markup: Wie es in Render API overview angegeben Legt fest, dass das Array Markup HTML liefert direkt. Wenn das Markup nicht sehr einfach ist, z. B. eine Erklärung in einem Absatz-Tag, ist es normalerweise besser, stattdessen #theme oder #type zu verwenden, damit das Design das Markup anpassen kann. Beachten Sie, dass der Wert durch \Drupal\Component\Utility\Xss::filterAdmin() übergeben wird, der bekannte XSS-Vektoren entfernt, während eine permissive Liste von HTML-Tags zulässig ist, die keine XSS-Vektoren sind. (I.e, und sind nicht erlaubt.) Siehe \Drupal\Component\Utility\Xss :: $ adminTags für die Liste der Tags, die erlaubt werden. Wenn Ihr Markup eines der Tags benötigt, die nicht in dieser Whitelist enthalten sind, können Sie eine Theme-Hook- und Template-Datei und/oder eine Asset-Bibliothek implementieren. Alternativ können Sie den Render-Array-Schlüssel #allowed_tags verwenden, um zu ändern, welche Tags gefiltert werden.

Als Alternative können Sie FormattableMarkup verwenden:

'#markup' => new FormattableMarkup('<div><script src="http://localhost/project8/sites/all/libraries/test.js"></script></div>', []), 

obwohl es in diesem Fall nicht zu empfehlen ist.

+0

Danke Es funktioniert !!! – rishabh318

2

In Drupal 8 ist die Verwendung von "#markup" nicht die vorgeschlagene Methode, um Javascript-Dateien anzuhängen. Sie können Bibliotheken in Ihrem benutzerdefinierten Modul oder Design definieren und die Bibliothek an Ihr Formular anhängen. Die Bibliothek kann mehrere js- und (oder) CSS-Dateien enthalten.

Um eine Bibliothek in Ihrem Modul zu definieren:

Angenommen, Ihr Modulname „my_module“ ist, eine Datei „my_module.libraries.yml“ in Ihrem Modulordner erstellen und die js und CSS-Dateien angeben wie diese

form-script: 
    version: 1.x 
    css: 
    theme: 
     css/form.css: {} 
    js: 
    js/form.js: {} 
    js/form-ajax.js: {} 
    dependencies: 
    - core/jquery 

um diese Bibliothek zu Ihrem Formular anhängen:

$form['#attached']['library'][] = 'my_module/form-script'; 

Löschen Sie dann den Cache. Die Dateien js und css werden in derselben Reihenfolge geladen wie in der Datei libraries.yml. Sie können mehrere Bibliotheken in derselben Datei "my_module.libraries.yml" definieren.