首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新Drupal 7 AJAX表单?

如何更新Drupal 7 AJAX表单?
EN

Stack Overflow用户
提问于 2010-08-09 18:21:00
回答 1查看 8.6K关注 0票数 0

我正在创建一个Drupal 7模块。目前,我的目标是获取表单,将某些内容插入数据库,然后告诉用户它工作正常。我可以把它提交给数据库。让表单重新构建并告诉用户他们的术语已经提交了,这是行不通的。我不断得到这些警告错误的变化:由于垃圾邮件的预防,我将在评论中发布这些错误.叹息

最近,我用Chrome开发工具复制了一个错误:

数组( 'term_name‘=> 'jfidj','set_id’=> '1',){“命令”:“设置”,“设置”:{“basePath”:“\/basePath 7\/”,“重叠”:{“路径”:{ "admin":"node\/*\/edit\nnode\/*\/delete\nnode\/*\/revisions\nnode\/*\/revisions\/*\/revert\nnode\/*\/revisions\/*\/delete\nnode\/add\nnode\/add\/*\nadmin\nadmin\/*\nbatch",“non_admin”:“}”,“ajaxCallback”:“overlay”},"merge":false },{“命令”:“插入”,“方法”:null,“选择器”:null“数据”:“\u003cdiv id=\"form_message\"\u003e\u003cdiv”表单-类型-textfield表单-条目-消息\u003E\n\u003 class=\for=\“编辑-消息-2\”\u003 e隐含\u003c\/label\u003e\n \u003 size=\ type=\"text\“128\”name=\“消息\id=\-消息-2\”size=\“60”value=\"\“class=\”表单-文本\“class=\”“设置”:null},{“命令”:“插入”,“方法”:“前置”,“选择器”:null,“数据”:“”,“设置”:null}

我试着把它格式化得更好,但它太乱了.

据我所知,我做的事情是正确的。我一直在跟踪示例模块和Drupal Ajax窗体指南

我创建带有包装器定义的表单,然后在其中有一个if语句,该语句仅在表单提交时运行,然后使用ajax根据需要替换包装的表单元素。

为了了解我尝试过的所有内容,您可以查看Drupal论坛的主题,我将在评论中发布一个链接。

这是我正在尝试的当前代码,有些代码我已经注释掉了,我已经尝试过了,但是没有工作。

代码语言:javascript
复制
/**
 * Add a term
 */
function markit_form_term_add()
{
    $sets = markit_get_marksets();
    //drupal_set_message(var_export($sets));
    $form = array();

    $form['message'] = array(
        '#type' => 'textfield',// . !(empty($form_state['values']['term_name'])) ? 'textfield' :  'hidden',
        '#title' => t('hidden'),
        '#value' => '',// . !(empty($form_state['values']['term_name'])) ? 'Added term: ' . $form_state['values']['term_name'] :  'Message goes here.',
        '#prefix' => '<div id="form_message">',
        '#suffix' => '</div>',
    );
    $form['add'] = array(
        '#type' => 'fieldset',
        '#title' => t('Add new Term'),
        '#prefix' => '<div id="add_term_form">',
        '#suffix' => '</div>',
    );
    $form['add']['name'] = array(
        '#type' => 'textfield',
        '#title' => t('Term name'),
        '#size' => 15,
    );
    //select the set you want to add the term to

    $setNames = array();
    foreach($sets as $row)
    {
        $id = $row['set_id'];
        $setNames[$id] = t($row['set_name']);
    }
    $form['add']['sets']['set_names'] = array(
        '#type' => 'select',
        '#title' => t('Select a set.'),
        '#options' => $setNames,
        '#description' => t('Select from the list of sets.'),
        );

    $form['add']['submit'] = array(
        '#type'  => 'button',
        '#value' => t('Add'),
        '#ajax' => array(
            'callback' => 'markit_ajax_terms_add_callback',
            'wrapper' => 'form_message',
            'method' => 'replace',
        ),
    );

    if(!empty($form_state['values']['name']))
    {
        $form['message']['#type'] = 'textfield';
        $form['message']['#value'] = t('Added term: ');// . $form_state['values']['term_name'];
    }

    return $form;
}

function markit_ajax_terms_add_callback($form, $form_state)
{    
    $entry = array(
       'term_name' => $form_state['values']['name'],
        'set_id' => $form_state['values']['set_names'],
        );
    markit_form_term_add_insert($entry);
    return $form['message'];    
}

/*
 * Get an array of mark sets
 */
function markit_get_marksets()
{
    $output = '';

    $select = db_select('markit_sets','s');
    $select->addField('s','set_id');
    $select->addField('s','set_name');
    $entries = $select->execute()->fetchAll(PDO::FETCH_ASSOC);
    return $entries;
}

/**
 * Get terms by set_id
 */
function markit_get_markterms($termid=NULL,$termname=NULL,$setid=NULL)
{
    $select = db_select('markit_terms','t');
    $select->addField('t','term_id');
    $select->addField('t','term_name');
    $select->addField('t','set_id');
    if($termid)
        $select->condition('term_id',$termid);//,'=');
    if($termname)
        $select->condition('term_name',$termname);//,'=');
    if($setid)
        $select->condition('set_id',$setid);//,'=');
    $entries = $select->execute()->fetchAll(PDO::FETCH_ASSOC);
return $entries;
}

/**
 * Insert new set into database
 */
function markit_form_set_add_insert($entry)
{
    $return_value = NULL;
  try {
    $return_value = db_insert('markit_sets')
                    ->fields($entry)
                    ->execute();
  }
  catch (Exception $e) {
    drupal_set_message(t('db_insert failed. Message = %message, query= %query',
      array('%message' => $e->getMessage(), '%query' => $e->query_string)), 'error');
  }
  return $return_value;
}

/**
 * Insert new set into database
 */
function markit_form_term_add_insert($entry)
{
    drupal_set_message(var_export($entry));
    $return_value = NULL;
  try {
    $return_value = db_insert('markit_terms')
                    ->fields($entry)
                    ->execute();
  }
  catch (Exception $e) {
    drupal_set_message(t('db_insert failed. Message = %message, query= %query',
      array('%message' => $e->getMessage(), '%query' => $e->query_string)), 'error');
  }
  return $return_value;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-11 15:08:15

正确的。在markit_form_term_add_insert中,我使用了一些代码来发现以前的一些bug (drupal_set_message(var_export($entry));)。删除它解决了问题。调试代码是错误..。刘海头撞墙

具体来说,我使用drupal_set_message来查看变量的内容并确保它们是正确的。但是当我开始使用ajax时,drupal_set_message不再被正确地调用了。它应该在表单提交之后调用,或者,很明显,是由ajax回调返回的。如果它只是像在ajax之外那样被调用,它就会给出这些错误。

总之,希望这能帮助人们在寻找类似错误时有所帮助。

基本上,会遍历每个被调用的函数。即使是那些你认识的人也没有影响任何事情。在某个地方,有一些代码没有按其应有的方式被调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3442917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档