Если необходимо подключить стили или скрипты к своей форме, как это сделать?
Первый подход — добавить необходимые стили и скрипты в тему оформления. В этом случае, если к примеру, идет речь о форме редактирования, которая отображается в шаблоне используемом только для админ-панели, вам придется заниматься кастомизацией ещё одной темы, помимо основной. А ваш модуль станет зависим от темы оформления.
Оптимально было бы подключить нужные файлы с помощью одного из хуков form API.
hook_form_alter
Прямое подключение
Можно добавить в хук form_alter вызов drupal_add_js(), drupal_add_css(). И это будет работать до тех пор, пока ваша форма успешно проходит валидацию. При ошибке в любом из #validate hook-ов, форма потеряет подключаемые файлы.
1 2 3 4 5 6 |
function MYMODULE_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'MYFORMID') { drupal_add_css(dirname(__FILE__) . '/css/form-mymorm.css'; } ... } |
#suffix
Атрибут формы suffix (и аналогично prefix) позволяет добавить произвольный HTML код. Никто не мешает вставить следующее:
1 2 3 4 5 6 7 |
$form['#suffix'] .= ' <style> /* ваши стили */ </style> <script> /* ваш скрипт */ </script>'; |
Хотя этот подход не испытывает проблем на этапе валидации, но явно не сочетается с парадигмой MVC.
#after_build
В этом свойстве формы можно указать функции вызываемые каждый раз после окончания сборки формы. Как раз в этот момент можно использовать drupal_add_css() и drupal_add_js(), чтобы корректно подключить нужные файлы.
1 2 3 4 5 6 7 8 9 10 11 |
function MYMODULE_form_alter(&$form, $form_state, $form_id) { if($form_id == 'myformid'){ $form['#after_build'][] = '_MYMODULE_after_build_myformid'; } } function _MYMODULE_after_build_myformid($form, &$form_state) { drupal_add_css(dirname(__FILE__) . '/css/form-mymorm.css'; // не забудьте вернуть $form return $form; } |
Все в этом варианте хорошо и правильно, но нам всего то лишь нужно подключить пару файлов, а не превращать работу с формой в бесконечный вызов хелперов. :)
#attached
Потому в Drupal 7 появляется специальный атрибут формы — #attached. Здесь вы можете указать необходимые JS и CSS файлы.
1 2 3 4 5 6 7 8 9 |
function MYMODULE_form_alter(&$form, $form_state, $form_id) { if($form_id == 'myformid'){ $form['#attached']['js'] = array( drupal_get_path('module', 'MYMODULE') . '/example.js' => array( 'type' => 'file', ), ); } } |
Ну или так:
1 2 3 4 5 6 |
$form['#attached']['css'] = array( drupal_get_path('module', 'MYMODULE') . '/example.css', ); $form['#attached']['js'] = array( drupal_get_path('module', 'MYMODULE') . '/example.js', ); |
Последние примеры я спер из документации drupal form API :).