Несколько зависимых динамических полей выбора в форме

Есть модель А, которая has_many Б, и форма, в которой можно создать новую А и добавить/удалить Б. т.е. есть ссылка Добавить новый B, которая запускает некоторый Javascript для вставки другого фрагмента, где нужно заполнить значения для B. Все работает нормально.

Проблема

Указание B выполняется путем выбора значений с помощью нескольких полей выбора. Проблема заключается в том, что в зависимости от значения, выбранного в одном, коллекции, используемые в других выборках, должны иметь область действия, чтобы отображать только соответствующие параметры. Это классический случай с динамическими полями выбора (подумайте о полях выбора страны и штата), только с большим количеством полей выбора, и я бы хотел, чтобы все поля выбора отображались изначально, чтобы пользователь мог начать из любого места ( сначала выберите штат, а поле выбора страны сужает свою коллекцию до тех, которые можно выбрать для этого штата).

Текущий подход

B отображаются в таблице, по одной B в строке, и я подумал, что могу использовать AJAX для замены строки таблицы (контента) после получения новых коллекций с сервера. Это, очевидно, требует наличия нескольких вещей.

  • tr должен иметь уникальный атрибут id, чтобы можно было использовать replace_html.
  • нужно иметь триггер на изменение для каждого поля выбора
  • необходимо передать все значения полей выбора (для этой строки) на сервер

Я застрял здесь из-за следующего:

  • добавление B должно иметь что-то уникальное, чтобы идентифицировать тег tr, а также все выборки в этой строке. Я могу использовать Time.now.to_i, но это не сработает для Javascript, запущенного по ссылке, чтобы добавить новый B, потому что это будет жестко кодировать значение, и все будут использовать одно и то же.
  • не уверен, следует ли мне использовать observe_field или удаленный вызов в помощнике поля формы выбора.
  • как подобрать значения всех выборок в одной строке и передать их удаленно на сервер при срабатывании?

Проект, над которым я работаю, — это Rails 1.2.3, использующий Prototype. Пожалуйста, не стесняйтесь публиковать и «более новые» решения, потому что мне любопытно увидеть разные решения.

Любая помощь в этом высоко ценится. Заранее спасибо!


person murrekatt    schedule 18.10.2011    source источник
comment
Как я это делаю, я просто сохраняю переменную form_counter в javascript, и каждый раз, когда создается новый фрагмент, добавляю его к этой переменной и использую его значение в качестве уникального идентификатора для нового выбора.   -  person bricker    schedule 18.10.2011
comment
@bricker, не могли бы вы добавить ответ с более подробной информацией, где и как вы его добавляете. Это все полезно собрать здесь я думаю. :)   -  person murrekatt    schedule 18.10.2011


Ответы (2)


Это не отвечает на весь ваш вопрос, но может помочь вам начать. Я обрабатываю это так... это для записи списка воспроизведения, где пользователь может добавлять новые формы в div #playlist-entry, и каждая форма .new_song_form со скрытым полем .form_num (которое я использую в файле create.js.erb, чтобы указать, какую форму следует скрывать/предупреждать об ошибках проверки, что, я думаю, для вас не имеет значения).

var form_counter = 1;

function addSongFields() {
    playlistEntry = $('#playlist-entry');
    playlistEntry.append("<%= escape_javascript(render :partial => 'playlist_entry_form', :locals => { :schedule_event => @schedule_event, :playlist_entry => PlaylistEntry.new }) %>");
    playlistEntry.find('.new_song_form:last').attr('id', 'new_song_form_'+form_counter);
    playlistEntry.find('.form_num:last').val('new_song_form_'+form_counter);
}

$(document).ready(function() {  
    $('#add-song-link').click(function(event) {
        event.preventDefault();
        addSongFields();
        form_counter++;
    });
});

Эта форма немного отличается, потому что нет одной «основной» формы для отправки, это набор форм на одной странице, но эта основная идея может вам помочь. Это не идеальное программирование - например, я должен передать form_counter в качестве аргумента функции... но это работает отлично.

