【问题标题】:Returning user input after AJAX call in Drupal 7 hook_form_FORM_ID_alter在 Drupal 7 hook_form_FORM_ID_alter 中调用 AJAX 后返回用户输入
【发布时间】:2014-03-26 21:54:33
【问题描述】:

我在 Drupal 7 中使用 hook_form_FORM_ID_alter 创建自定义表单,以便用户可以输入和编辑数据,然后将其附加到自定义节点类型。

对于一个新节点,组中输入框的默认数量为 10,然后可以以 5 个为一组添加。当重新加载节点以编辑保存的数据时,用于创建具有任意数量的表单先前已保存输入,并且还可以根据需要以相同的方式添加更多字段。

我已经设法使表单的初始版本和编辑版本都可以使用以下代码工作,但是当按下“添加五个”按钮并调用 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,所以我确信有一些很明显的东西我错过了。

【问题讨论】:

    标签: ajax drupal drupal-7 nodes


    【解决方案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,
            );  
        }
    

    似乎就这么简单。希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 2014-02-13
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多