2011-12-15 2 views
1

나는 드루팔 (Drupal)에서 내 자신의 필드를 만들었다. 그것은 거리, 숫자, 우편 번호 같은 것들을 표시합니다 ... 지금까지 너무 좋아. 그러나 어떤 이유로 든 모든 필드가 필요합니다. UI 또는 배열에는 필수 항목이 있지만드루팔 (Drupal field_settings_form

그래서 저는 field_settings_form을 편집하고 싶습니다. 나는 Drupal-core 코드에서 자신을 발견했지만 많은 도움이되지는 않는다. field_settings의 목표는 필드를 표시하거나 표시하지 않고 필수로 설정하는 것입니다. 그래서 (내가 user_reference.module에서 그것을 가지고)

function mymodule_field_settings_form($field, $instance, $has_data) { 
    $settings = array_keys($field['settings']); 
    $form = array(); 
    $form['required_fields'] = array(
     '#type' => 'checkboxes', 
     '#title' => t('Required fields'), 
     '#default_value' => is_array($settings['required_fields']) 
      ? array('required') 
      : array(), 
     '#options' => $settings, 
    ); 
    return $form; 
} 

이 코드를 함께했다하지만 난 꽤 여기 붙어 있어요. 이 문제에 대해 경험이있는 사람은 누구입니까?

답변

2

많은 연구와 시행 착오를 거쳐 나 자신을 발견했습니다. 먼저 "양식 설정"페이지를 채워야 페이지가 표시/필요 여부를 확인할 수 있습니다.

function mymodule_field_settings_form($field, $instance, $has_data) { 
    $address_fields = array_keys($field['columns']); 

    // Get all the address values and put them in an array 
    $options = array(); 
    foreach ($address_fields as $value) { 
     $options[$value] = $value; 
    } 

    // Fill in the values in the dropdown 
    $form = array(); 
    $form['required_fields']['#type'] = 'checkboxes'; 
    $form['required_fields']['#title'] = t('Required fields'); 
    $form['required_fields']['#default_value'] = $field['settings']['required_fields']; 
    $form['required_fields']['#options'] = $options; 

    $form['visible_fields']['#type'] = 'checkboxes'; 
    $form['visible_fields']['#title'] = t('Visible fields'); 
    $form['visible_fields']['#default_value'] = $field['settings']['visible_fields']; 
    $form['visible_fields']['#options'] = $options; 

return $form; 
} 

그리고 다른 기능에서 나는 이것을 언급했다. $element은 사용 가능한 모든 요소를 ​​반환하는 함수를 호출합니다. 위의 함수에서 $options과 동일한 값을 전달합니다. 'required_field'이 켜져 있으면 'visible_field'이 켜져 있지 않으면 필수 항목으로 설정합니다.

$element = _mymodule_load_element_fields(); 

    foreach (array_keys($element) as $field_key) { 
     $element[$field_key]['#default_value'] = isset($items[$delta][$field_key]) ? $items[$delta][$field_key] : '';  // Set default value 
     $element[$field_key]['#required'] = $field['settings']['required_fields'][$field_key] != '0'; 

    // Set required property 
    if ($field['settings']['visible_fields'][$field_key] == '0') { 
     unset($element[$field_key]); 
    } 

이 정보가 도움이되기를 바랍니다.

+0

Very nice :) 이런 종류의 일이 핵심 필드 API에 의해 처리 되었다면 Drupal.org에서이 문제를 실제로 제기하는 것이 좋을 것이다. 잘 정리 해두면 나중에 이와 같은 방법을 시도해 볼 것입니다. 당신이 할 수있을 때 이것을 대답으로 받아 들여야합니다. 같은 문제를 가진 다른 사람들을 확실히 도와야합니다. – Clive

+0

나는 분명히 할 것입니다! (하지만 2 일을 기다려야 만합니다.)) 다른 사람들에게 도움이되기를 바랍니다. 괜찮은 문서 나 비슷한 것을 쓰지 않고 엉덩이에 큰 고통을 겪었 기 때문입니다. – Michiel

1

이 문맥의 '필드'는 폼 요소의 집합이며 개별적인 양식 요소가 아닙니다. '필드'가 필요한 경우 특정 양식 요소를 지정해야하는 메커니즘이 필요하지 않거나 필요하지 않아야합니다.

아직 만족스러운 해결책을 찾지 못했습니다. (필자는 여러 번 반대했습니다.) 필자가 할 수 있었던 최선의 방법은 필드를 필요로하지 않고 유효성 검사에 연결하는 것입니다. hook_field_validate 그리고 내 '필수'유효성 검사를 수행하십시오. 이상적은 아니지만 작동합니다 :

+0

안녕하세요 Clive, 답장을 보내 주셔서 감사합니다. (다시 한 번) 제가 솔리드 솔루션을 직접 찾은 것 같습니다. 1 분 안에 게시 할게! – Michiel

+0

@Michiel : 환상적이며, 당신의 해결책을보기를 정말로 기대합니다 :) – Clive

+0

거기에 가세요. 나는 그것이 당신에게 의미가있을 것이라는 점을 희망한다 : – Michiel