person bricker    schedule 18.10.2011

Динамические зависимые поля выбора Как создать зависимый выпадающий список в php? Я много искал, а затем реализовал этот. Это создается с использованием простых зависимых раскрывающихся списков HTML, JS, PHP.

Я знал, что можно создать динамическую зависимую выпадающую форму, используя PHP, MySQL и JavaScript.

но у меня никогда не было предлога использовать его, прежде чем мне нужно будет учить своих студентов.

<?php

$region = $country = $state = $city = null; //declare vars

$conn = mysql_connect('localhost', 'username', 'password');
$db = mysql_select_db('selects',$conn);

if(isset($_GET["region"]) && is_numeric($_GET["region"]))
{
    $region = $_GET["region"];
}

if(isset($_GET["country"]) && is_numeric($_GET["country"]))
{
    $country = $_GET["country"];
}

if(isset($_GET["state"]) && is_numeric($_GET["state"]))
{
    $state = $_GET["state"];
}

if(isset($_GET["city"]) && is_numeric($_GET["city"]))
{
    $city = $_GET["city"];
}

?>

<script language="JavaScript">

function autoSubmit()
{
    var formObject = document.forms['theForm'];
    formObject.submit();
}

</script>

<form name="theForm" method="get">

    <!-- REGION SELECTION -->

    <select name="region" onChange="autoSubmit();">
        <option value="null"></option>
        <option VALUE="1" <?php if($region == 1) echo " selected"; ?>>East</option>
        <option VALUE="2" <?php if($region == 2) echo " selected"; ?>>West</option>
    </select>

    <br><br>

    <!-- COUNTRY SELECTION BASED ON REGION VALUE -->

    <?php

    if($region != null && is_numeric($region))
    {

    ?>

    <select name="country" onChange="autoSubmit();">
        <option VALUE="null"></option>

        <?php

        //POPULATE DROP DOWN MENU WITH COUNTRIES FROM A GIVEN REGION

        $sql = "SELECT COUN_ID, COUN_NAME FROM COUNTRY WHERE RE_ID = $region";
        $countries = mysql_query($sql,$conn);

        while($row = mysql_fetch_array($countries))
        {
            echo ("<option VALUE=\"$row[COUN_ID]\" " . ($country == $row["COUN_ID"] ? " selected" : "") . ">$row[COUN_NAME]</option>");
        }

        ?>

    </select>

    <?php

    }

    ?>

    <br><br>

    <?php

    if($country != null && is_numeric($country) && $region != null)
    {

    ?>

    <select name="state" onChange="autoSubmit();">
        <option VALUE="null"></option>

        <?php

        //POPULATE DROP DOWN MENU WITH STATES FROM A GIVEN REGION, COUNTRY

        $sql = "SELECT STAT_ID, STAT_NAME FROM states WHERE COUN_ID = $country ";
        $states = mysql_query($sql,$conn);

        while($row = mysql_fetch_array($states))
        {
            echo ("<option VALUE=\"$row[STAT_ID]\" " . ($state == $row["STAT_ID"] ? " selected" : "") . ">$row[STAT_NAME]</option>");
        }

        ?>    

    </select>

    <?php

    }

    ?>

    <br><br>

    <?php

    if($state != null && is_numeric($state) && $region != null && $country != null)
    {

    ?>

    <select name="city" onChange="autoSubmit();">
        <option VALUE="null"></option>

        <?php

        //POPULATE DROP DOWN MENU WITH CITIES FROM A GIVEN REGION, COUNTRY, STATE

        $sql = "SELECT CIT_ID, CITY_NAME FROM CITY WHERE STAT_ID = $state ";
        $cities = mysql_query($sql,$conn);

        while($row = mysql_fetch_array($cities))
        {
            echo ("<option VALUE=\"$row[CIT_ID]\" " . ($city == $row["CIT_ID"] ? " selected" : "") . ">$row[CITY_NAME]</option>");
        }

        ?>    

    </select>

    <?php

    }

    ?>

</form>
person Community    schedule 22.10.2012