양식의 동적 선택 목록 (종속 드롭 다운)


28

Drupal 7을 사용하고 있습니다. 선택 목록의 옵션이 양식의 다른 선택 목록에서 선택한 값에 종속되도록하고 싶습니다. 나는 이것이 여러 번 전에 요청되었다고 확신하지만, 이것을하는 방법에 대한 명확한 대답을 찾는 데 어려움을 겪고 있습니다.

이 양식은 사용자가 작업 기록을 입력하기위한 것입니다. 전대 필드 유형에 대한 노드 참조 인 전대를 선택해야하며 이는 드롭 다운 목록에 있습니다. 그러나 편대는 도시 드롭 다운 목록에 의존합니다. 사용자는 먼저 도시를 선택하고 편대에 대한 옵션을 필터링합니다. 전대 콘텐츠 유형에서 전대에 태그가 지정된 도시에 대한 분류를 작성했습니다.

가장 좋은 방법 (가장 간단합니까?)에 대한 조언이나 도움이되는 유용한 자료를 온라인으로 보내 주셔서 감사합니다.

답변:


27

이를 위해 Ajax를 사용할 수 있습니다. Drupal 7은 이제 Ajax를 잘 지원합니다. 첫 번째 선택 목록 (도시)에서 Ajax 정보를 추가해야합니다. 그런 다음 첫 번째 정보를 기반으로 두 번째 선택 목록을 채울 수 있습니다. 첫 번째 옵션이 선택 될 때까지 두 번째 선택 목록을 숨길 수도 있으며, 그 방법을 조금 설명하겠습니다. 먼저 기본 양식을 설정하십시오.

$form['city'] = array(
  '#type' => 'select',
  '#title' => t('City'),
  '#options' => $options,
  '#ajax' => array(
    'event' => 'change',
    'wrapper' => 'squadron-wrapper',
    'callback' => 'mymodule_ajax_callback',
    'method' => 'replace',
  ),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
  '#type' => 'select',
  '#title' => t('Squadron'),
  '#options' => $squadron_options,
);

이것은 요소의 기본 설정입니다. 이제 전대에서 어떤 옵션을 선택해야하는지 결정해야합니다. 먼저 '도시'선택 목록에서 Ajax 콜백을 식별해야합니다. 대부분의 경우 ajax 요소를 감싸는 요소 (이 경우 $ form)를 반환 할 수 있습니다.

function mymodule_ajax_callback($form, $form_state) {
  return $form;
}

이제 '도시'선택 목록이 변경되면 양식의 전대 포장지 ​​부분이 다시 작성됩니다. 이제 '도시'값이 $ form_state [ 'values']에있게됩니다. 따라서 양식을 다시 작성할 때 'city'값을 기준으로 선택 목록에 제공 할 옵션을 결정해야합니다.

// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
  case 'default':
    // Set default options.
    break;
  case 'losangeles':
    // Set up $squadron_options for los angeles.
    break;
}

// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
  $form['squadron_wrapper']['squadron'] = array(
    '#type' => 'select',
    '#title' => t('Squadron'),
    '#options' => $squadron_options,
  );
}

6
예제 모듈 에서 예제를 찾을 수 있습니다 ( "AJAX 예제"→ "종속 드롭 다운"). 계층 선택 모듈 에서도 볼 수 있습니다 .
kalabro

그건 그렇고, 여러 단계 로이 작업을 수행 할 수는 있지만 원하는대로 들리지 않았다고 생각합니다. ^ 좋은 전화! 예제 모듈은 이런 종류의 것을 배우기 에 좋습니다 .
jordojuice

@jordojuice 답변 해 주셔서 감사합니다. 나는 지금 노력하고 있습니다. 위의 코드의 세 번째 예에서 (시작 // 값 가져 오기 ...) 코드 의이 부분을 어떤 함수에 넣습니까? _ajax_callback 함수로 이동합니까? 감사합니다
Ben

나는 이것에 대한 예제 모듈을 따랐지만 첫 번째 드롭 다운에서 항목을 선택할 때마다 오류가 발생했습니다. \ web \ xampp \ htdocs \ mysite \ modules \ field \ field.module). 사용자 정의 재정의 모듈에서 작성한이 아약스 종속 드롭 다운과 함께 다단계 양식을 사용하고 있습니다 .... 첫 번째에 따라 두 번째 dd의 값이 변경되지만. 경고 만 표시되지만 자극적입니다 ... 누군가 해당 경고를 제거하도록 도와 줄 수 있습니까? 감사!
jan

