2016-08-05 70 views
0

我正在面對表單API中的「#markup」問題。在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 7中工作的Drupal 8中實現這個功能。 在script標籤也可以是本地腳本或外部腳本.. 請幫助...

感謝

回答

0

#markup仍然工作在Drupal 8,但現在它的輸出進行過濾。因爲它是在Render API overview指出:

#markup:指定所述陣列直接提供HTML標記。除非標記非常簡單,例如段落標記中的解釋,否則通常最好使用#主題或#類型,以便主題可以自定義標記。請注意,該值是通過\Drupal\Component\Utility\Xss::filterAdmin()傳遞的,它剝離已知的XSS向量,同時允許不是XSS向量的HTML標記的允許列表。 (即,不允許)。請參閱\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」文件中定義多個庫。