我想在我的自定义模块中创建一个自动完成表单,该表单将加载到块中。 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。实际上,我想要的只是自动填充字段...提交将手动处理。
答案 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);
因此解决了这个问题。