gpt4 book ai didi

dynamic - Drupal 7 : Best Practice for a Dynamic Select List in Drupal 7

转载 作者:行者123 更新时间:2023-12-02 09:30:19 24 4
gpt4 key购买 nike

Drupal 7 中动态选择列表的最佳实践是什么?

  1. 通过 UI 创建一个包含虚拟选项的字段,并使用 hook_form_FORM_ID_alter 覆盖选项

  • 通过带有 hook_form 的自定义模块从头开始创建动态选择列表
  • 不同的方法?
  • 谢谢

    最佳答案

    您可以使用表单 API 的 #ajax (在 Drupal6 中它曾经被称为#ahah)来做到这一点。

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

    文件来源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();
    }
    }

    关于dynamic - Drupal 7 : Best Practice for a Dynamic Select List in Drupal 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5158744/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com