Dynamic Drupal7:Drupal7中动态选择列表的最佳实践

Dynamic Drupal7:Drupal7中动态选择列表的最佳实践,dynamic,drupal-7,selectlist,form-api,Dynamic,Drupal 7,Selectlist,Form Api,Drupal7中动态选择列表的最佳实践是什么 通过UI创建带有虚拟选项的字段,并使用hook\u form\u form\u ID\u alter覆盖选项 或 使用hook\u表单通过自定义模块从头开始创建动态选择列表 或 不同的方法 谢谢您可以使用表单API(它过去在Drupal6中被称为#ahah)来实现这一点 以下是Drupal 7(基于)的示例,其中显示了两个下拉列表,其中第一个下拉列表修改了第二个下拉列表的选项列表: 文件源mymodule.module: <?php /**

Drupal7中动态选择列表的最佳实践是什么

  • 通过UI创建带有虚拟选项的字段,并使用
    hook\u form\u form\u ID\u alter覆盖选项
  • 使用
    hook\u表单通过自定义模块从头开始创建动态选择列表
  • 不同的方法
  • 谢谢

    您可以使用表单API(它过去在Drupal6中被称为
    #ahah
    )来实现这一点

    以下是Drupal 7(基于)的示例,其中显示了两个下拉列表,其中第一个下拉列表修改了第二个下拉列表的选项列表:

    文件源mymodule.module

    <?php
    
    /**
     * Implementation of hook_menu().
     * Registers a form-based page that you can access at "http://localhost/mypage"
     */
    function mymodule_menu(){
        return array(
            'mypage' => array(
                'title' => 'A page to test ajax',
                'page callback' => 'drupal_get_form',
                'page arguments' => array('mymodule_page'),
                'access arguments' => array('access content'), 
            )
        );
    }
    
    
    
    /**
     * A form with a dropdown whose options are dependent on a
     * choice made in a previous dropdown.
     *
     * On changing the first dropdown, the options in the second are updated.
     */
    function mymodule_page($form, &$form_state) {
        // Get the list of options to populate the first dropdown.
        $options_first = mymodule_first_dropdown_options();
    
        // If we have a value for the first dropdown from $form_state['values'] we use
        // this both as the default value for the first dropdown and also as a
        // parameter to pass to the function that retrieves the options for the
        // second dropdown.
        $value_dropdown_first = isset($form_state['values']['dropdown_first']) ? $form_state['values']['dropdown_first'] : key($options_first);
    
        $form['dropdown_first'] = array(
            '#type' => 'select',
            '#title' => 'First Dropdown',
            '#options' => $options_first,
            '#default_value' => $value_dropdown_first,
    
            // Bind an ajax callback to the change event (which is the default for the
            // select form type) of the first dropdown. It will replace the second
            // dropdown when rebuilt
            '#ajax' => array(
                // When 'event' occurs, Drupal will perform an ajax request in the
                // background. Usually the default value is sufficient (eg. change for
                // select elements), but valid values include any jQuery event,
                // most notably 'mousedown', 'blur', and 'submit'.
                'event' => 'change',
                'callback' => 'mymodule_ajax_callback',
                'wrapper' => 'dropdown_second_replace',
            ),
        );
        $form['dropdown_second'] = array(
            '#type' => 'select',
            '#title' => 'Second Dropdown',
            // The entire enclosing div created here gets replaced when dropdown_first
            // is changed.
            '#prefix' => '<div id="dropdown_second_replace">',
            '#suffix' => '</div>',
            // when the form is rebuilt during ajax processing, the $value_dropdown_first variable
            // will now have the new value and so the options will change
            '#options' => mymodule_second_dropdown_options($value_dropdown_first),
            '#default_value' => isset($form_state['values']['dropdown_second']) ? $form_state['values']['dropdown_second'] : '',
        );
        return $form;
    }
    
    /**
     * Selects just the second dropdown to be returned for re-rendering
     *
     * Since the controlling logic for populating the form is in the form builder
     * function, all we do here is select the element and return it to be updated.
     *
     * @return renderable array (the second dropdown)
     */
    function mymodule_ajax_callback($form, $form_state) {
        return $form['dropdown_second'];
    }
    
    
    /**
     * Helper function to populate the first dropdown. This would normally be
     * pulling data from the database.
     *
     * @return array of options
     */
    function mymodule_first_dropdown_options() {
        return array(
            'colors' => 'Names of colors',
            'cities' => 'Names of cities',
            'animals' => 'Names of animals',
        );
    }
    
    
    /**
     * Helper function to populate the second dropdown. This would normally be
     * pulling data from the database.
     *
     * @param key. This will determine which set of options is returned.
     *
     * @return array of options
     */
    function mymodule_second_dropdown_options($key = '') {
        $options = array(
            'colors' => array(
                'red' => 'Red',
                'green' => 'Green',
                'blue' => 'Blue'
            ),
            'cities' => array(
                'paris' => 'Paris, France',
                'tokyo' => 'Tokyo, Japan',
                'newyork' => 'New York, US'
            ),
            'animals' => array(
                'dog' => 'Dog',
                'cat' => 'Cat',
                'bird' => 'Bird'
            ),  
        );
        if (isset($options[$key])) {
            return $options[$key];
        }
        else {
            return array();
        }
    }
    

    从wildpeaks获取答案的回调应该是:

    function mymodule_ajax_callback($form, $form_state) {
        return render($form['dropdown_second']);
    }
    

    我用Drupal 7I的一个例子更新了我的答案,我使用了上面的代码。但我无法获取选定的值。一旦我更改了下拉菜单_-one,则不会显示下拉菜单_-second。我对您的代码做了一个更改。我使用了hook\u form\u id\u alter hook而不是hook\u page()。我提出了一个问题。你能检查一下并帮我解决这个问题吗?