我想将自动完成功能附加到Drupal 7中的特定字段列表。字段有FIELD_CARDINALITY_UNLIMITED
,因此可以有从1到任何地方的任何地方。我使用以下代码:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if (array_key_exists('mymodule', $form)) {
$indices = array_filter(
array_keys($form['mymodule']['und']),
function($item) {
return is_numeric($item);
}
);
foreach($indices as $index) {
$form['mymodule']['und'][$index]['value']['#autocomplete_path'] = 'api/node/title';
}
}
}
...但是,我的自动填充行为未被附加。我在类似的情况下使用了完全相同的代码 - 唯一的区别是我将自动完成添加到基数为1而不是无限的字段。这似乎不应该改变任何东西。我已经通过在赋值语句后执行debug($form['mymodule'])
验证了自动完成是附加的,它肯定存在。我还调试了我试图在foreach循环的每次迭代中获得的确切数组路径,它绝对是正确的表单值。
编辑:问题可能是多个模块使用hook_form_alter()
更改此表单吗?我在同一个表单上执行与上面完全相同的操作(但在单个字段上)。
EDIT2:我注意到如果我在foreach循环中放入一个调试语句,我会看到每次迭代都会在适当的值上设置自动完成值。如果我将调试语句放在foreach循环之外,则不再设置自动完成路径。不知何故,无论是在迭代过程中,还是在迭代之后,看起来我的变化都被破坏了?我通过假设$index
为0来测试这个,并编写一个硬编码语句来附加自动完成 - 这允许自动完成正常工作。要清楚,我看到的内容如下:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if (array_key_exists('mymodule', $form)) {
$indices = array_filter(
array_keys($form['mymodule']['und']),
function($item) {
return is_numeric($item);
}
);
foreach($indices as $index) {
$form['mymodule']['und'][$index]['value']['#autocomplete_path'] = 'api/node/title';
// Debug statements here show that the value '#autocomplete_path' is set properly
debug($form)['mymodule']['und'][$index]['value']);
}
// Now, the '#autocomplete_path' key does not exist
debug($form)['mymodule']['und'][0]['value']);
// This will make autocomplete attach correctly
$form['mymodule']['und'][0]['value']['#autocomplete_path'] = 'api/node/title';
}
}
答案 0 :(得分:0)
你拼写了它#autcomplete_path
......它应该是#autocomplete_path
:)
如果您自己定义字段(和小部件),那么您应该只在模块的hook_field_widget_form()
实现中添加自动完成,而不是更改表单。
如果您没有自己定义小部件,请查看hook_field_widget_form_alter()
和hook_field_widget_WIDGET_TYPE_form_alter()
,这样您就可以更改特定字段的小部件表单。
答案 1 :(得分:0)
试试这个:
1)将代码中的['mymodule'] ['und'] [$ index] ['value']更改为文本输入示例的id
$form['search_form_block']
['#autocomplete_path']='yourcall_back_function_which_returns_data';
我认为错误是您正在尝试替换字段的值,但您必须更改格式窗口小部件的值。在这种情况下输入字段。
2)同时确保'api / node / title'回调使用x debug工作。
让我知道它是否有效。
干杯, vishal
答案 2 :(得分:0)
我通过手动枚举索引而不是以编程方式执行此操作来解决问题,例如$form['mymodule']['und'][0]...
- 这似乎是与foreach
中的变量范围有关的PHP问题,而不是Drupal问题。