我可以在块中创建Drupal自动完成文本字段吗?

时间:2012-01-19 19:33:41

标签: drupal-7 jquery-autocomplete

我想在我的自定义模块中创建一个自动完成表单,该表单将加载到块中。 Drupal似乎没有加载必要的Javascript库才能正常工作。我如何知道需要加载什么以及如何/告诉Drupal加载这些库?

hook_block_view:

function my_module_block_view($delta = '') {
    //The $delta parameter tells us which block is being reqested.
    switch ($delta) {
        case 'my_module_my_block':
            $block['subject'] = t('Block Subject');
            $block['content'] = drupal_get_form('my_module_my_form');
            break;
    }

    return $block;
}

表格代码:

function my_module_my_form($form, &$form_state) {   
    $form = array();

    $form['term'] = array(
        '#type' => 'textfield',
        '#autocomplete_path' => 'my-module-autocomplete'
    );

    $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Add',
  );

    return $form;   
}

表单加载,字段在那里,但自动完成不起作用:(

如果我调用my-module-autocomplete路径,与内容类型编辑表单相比,我会收到有效的回复。输入字段中的ajax微调器永远不会出现,因此不会调用ajax。实际上,我想要的只是自动填充字段...提交将手动处理。

3 个答案:

答案 0 :(得分:0)

这可能是因为您在函数开头将$form重置为空数组。在Drupal 7中,在将元素传递给你的表单函数之前,有一些东西被添加到该元素中(这就是为什么$form被传递给你的函数,而在Drupal 6中则没有传递给你的函数。

只需删除$form = array();即可,除了您的代码看起来很完美之外,它应该可以使用。

答案 1 :(得分:0)

以下内容应该有效;

function mymodule_block_info() {
  $blocks['mymodule'] = array(
    // The name that will appear in the block list.
    'info' => t('My Module'),
    // Default setting.
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

function mymodule_block_view($delta = ''){
  switch($delta){
    case 'mymodule':
      if(user_access('access content')){ //good idea to check user perms here
         $block['subject'] = t('My Module');
         $block['content'] = 'Hi :)';
         $block['content'] = drupal_get_form('mymodule_form');
         return $block;
      }
      break;
  }
}

function mydmodule_menu() {  
    $items['module/autocomplete'] = array(
    'page callback' => 'mymodule_autocomplete',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );
  return $items;
}

function mymodule_form($form, &$form_state) {
     $form['greenentry'] = array(
          '#type' => 'textfield', 
          '#title' => t('Enter'),
          '#autocomplete_path' => 'mymodule/autocomplete',
     );


     $form['submit'] = array(
          '#type' => 'submit',
          '#value' => t('Submit'),
     );
     return $form;
}

function mymodule_autocomplete($string) {  
  $matches = array();

  // Some fantasy DB table which holds cities
  $query = db_select('cities', 'c');

  // Select rows that match the string
  $return = $query
    ->fields('c', array('city'))
    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')
    ->range(0, 10)
    ->execute();

  // add matches to $matches  
  foreach ($return as $row) {
    $matches[$row->url] = check_plain($row->url);
  }

  // return for JS
  drupal_json_output($matches);
}

答案 2 :(得分:0)

这段代码非常适合在块中添加自动完成字段。但我刚刚在这里发现了一个小小的通知。如果有人收到错误

  

发生了ajax错误。 http结果代码200

然后添加

exit();
行后

drupal_json_output($matches);

因此解决了这个问题。