Drupal以编程方式创建一个带有for条件的表单

时间:2018-07-09 06:56:42

标签: forms drupal drupal-7

我正在尝试创建一个表单来创建一个人,并且这个人可以与另一个人(例如妻子,丈夫,孩子,..)建立某种关系,所以我尝试通过添加按钮来创建一些东西关系,这是我的代码:

if (empty($form_state['number_liaisons'])) {
  $form_state['number_liaisons'] = 1;
}

$form['info_contact']['liaison'] = array(
  "#type" => "fieldset",
  "#title" => "Liaisons",
  "#attributes" => array("class" => array("center"))
);

for ($i = 1; $i <= $form_state['number_liaisons']; $i++) {
  $form['info_contact']['liaison'][$i] = array(
    "#type" => "fieldset",
    "#title" => "Liaison",
    "#attributes" => array("class" => array("center"))
  );

  $form['info_contact']['liaison'][$i]['contact'] = array(
    '#type' => 'textfield',
    '#title' => t("Personne a lier"),
    '#autocomplete_path' => 'crm/autocomplete_liaison',
  );

  $form['info_contact']['liaison'][$i]['type'] = array(
    '#type' => 'select',
    '#title' => t("Type de liaison"),
    '#options' => Array('enfant' => 'Enfant', 'conjoint' => 'conjoint'),
    '#empty_option' => t('- Choisir un type de liaison -'),
  );
}

$form['info_contact']['liaison']['add_item'] = array(
  '#type' => 'submit',
  '#value' => t('Add liaison'),
  '#submit' => array('liaison_add_item'),
  '#limit_validation_errors' => array(),
);

if ($form_state['number_liaisons'] > 1) {

  $form['info_contact']['liaison'] = array(
    '#type' => 'submit',
    '#value' => t('Remove liaison'),
    '#submit' => array('liaison_remove_item'),
    '#limit_validation_errors' => array(),
  );
}

以及添加/删除关系的两种方法:

function liaison_add_item($form, &$form_state)
{
  $form_state['number_liaisons']++;
  $form_state['rebuild'] = true;
}

function liaison_remove_item($form, &$form_state)
{
  if ($form_state['number_liaisons'] > 1) {
    $form_state['number_liaisons']--;
  }

  $form_state['rebuild'] = true;
}

我的问题是,当我单击“添加联络”按钮时,所有字段都消失了,而当我单击“删除联络”时,这些字段又回来了。 因此,当我在$form_state['number_liaisons']中的位数超过1时,for不会显示我的字段。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我认为这是因为联络人都共享相同的字段名称,$ form_state并不真正在乎是否嵌套它们。因此,尝试重命名为类似的内容;

[“ contact _ {$ i}”]而不只是['contact']