2011-12-15 5 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

非常に良い:)この種のものがコアフィールドAPIによってあなたのために処理された場合、それはいいでしょう、私はDrupal.orgの問題をこれについて実際に提起することについて考えるかもしれません。それを整理するためにうまくやっていますが、私はおそらくこのような方法を将来試してみるでしょう。あなたは確かに同じ問題で他の誰かを助ける必要がありますので、これを答えとして受け入れるべきです – Clive

+0

私は間違いありません! (しかし、私は2日待たなければならない))私は本当にこれは他の人を助けてくれることを願っています。 – Michiel

1

問題は、このコンテキストの 'フィールド'はフォーム要素全体の集合であり、個々のフォーム要素ではありません。 'field'が必要な場合は、その中で必要とされる特定のフォーム要素を指定する仕組みがありません。

私はこれに対してまだ満足のいく解決策を見出していません(私はこれを数回試しています)。私ができることはフィールドを必要とせず、 hook_field_validateと私の '必要な'検証をそこにしてください。それは理想的ではないのですが、それは動作します:

function mymodule_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) { 
    if ($field['type'] == 'the_field_type') { 

    // Loop through field values 
    foreach ($items as $delta => $item) { 

     // Validate what you need to against the individual field columns 
     if (empty($item['address_line_1'])) { 
     $errors[$field['field_name']][$langcode][$delta][] = array(
      'error' => 'mymodule_address_error', 
      'message' => 'The first line of the address is required.', 
     ); 
     } 

     if (empty($item['town'])) { 
     $errors[$field['field_name']][$langcode][$delta][] = array(
      'error' => 'mymodule_address_error', 
      'message' => 'The town of the address is required.', 
     ); 
     } 

     // And so on... 
    } 
    } 
} 
+0

こんにちはクライブ、あなたの答えをありがとう(もう一度!)私は自分自身の固いソリューションを見つけたと思う!私はそれを1分で投稿します! – Michiel

+0

@Michiel:素晴らしい、本当にあなたの解決策を見て楽しみにして:) – Clive

+0

そこに行く。私はそれがあなたに意味をなされることを願っています:) – Michiel