Как обновить форму Drupal 7 AJAX? - PullRequest
0 голосов
/ 09 августа 2010

Я создаю модуль Drupal 7.В настоящее время моя цель состоит в том, чтобы получить форму для вставки чего-либо в базу данных, а затем сообщить пользователю, что это работает.Я могу получить его, чтобы отправить в базу данных просто отлично.Получение формы, чтобы перестроить и сообщить пользователю, что его срок был отправлен, не будет работать.Я продолжаю получать сообщения об ошибках, которые я буду публиковать в комментариях из-за предотвращения спама .... sigh

Более поздняя ошибка, которую мне удалось скопировать с помощью инструментов разработчика Chrome:

array ('term_name' => 'jfidj', 'set_id' => '1',) [{"command": "settings", "settings": {"basePath": "\ /drupal7 \ / "," overlay ": {" paths ": {" admin ":" node \ / * \ / edit \ nnode \ / * \ / delete \ nnode \ / * \ / revisions \ nnode \ / * \ /revisions \ / * \ / revert \ nnode \ / * \ / revisions \ / * \ / delete \ nnode \ / add \ nnode \ / add \ / * \ nadmin \ nadmin \ / * \ nbatch "," non_admin ":""}," ajaxCallback ":" overlay-ajax "}}," merge ": false}, {" command ":" insert "," method ": null," selector ": null," data ":" \ u003cdivid = \ "form_message \" \ u003e \ u003cdiv class = \ "form-item-type-type-textfield form-item-message \" \ u003e \ n \ u003clabel for = \ "edit-message - 2 \" \ u003ehidden\ u003c \ / label \ u003e \ n \ u003cinput type = \ "text \" maxlength = \ "128 \" name = \ "message \" id = \ "edit-message - 2 \" size = \ "60 \"value = \" \ "class = \" form-text \ "\ / \ u003e \ n \ u003c \ / div \ u003e \ n \ u003c \ / div \ u003e "," settings ": null}, {" command ":" insert "," method ":" prepend "," selector ": null," data ":" "," settings ": null}]

Я пытался отформатировать его лучше, но он просто грязный ...

Насколько я могу судить, я все делаю правильно.Я следил за модулем примеров, и Руководство по формам Drupal Ajax .

Я создаю форму с определенными обертками, затем в ней есть оператор if, который выполняется только в том случае, если форма имеетотправьте, а затем используйте ajax для замены обернутого элемента формы в соответствии с тем, что вы хотите.

Чтобы увидеть все, что я пробовал, вы можете посмотреть тему на форуме Drupal, на которую я опубликую ссылку в комментариях.

Вот текущий код, который я пробую, есть код, который я закомментировал, который я пробовал и не работает.

/**
 * 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;
}

1 Ответ

1 голос
/ 11 августа 2010

правый. В markit_form_term_add_insert у меня был некоторый код, который я использовал, чтобы выяснить некоторые предыдущие ошибки (drupal_set_message (var_export ($ entry));). Удаление, которое решило проблему. Отладочный код был ошибкой .... удар головой об стену

В частности, я использовал drupal_set_message, чтобы просмотреть содержимое переменной и убедиться в ее правильности. Но когда я начал использовать ajax, этот drupal_set_message больше не вызывался правильно. Предполагается, что он вызывается после отправки формы или, по-видимому, возвращается с помощью обратного вызова ajax. Если он вызывается так, как если бы он находился вне ajax, он выдает эти ошибки.

В любом случае, надеюсь, что это поможет кому-то, когда он ищет похожие ошибки.

В основном, проходите через каждую вызываемую функцию. Даже те, кого вы знаете, ни на что не влияют. Где-то там есть некоторый код, который не называют так, как он должен.

...