2014-03-26 39 views
1

我在Drupal 7中使用hook_form_FORM_ID_alter來創建自定義窗體,以便用戶可以輸入和編輯隨後附加到自定義節點類型的數據。在Drupal 7中AJAX調用後返回用戶輸入hook_form_FORM_ID_alter

對於新節點,組中的默認輸入框數爲10,然後可以將其添加到5組中。當節點重新加載進行編輯時,保存的數據用於創建具有任意數字的表單的輸入已經保存過,並且可以按照需要以相同的方式添加更多的字段。

我已經成功地獲得了表單的初始版本和使用以下代碼的編輯版本,但是當按下'add five'按鈕並且調用了AJAX(在這兩種情況下)時,被輸入而不保存被刪除。

<?php 

/** 
* Implements hook_form_FORM_ID_alter(). 
*/ 

function entries_form_form_entries_node_form_alter(&$form, &$form_state, $form_id) { 


$node = $form['#node']; 
// fieldset 
$form["section"] = array(
    '#type' => 'fieldset', 
    '#title'=> 'Section 1',  
); 
$form["section"]["termwrapper"] = array(
    "#type" => 'container', 
    "#attributes" => array(
     "id" => 'groupWrapper', 
    ), 
); 
$form["section"]["termwrapper"]["terms"]["#tree"] = TRUE; 
if(!isset($form_state['fired'])){ 
    $form_state['terms'] = $node->entries_form['term']; 
} 

foreach ($form_state['terms'] as $key => $values) { 
    $form["section"]["termwrapper"]["terms"][$key] = array(
     '#type' => 'textfield', 
     '#size' => 20, 
     '#attributes' => array(
      'class' => array('left'), 
     ), 
    '#value' => $values, 
    ); 
} 

$form['section']['addFive_button'] = array(
    '#type' => 'submit', 
    '#value' => t('+5'), 
    '#submit' => array('entries_form_add_five_submit'), 
    '#ajax' => array(
     'callback' => 'entries_form_commands_add_callback', 
     'wrapper' => 'groupWrapper', 
    ), 
    '#prefix' => "<div class='clear'></div>", 
); 
dpm($form_state); 
} 

function entries_form_commands_add_callback($form, $form_state) { 
    return $form["section"]["termwrapper"]; 
} 

function entries_form_add_five_submit($form, &$form_state){ 
    $form_state['rebuild'] = TRUE; 
    $form_state['fired'] = 1; 
    $values = $form_state['values']; 
    $form_state['terms'] = $values['terms']; 
    $numterms = count($values['terms']); 
    $addfivearray = array_fill($numterms,5,''); 
    $form_state['terms'] = array_merge($values['terms'],$addfivearray); 

} 


/** 
* Implements hook_node_submit(). 
*/ 

function entries_form_node_submit($node, $form, &$form_state) { 
    $values = $form_state['values']; 
    $node->entries_form['term'] = $values['term']; 
} 

/** 
* Implements hook_node_prepare(). 
*/ 
function entries_form_node_prepare($node) { 
    if (empty($node->entries_form)){ 
     $node->entries_form['term'] = array_fill(0, 10, ''); 
    } 
} 

/** 
* Implements hook_node_load(). 
*/ 
function entries_form_node_load($nodes, $types) { 
    if($types[0] == 'entries'){ 
     $result = db_query('SELECT * FROM {mytable} WHERE nid IN(:nids)', array(':nids' => array_keys($nodes)))->fetchAllAssoc('nid'); 
     foreach ($nodes as &$node) { 
      $node->entries_form['term'] = json_decode($result[$node->nid]->term); 
     } 
    } 
} 

/** 
* Implements hook_node_insert(). 
*/ 
function entries_form_node_insert($node) { 
    if (isset($node->entries_form)) { 
    db_insert('mytable') 
     ->fields(array(
     'nid' => $node->nid, 
     'term' => json_encode($node->entries_form['term']), 
    )) 
     ->execute(); 
    } 
} 

如何保存已輸入的值並保留ajax功能?

任何幫助或指針非常讚賞。這是我第一次進入Drupal,所以我確信有一些希望很明顯的東西我錯過了。

回答

1

好吧,我想我終於有了答案。

在構建表單輸入框的foreach中,我應該設置'#value'=> $ values,看起來應該設置'#default_value'=> $ values。

就是現在的工作對我的代碼的更新部分如下所示

foreach ($form_state['terms'] as $key => $values) { 
     $form["section"]["termwrapper"]["terms"][$key] = array(
      '#type' => 'textfield', 
      '#size' => 20, 
      '#attributes' => array(
       'class' => array('left'), 
      ), 
     '#default_value' => $values, 
     ); 
    } 

好像是這麼簡單。希望這可以幫助別人。