Помогите разобраться с radios в ajax forms

Аватар пользователя greenteamer greenteamer 6 июня 2012 в 17:48

помогите решить задачу, нужно что бы при выборе определенного элемента формы radios добавлялась еще одна форма textfeild, дошел до такой конструкции ... никак не могу сообразить как правильно составить условие... пожалуйста помогите!!! уже 2 ночи сижу над задачей((

<?php$form['step1']['ihs'] = array(
        '#type' => 'radios', 
        '#title' => 'Уже есть счет в BF Brokerage?',
        '#options' => drupal_map_assoc(array('Нет. Это мой первый счет.','Да. У меня есть счет в BF Brokerage.')),
        '#ajax' => array(
          'callback' => 'ajax_example_autocheckboxes_callback',
          'wrapper' => 'checkboxes-div',
          'method' => 'replace',
          'effect' => 'fade',
        ),
      );

$form['checkboxes_fieldset'] = array(
    '#title' => t("new form"),
    '#prefix' => '<div id="checkboxes-div">',
    '#suffix' => '</div>',
    '#type' => 'fieldset',
  );
 

  
   if (isset($form_state['step1']['ihs']['values'])) {
    $form['checkboxes_fieldset']["checkbox$i"] = array(
      '#type' => 'checkbox',
      '#title' => "Checkbox $i",
    );
  }
  
 

$form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  return

$form;
}

function ajax_example_autocheckboxes_callback($form, $form_state) {
  return $form['checkboxes_fieldset'];
}?>

Комментарии

Аватар пользователя Shok211 Shok211 6 июня 2012 в 20:20
<?php
/**
 * AJAX вызов после выбора пользователем флажка в форме @see mymodule_form()
 * 1. Устанавливаем следующий шаг 
 * 2. Сохраняем состояние формы 
 * 3. Возвращаем новый элемент формы
 *
 * @param
 *  array $form contains form structure
 * @param
 *  array &$form_state contains form state
 *
 * @return array $form['checkboxes_fieldset'] contains form element
 */
function ajax_example_autocheckboxes_callback($form$form_state) {
  
$form_state['step'] = 2;
  
$form_state['rebuild'] = TRUE;
  return 
$form['checkboxes_fieldset'];
}

/**
 * .....
 */
function mymodule_form() {
  if (
$form_state['step'] === 2) {
      
// $form = 
  
}
}
?>

UPD я ошибся <?phpif ($form_state['step'] === 2)?>

Аватар пользователя greenteamer greenteamer 6 июня 2012 в 20:02

Shok211 не работает такой вариант(( в массиве $form_state[] как я понимаю хранятся все данные формы , то есть ее состояние? не понятно что означает $form_state['step'] ... я так думал что нужно какое то условие типа
<?php if ($form_state['values']['myform'] == 'Да. У меня есть счет в BF Brokerage.') {}?>
разве нельзя просто указать значение которое принимает $form['myform'] при выборе пользователя и относительно этого уже выводить новую форму?

Аватар пользователя greenteamer greenteamer 7 июня 2012 в 3:46

Решено! спасибо Shok211 за наводку, как Вы написали , неполучилось c '#type'=>'radios', для radios и chekboxes конструкция следующая

<?php
//задаем форму 
$form['toggle_me'] = array(
        
'#type' => 'radios',
        
'#title' => t('Уже есть счет в BF Brokerage? *'),
        
'#options' => drupal_map_assoc(array('Нет. Это мой первый счет.','Да. У меня есть счет в BF Brokerage. ')),
      );
//2 выпадающих поля каждый проверяет условие
      
$form['login'] = array(
        
'#type' => 'textfield',
        
'#states' => array(
          
'visible' => array(
          
':input[name="toggle_me"]' => array('value' => 'Да. У меня есть счет в BF Brokerage. '),
          ),
        ),
      );
      
$form['pass'] = array(
        
'#type' => 'textfield',
        
'#states' => array(
          
'visible' => array(
          
':input[name="toggle_me"]' => array('value' => 'Да. У меня есть счет в BF Brokerage. '),
          ),
        ),
      );
?>

пока только не могу понять как правильно написать условие если массив $form['toggle_me'][...] = array() - такого вида а не одномерный как у меня : $form['toggle_me'] = array()

Аватар пользователя Shi3A Shi3A 13 ноября 2012 в 22:24
function my_module_form_alter(&$form,&$form_state,$form_id){
    if($form_id == 'form_name'){
        $form['options'] = array(
            '#type' => 'radios',
            '#title' => t('Select Option'),
            '#options' => array(0 => t('Option 1'),
                1 => t('Option 2'),
                2 => t('Option 3'),
            ),
            '#required' => FALSE,
            '#prefix' => '',
            '#suffix' => '',
            '#ajax' => array(
                'callback' => 'my_module_autotextfields_callback',
                'wrapper' => 'textfields',
                'effect' => 'none',
            )
        );
        $form['hidden_field'] = array(
            '#type' => 'textfield',
            '#prefix' => '<div id="textfields">',
            '#suffix' => '</div>',
            '#disabled' => TRUE,
            '#size' => 60,
            '#maxlength' => 255,
        );

        if (!empty(
        $form_state['values']['options']) && $form_state['values']['options'] == 0 ) {
            $form['hidden_field'] = array(
                '#type' => 'textfield',
                '#default_value' => 0,
                '#prefix' => '<div id="textfields">',
                '#suffix' => '</div>',
                '#disabled' => FALSE,
                '#size' => 60,
                '#maxlength' => 255,
            );
        }
        // И еще добавляем полей для каждой radio

    }
}

function my_module_autotextfields_callback($form, $form_state) {
    return $form['hidden_field'];
}

Как-то так кажется