在Drupal 7中,为什么自动完成没有附加到这个表单元素列表?

时间:2011-11-23 12:25:45

标签: drupal drupal-7

我想将自动完成功能附加到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';
    }
}

3 个答案:

答案 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问题。