Сложные вопросы в вебформах

Аватар пользователя GodZiLA GodZiLA 21 ноября 2016 в 23:12

Всем привет!
Вопрос такой.
Есть ли возможность сделать с помощью вебформ структуру радиобатонов/чекбоксов:
*ответ номер 1
* ответ номер 2
* ответ от ___ до ___ (где ___ - это текстовое поле)

Есть модуль, который позволяет добавить к чекбоксам вариант "другое" с полем ввода, но чтобы внутри ответа - не нашёл. Может кто сталкивался?

0 Thanks

Комментарии

Аватар пользователя GodZiLA GodZiLA 22 ноября 2016 в 15:02

Вот, я как раз и сказал, что этот-то модуль я нашёл. Но он вроде как не может вставить внутри ответа несколько инпутов, он может только добавить внизу ответа строку "другое".
Причём, в настройках самого вебформа такое есть.

Аватар пользователя GodZiLA GodZiLA 23 ноября 2016 в 19:46

Ага. Супер, почти то, что нужно. А можно ли как-то вставить инпуты внутрь лейблов чекбокса?

Аватар пользователя mbaev mbaev 23 ноября 2016 в 20:03

Создаем модуль - пример. И вписываем код:

<?php

/**
 * Implements hook_theme().
 */
function MYMODULE_theme() {
  return array(
    
'checkbox_in_label_wrapper' => array(
      
'render element' => 'element',
    ),
  );
}

function 

MYMODULE_checkbox_in_label_wrapper($variables) {
  
$element = &$variables['element'];
  
$attributes = isset($element['#attributes']) ? $element['#attributes'] : array();
  if(isset(
$element['#label_attributes'])) {
    
$attributes array_merge($attributes$element['#label_attributes']);
  }

  

// Add element #id for #type 'item'.
  
if (isset($element['#markup']) && !empty($element['#id'])) {
    
$attributes['id'] = $element['#id'];
  }

  

// Check for errors and set correct error class.
  
if (isset($element['#parents']) && form_get_error($element)) {
    
$attributes['class'][] = 'error';
  }

  if (!empty(

$element['#type'])) {
    
$attributes['class'][] = 'form-type-' strtr($element['#type'], '_''-');
  }
  if (!empty(
$element['#name'])) {
    
$attributes['class'][] = 'form-item-' strtr($element['#name'], array(
          
' ' => '-',
          
'_' => '-',
          
'[' => '-',
          
']' => '',
        ));
  }
  
// Add a class for disabled elements to facilitate cross-browser styling.
  
if (!empty($element['#attributes']['disabled'])) {
    
$attributes['class'][] = 'form-disabled';
  }

  

$output '<label' drupal_attributes($attributes) . '>' "\n";

  

$prefix '';
  
$suffix '';
  if (isset(
$element['#field_prefix']) || isset($element['#field_suffix'])) {
    
// Determine if "#input_group" was specified.
    
if (!empty($element['#input_group'])) {
      
$prefix .= '<div class="input-group">';
      
$prefix .= isset($element['#field_prefix']) ? '<span class="input-group-addon">'
        
$element['#field_prefix']
        . 
'</span>' '';
      
$suffix .= isset($element['#field_suffix']) ? '<span class="input-group-addon">'
        
$element['#field_suffix']
        . 
'</span>' '';
      
$suffix .= '</div>';
    }
    else {
      
$prefix .= isset($element['#field_prefix']) ? $element['#field_prefix'] : '';
      
$suffix .= isset($element['#field_suffix']) ? $element['#field_suffix'] : '';
    }
  }

  switch (

$element['#title_display']) {
    case 
'before':
    case 
'invisible':
      
$output .= $element['#title'];
      
$output .= ' ' $prefix $element['#children'] . $suffix "\n";
      break;

    case 

'after':
      
$output .= ' ' $prefix $element['#children'] . $suffix;
      
$output .= $element['#title'];
      break;

  }
  

$output .= "</label>\n";

  return 

$output;
}

function 

MYMODULE_form_YOURFORM_ID_alter(&$form, &$form_state){
  
$form['any_checkbox']['#theme_wrappers'][] = 'checkbox_in_label_wrapper';
}
?>

Нужно заменить MYMODULE на имя, которое вы дали модулю и YOURFORM_ID на id формы, в которой нужно изменить чекбокс.