2016-08-05 3 views
0

У меня возникла проблема с «#markup» в API формы.Работа с формами в drupal 8

В Drupal 7 мы можем использовать «#markup» элемент формы, который выглядит следующим образом:

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

и выше код будет печатать, когда форма будет оказывать «Здравствуйте, там!».

Сейчас в Drupal 8 Я использую код ниже, но ничего не печатает.

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

Итак, как реализовать эту функциональность в Drupal 8, которая уже работает в Drupal 7. Под тег сценария это может быть локальный скрипт или внешний скрипт .. Пожалуйста, помогите ...

Благодаря

ответ

0

#markup все еще работает в Drupal 8, но теперь она фильтруется перед выходом. Как указано в Render API overview:

#markup: Указывает, что массив содержит HTML-разметку непосредственно. Если разметка очень проста, например объяснение в теге абзаца, обычно предпочтительнее использовать #theme или #type, чтобы тема могла настроить разметку. Обратите внимание, что это значение передается через \Drupal\Component\Utility\Xss::filterAdmin(), который разделяет известные векторы XSS, разрешая разрешающий список тегов HTML, которые не являются векторами XSS. (I.e и не разрешены.) См. \Drupal\Component\Utility\Xss :: $ adminTags для списка тегов, которые будут разрешены. Если вашей разметке нужны какие-либо теги, которых нет в этом белом списке, вы можете реализовать файл темы и файл шаблона и/или библиотеку активов. Альтернативно, вы можете использовать ключ массива рендеринга #allowed_tags для изменения фильтров.

В качестве альтернативы вы можете использовать FormattableMarkup:

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

, хотя это не рекомендуется в этом случае.

+0

Спасибо, что работает !!! – rishabh318

2

В Drupal 8 использование «#markup» не является предлагаемым методом для прикрепления файлов javascript. Вы можете определить библиотеки в своем настраиваемом модуле или теме и прикрепить библиотеку к своей форме. Библиотека может содержать несколько js и (или) css-файлов.

Чтобы определить библиотеку в модуле:

Предположим, имя модуля «my_module», создать файл «my_module.libraries.yml» в папке модуля и указать JS и CSS файлы как этот

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

для того, чтобы прикрепить эту библиотеку в форму:

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

Затем очистить кеш. Файлы js и css будут загружены в том же порядке, что указаны в файле libraries.yml. Вы можете определить несколько библиотек в одном файле "my_module.libraries.yml".

Смежные вопросы