이 코드와 @Ben에서 작동하게 된 것의 중요한 차이점. #suffix는 id를 사용하고 ajax 콜백은 전체 양식이 아닌 양식 요소를 리턴합니다. 그 외에는 이것이 매우 도움이되었습니다!
wolffer-east

11

위의 jordojuice에 감사드립니다. 그의 도움으로 나는 해결책을 찾았습니다. 또한 http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission 의 예제를 참조했습니다 . 결국 사용자 지정 모듈에서 작동하는 아래 코드를 사용했습니다. 어떤 이유로 $ form_state 값에서 내 값을 찾을 수 없지만 $ form에서 값을 찾을 수있었습니다. 마지막으로, 테스트 할 때 Drupal이 드롭 다운에서 잘못된 선택을 감지했다는 오류 메시지가 표시되었습니다. form.inc에서 1290 행을 주석 처리 하여이 문제를 해결했습니다.

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));

내가 사용한 마지막 코드는 다음과 같습니다.

<?php

function sappers_squadron_form_work_history_node_form_alter(&$form, &$form_state) {     
        //echo '<pre>';
        //print_r ($form);
        //echo '</pre>';

        $squadron_options = array();

        if(isset($form['field_wkhist_city']['und']['#default_value'][0])) {
            $city = $form['field_wkhist_city']['und']['#default_value'][0];
        }
        else {
            $city = 0;
        }

        $squadron_options = sappers_squadron_squadrons($city);

        $form['field_wkhist_city']['und']['#ajax'] = array(
            'event' => 'change',
            'wrapper' => 'squadron-wrapper',
            'callback' => 'sappers_squadron_ajax_callback',
            'method' => 'replace',
        );

        $form['field_squadron']['und']['#prefix'] = '<div id="squadron-wrapper">';
        $form['field_squadron']['und']['#suffix'] = '</div>';
        $form['field_squadron']['und']['#options'] = $squadron_options;
}


function sappers_squadron_ajax_callback($form, $form_state) {   
    $city = $form['field_wkhist_city']['und']['#value'];

    $form['field_squadron']['und']['#options'] = sappers_squadron_squadrons($city);

    return $form['field_squadron'];
}


function sappers_squadron_squadrons($city) {
    $nodes = array();

    $select = db_query("SELECT node.title AS node_title, node.nid AS nid FROM  {node} node INNER JOIN {taxonomy_index} taxonomy_index ON node.nid = taxonomy_index.nid WHERE (( (node.status = '1') AND (node.type IN  ('squadron')) AND (taxonomy_index.tid = $city) )) ORDER BY node_title ASC");

    $nodes[]="";

    foreach ($select as $node) {
            $nodes[$node->nid] = $node->node_title;
    }

    return $nodes;
}

?>

불법 선택이 감지되었습니다. 사이트 관리자에게 문의하십시오. 위의 구현을 시도했을 때 오류가 발생했습니다. 도와 드릴까요?
harshal

@ harshal-나는 같은 문제가 있었고 내 대답에 제공 한 솔루션을 구현하여 그 문제를 해결했습니다. 위의 form.inc를 참조하십시오. 이것은 약간의 해킹이지만 그것은 나를 위해 일했습니다.
Ben

@ harshal-아마도 더 나은 해결책은 아래 해커가 제공 한 것입니다.
Ben

1

코드 즉,의 줄을 추가
$nodes[''] = '- None -'; 한 후

 $nodes = array();

통해 UR sappers_squadron_squadrons function 그것은 당신의 오류를 해결합니다

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));



1

사용 참조 필드 옵션 제한 모듈

이 모듈을 사용하면 여러 유형의 참조 필드에 위젯의 사용 가능한 옵션이 현재 엔티티의 다른 필드 값으로 제한 될 수 있습니다.


조건부 필드 모듈의 대안입니까?
Umair
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.