3

私は何時間もグーグルで検索してきましたが、驚くべきことに、そのテーマに関するトピックは見つかりませんでした.

私は次のフォームを持っています

class propertyType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    {

        $builder
            ->add('city')
            ->add('district', 'entity', array('class'=>'FlatShanghaidefaultBundle:district', 
                                   'property'=>'name',
                                   'query_builder' => function ($repository) {
                                   $qb = $repository->createQueryBuilder('district');
                                   $qb->add('where', 'city = :city');
                                   $qb->setParameter('city', 1);
                                   return $qb;

    }


    public function getName()
    {
        return 'property';
    }
}

ユーザーがフォームで都市を選択すると、地区のオプションが動的に更新され、その都市に限定されるようにします。Ajax または JS を使用していますか? ベストプラクティスは何ですか?そのトピックに関するチュートリアルを知っていますか? 誰かが私を正しい軌道に乗せることができれば、それは大いに役立ちます..

ありがとう!

4

3 に答える 3

2

クエリビルダーは問題を解決しません。完全に削除できます。

そのクエリは、フォームが作成されたときに実行されます。ブラウザで取得したら、javascript を使用してオプションを入力する必要があります。

オプションを javascript 変数に格納するか、必要に応じて ajax を使用してサーバーからオプションをプルすることができます (これらの ajax リクエストを処理するにはコントローラーが必要です)。

おそらくいくつかの jquery プラグインを使用して、select 要素間のカスケード ロジックを処理することをお勧めします。利用できるものがいくつかあります。

少なくとも私が知っているこのバンドルもあります: https://github.com/genemu/GenemuFormBundle、いくつかのjqueryプラグインで利用可能なajaxフィールドタイプがあります。これにより、データを処理するための ajax 部分を作成する必要がなくなります (コントローラーを自分で実装する方がおそらく簡単です)。私はこれを試したことがなく、カスケード サポートがあるかどうかもわかりません。

于 2012-05-23T20:19:05.413 に答える
1

Jbmはクエリビルダーについて正しいです。そして彼のアプローチは完全に有効です。

別のオプションは、オートコンプリートフィールドを優先してカスケード選択をディスペンスすることです。

国、都市、地区をエンティティとして保存し、それらの間に関係があると仮定すると、次のように呼び出すことができるため、選択した都市/国を保存する必要はありません。

$district->getCity()->getCountry();

国/都市の選択についても同様のことを実装しました。ここで、関連する主なファイルにリンクします。

まず、すべてのフォームをカプセル化するカスタムフォームタイプを作成します。これには、選択したIDを格納するための非表示フィールドと、オートコンプリートロジックの入力として機能するテキストフィールドが含まれます。

https://github.com/roomthirteen/Room13GeoBundle/blob/master/Form/LocationFieldType.php

次に、フォームタイプにテーマを設定します。

https://github.com/roomthirteen/Room13GeoBundle/blob/master/Resources/views/Form/fields.html.twig

オートコンプリートソースのURLはデータ属性として渡されるため、JSがhtmlコードをスマッチすることはありません。

最後になりましたが、JS関数を実装する必要があります。

https://github.com/roomthirteen/Room13GeoBundle/blob/master/Resources/public/jquery.ui.location-autocomplete.js

結果は下の画像で確認できます。わかりやすくするために、国名は都市名の後ろに中かっこで表示されます。

オートコンプリートが読み込まれています

-

実際の値を1つのステップで選択できるため、カスケード選択を使用するよりもこのソリューションの方がはるかに好きです。

乾杯 オートコンプリートが読み込まれ、都市を選択する必要があります

于 2012-05-24T09:12:24.443 に答える
0

私はフォームでこれを自分でやっています。フィールド(製品)を変更し、数量を測定できる単位を更新します。より簡単に適応させるために、パラメーター付きのマクロを使用しています。

マクロ:

{% macro javascript_filter_unit(event, selector) %}
<script>
    $(function(){
        $('#usersection')
                .on('{{ event }}', '{{ selector }}', function(e){
                    e.preventDefault();
                    if (!$(this).val()) return;
                    $.ajax({
                        $parent: $(this).closest('.child_collection'),
                        url: $(this).attr('data-url'),
                        type: "get",
                        dataType: "json",
                        data: {'id' : $(this).val(), 'repo': $(this).attr('data-repo'), parameter: $(this).attr('data-parameter')},
                        success: function (result) {
                            if (result['success'])
                            {
                                var units = result['units'];
                                this.$parent.find('.unit').eq(0).html(units);   
                            }
                        }
                    });
                })
    });

</script>

{% endmacro %}

ajax は配列を返します: array('success' => $value, 'units' => $html)。$html コードを使用して、変更する選択の代わりに配置します。もちろん、ajax 呼び出しの JavaScript コードは、フィールドに合わせて変更する必要があります。

通常どおりにマクロを呼び出します。

{% import ':Model/Macros:_macros.html.twig' as macros %}
{{ macros.javascript_filter_unit('change', '.unitTrigger') }}

したがって、私には 2 つの引数があります。イベント、多くの場合、選択の変更です。そして、その変更が ajax 呼び出しをトリガーするセレクターです。

それが役立つことを願っています。

于 2015-01-16T21:20:46.023 に答える