Использую модуль WebForms, и мне нужно вставить после одного из полей свою кнопку, либо что-то такое, чтобы повесить на это сценарий для заполнения части полей из базы через JQuery. А не получается...
Попробовал схитрить, и создал блок в подвале с таким содержимым:
<form><input onclick="notEmpty()" type="button" value="Заполнить" /> </form>
</div>
<script type="text/javascript">
(function ($) {
$("#edit-submitted-fio-").css("background-color","ButtonFace");
$("#edit-submitted-ul-").css("background-color","ButtonFace");
$("#edit-submitted-dom-").css("background-color","ButtonFace");
$("#edit-submitted-kv-").css("background-color","ButtonFace");
if (document.all("webform-client-form-13")==null)
{
$(".getData").css("display","none");
}
else {
var fio_pos=$("#edit-submitted-fio-").offset();
var fio_w=$('#edit-submitted-fio-').width()+30;
$(".getData").offset(function(i,val){
return {top:fio_pos.top, left:fio_pos.left+fio_w};
});
}
}) (jQuery);
</script>
Вставляется кнопка, далее смотрю а включена ли вообще нужная мне форма, и если это так, то показываю кнопку и пытаюсь спозиционировать её из подвала на более привлекательное место. К сожалению, такой финт ушами не во всяком браузере работает корректно.
Что можно сделать? Кто-нибудь сталкивался с подобным?
11.07 - Переписал код на системный JQuery
Комментарии
Используй hook_form_alter через него вставляй '#type' => 'submit' c '#ajax'в нужное место.
Я еще никогда не делал такого, не знаю как. Можно подробней, или где можно узнать?
modules/simpletest/tests/ajax_forms_test.module
function ajax_forms_test_ajax_commands_form($form, &$form_state) { ...
Не понимаю, где это нужно писать?
> Можно подробней, или где можно узнать?
http://drupalguide.ru/articles/pishem-modul-form-api-v-drupal-7-uroven-2...
http://azbukaweb.ru/creating-modules-a-tutorial-drupal-7x
видел ваши сообщения в другой теме. вот первые две ссылки из гугла, не на английском.
hook_form_alter можно посмотреть в api друпала 6, там ничего не изменилось.
Когда я здесь и вижу вас,
Едва надеясь на взаимность
Я в слепом неведеньи томлюсь
Меня не слышат - это минус,
Но нас не гонят - это плюс!»
.:: No Comments ::.
Время разбора полётов. Мой старый код, опубликованный здесь, вставлял на страницу кнопку, позиционировал её относительно элементов формы Webform (это самое слабое место), и вешал обработчик для выполнения JQuery-запросов. Решение достаточно спорное, плюс работает не во всех браузерах. Поэтому было решено отбросить костыль и решить проблему по-друпаловски, благо что тут много говорят о таинственном Form API...
К сожалению, несмотря на обилие всяких примеров, в том числе русскоязычных, все они достаточно громоздкие и малопонятные для новичка в хуках. А ведь знания нужного хука недостаточно, всё еще надо оформить (о, ужас!) в виде собственного модуля! Поэтому я потратил кучу часов, просматривая варианты по запросу "Drupal Very Simple Module" и еще больше по "How To Achieve Your First Orgasm"... Шучу!
В итоге, я не только выбросил свой старый код, но и отказался от идеи кнопки с обработчиком формы вообще. Зачем кнопка, когда хук позволяет повесить обработчик прямо на поле ввода?!
Модуль получился реально очень простой: всего два файла и пара строчек кода. Но я добавил кучу комментариев по отладке, чтобы другие набили меньше шишек на этом пути.
Файл № 1:
/sites/all/modules/webform_addition/webform_addition.info
description = Module for theming forms Webforms
package = Webform
core = 7.x
files[] = webform_addition.module
Файл № 2:
/sites/all/modules/webform_addition/webform_addition.module
/**
* @file
*
*/
/**
* Implements hook_init().
*/
/**
*Проверка работы модуля
*
*function webform_addition_init() {
* drupal_set_message(t('This Work...'), 'status');
*}
**/
function webform_addition_form_alter( &$form, &$form_state,$form_id ){
//Посмотреть на структуру формы
//dpm($form);
if ($form_id == 'webform_client_form_13') {
//Проверка работы хука и условия
// drupal_set_message(t('WebForm 13 active...'), 'status');
//Получить сведения о коспоненте
// $a_component = $form['submitted']['fio_'];
// dpm($a_component);
//Вот так можно изменить метку поля
// $form['submitted']['fio_']['#title'] = 'A spurious text title';
//Назначить обработчик для поля ls_ (Лицевой счет)
$form['submitted']['ls_']['#attributes']=array('onchange'=>'notEmpty()');
//Вот так можно добавить кнопку
// $form['Clear'] = array('#type' => 'button', '#value' => t('Clear'), '#weight' => 0);
// dpm($form);
}
}
Этот пример настроен для моей формы "webform_client_form_13" (обязательно знаки подчеркивания - не дефисы!), полей "fio_" и "ls_". Для работы с вашей формой нужно изменить $form_id и указать свои поля. Для работы функции dpm() необходимо установить модуль Devel.
Альтернативный вариант - для тех, кто хочет еще проще. У Webform нет компонента "Button", но есть компонент "Markup" или "Разметка". Вот в это поле можно добавить любой свой JavaSript или PHP обработчик. Я проверил - работает! Более того, добавленную таким образом кнопку можно легко перетянуть в нужное место в редакторе Webform. А вот пример кнопки из моего модуля создаёт кнопку под полями, и чтобы поместить её куда-то выше - надо еще немало посидеть над Form API и на этом форуме!