首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ajax回调的drupal7多个选择框

问使用ajax回调的drupal7多个选择框
EN

Stack Overflow用户
提问于 2013-09-17 14:10:39
回答 1查看 1.5K关注 0票数 0

我正在尝试使用drupal 7创建一个包含4个元素的表单(名称、服务器、版本、os、arch)

代码语言:javascript
复制
     function create_server(){
            $form['new_server']['name'] = array(
                '#type' => 'textfield',
                '#title' => t('Name'),
                '#required' => TRUE,
                '#description' => t('Please make sure that your server\'s name is unique.')
            );
            $form['new_server']['os'] = array(
                    '#type' => 'select',
                    '#title' => t('OS'),
                    '#options' => $os,
                    '#multiple' => FALSE,
                    '#required' => TRUE,
                    '#prefix' => '<div id="os-div">',
                    '#suffix' => '</div>',
                    '#ajax' => array(
                        'callback' => 'ajax_server_version_callback',
                        'wrapper' => 'version-div',
                        'method' => 'replace',
                        'effect' => 'fade',
                    ),
                );
    $form['new_server']['version'] = array(
                    '#type' => 'select',
                    '#title' => t('Version'),
                    '#disabled' => TRUE,
                    '#options' => array(),
                    '#ajax' => array(
                        'callback' => 'ajax_server_arch_callback',
                        'wrapper' => 'arch-div',
                        'method' => 'replace',
                        'effect' => 'fade',
                    ),
                    '#required' => TRUE,
                    '#prefix' => '<div id="version-div">',
                    '#suffix' => '</div>',
                );
                $form['new_server']['os_arch'] = array(
                    '#type' => 'select',
                   // '#disabled' => TRUE,
                    '#title' => t('OS_ARCH'),
                    '#options' => array(
                        'x86' => 'x86',
                        'x86_64' => 'x86_64'
                    ),
                    '#multiple' => FALSE,
                    '#required' => TRUE,
                    '#prefix' => '<div id="arch-div">',
                    '#suffix' => '</div>',
                );
return $form;
        }

/**
     * Ajax call for version select form
     * based on the selection.
     */

    function  ajax_server_version_callback($form, &$form_state) {

        $os =  !empty($form_state['values']['os']) ? $form_state['values']['os'] : 'all';
        $catalog = server_get_otib_content();

        if(isset($catalog['version'][$os])){
            $version = $catalog['version'][$os];
        } else {
            $version = $catalog['version'];
        }

        $form['version'] = array(
            '#type' => 'select',
             '#id' => 'edit-version',
            '#title' => t('Version'),
            '#disabled' => TRUE,
            '#options' => $version,
            '#ajax' => array(
                'callback' => 'ajax_server_arch_callback',
                'wrapper' => 'arch-div',
                'method' => 'replace',
                'effect' => 'fade',
            ),
            '#required' => TRUE,
            '#prefix' => '<div id="version-div">',
            '#suffix' => '</div>',
        );


        /* echo '<pre>';
        var_dump($form['version']);
        echo '</pre>'; */
        return $form['version'];

    }

    /**
     *  Ajax call for arch select form
     * @param array $form
     * @param array $form_state
     * @return array
     */
    function ajax_server_arch_callback($form, &$form_state) {
        $os =  !empty($form_state['values']['os']) ? $form_state['values']['os'] : 'all';
        $version =  !empty($form_state['values']['version']) ? $form_state['values']['version'] : 'all';
        $catalog = server_get_otib_content();

        if(isset($catalog['arch'][$os][$version])){
            $version = $catalog['arch'][$os][$version];
        } else {
            $version = $catalog['arch'];
        }

        $form['new_server']['os_arch'] = array(
            '#type' => 'select',
            '#disabled' => TRUE,
            '#title' => t('OS_ARCH'),
            '#options' => array(
                'x86' => 'x86',
                'x86_64' => 'x86_64'
            ),
            '#multiple' => FALSE,
            '#required' => TRUE,
            '#prefix' => '<div id="arch-div">',
            '#suffix' => '</div>',
        );
        return $form['new_server']['os_arch'];
    }

问题是,当我选择第一个元素服务器时,它正确地进行了ajax回调并设置了version元素字段。但是version元素不执行ajax调用来设置拱形选择框,即使设置了#ajax数组。当我查看ajax_server_version_callback的json返回时,它不包含ajax选项。如果有人知道为什么会很有帮助。

Thx

EN

回答 1

Stack Overflow用户

发布于 2013-09-24 12:35:53

我也有同样的问题,不能用谷歌解决方案。我意识到的一件事是,如果元素被ajax替换并具有“禁用”属性,ajax回调函数就无法工作。所以你可以试试这样的方法:

  • 删除(‘#禁用’=> TRUE,)属性
  • 相反,添加通过js代码禁用元素的some.js文件。 (函数($){ $(document).ready(function(){ $(‘#element’).attr(‘残疾者’;});}))(JQuery);

对我来说很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18852238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档