Добавить кнопку в WebForm [РЕШЕНО]

Главные вкладки

Аватар пользователя Shizuku Shizuku 5 июня 2013 в 6:19

Использую модуль WebForms, и мне нужно вставить после одного из полей свою кнопку, либо что-то такое, чтобы повесить на это сценарий для заполнения части полей из базы через JQuery. А не получается...

Попробовал схитрить, и создал блок в подвале с таким содержимым:

<div class="getData" id="gDat">
<form><input onclick="notEmpty()" type="button" value="Заполнить" />&nbsp;</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

Комментарии

Аватар пользователя Shizuku Shizuku 7 июня 2013 в 15:06

"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:
Используй hook_form_alter...

Я еще никогда не делал такого, не знаю как. Можно подробней, или где можно узнать?

Аватар пользователя serega111 serega111 8 июля 2013 в 6:31

"Shizuku" wrote:
Гугл помог только с шестым: http://api.drupal.ru/
На остальное надо его теребить глубже...
Возможно торрент поможет.

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, там ничего не изменилось.

Аватар пользователя Shizuku Shizuku 13 июля 2013 в 12:09
                                 «О, наконец настал тот час,
                                 Когда я здесь и вижу вас,
                                 Едва надеясь на взаимность
                                 Я в слепом неведеньи томлюсь
                                 Меня не слышат - это минус,
                                 Но нас не гонят - это плюс!»

                                          .:: No Comments ::.

Время разбора полётов. Мой старый код, опубликованный здесь, вставлял на страницу кнопку, позиционировал её относительно элементов формы Webform (это самое слабое место), и вешал обработчик для выполнения JQuery-запросов. Решение достаточно спорное, плюс работает не во всех браузерах. Поэтому было решено отбросить костыль и решить проблему по-друпаловски, благо что тут много говорят о таинственном Form API...

К сожалению, несмотря на обилие всяких примеров, в том числе русскоязычных, все они достаточно громоздкие и малопонятные для новичка в хуках. А ведь знания нужного хука недостаточно, всё еще надо оформить (о, ужас!) в виде собственного модуля! Поэтому я потратил кучу часов, просматривая варианты по запросу "Drupal Very Simple Module" и еще больше по "How To Achieve Your First Orgasm"... Шучу! Biggrin

В итоге, я не только выбросил свой старый код, но и отказался от идеи кнопки с обработчиком формы вообще. Зачем кнопка, когда хук позволяет повесить обработчик прямо на поле ввода?!

Модуль получился реально очень простой: всего два файла и пара строчек кода. Но я добавил кучу комментариев по отладке, чтобы другие набили меньше шишек на этом пути.

Файл № 1:
/sites/all/modules/webform_addition/webform_addition.info

name = Webform Addition
description = Module for theming forms Webforms
package = Webform
core = 7.x
files[] = webform_addition.module

Файл № 2:
/sites/all/modules/webform_addition/webform_addition.module

<?php
/**
 * @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 и на этом форуме!