web-dev-qa-db-ja.com

正しいAJAX実践

「オンラインディスカッション」と呼ばれるコンテンツタイプ(以降、ODと呼ばれます)と「オンラインディスカッション返信」と呼ばれるコンテンツタイプ(以降、ODRと呼ばれます)があります。エンティティ参照(drupal.org/project/entityreference)を相互に持つ。

1つのODRが(フロントエンドのカスタムフォームを介して)作成されると、その「親」(作成されたページのOD)を参照し、対応するエンティティ参照(drupal.org/project/cer)を介して同じことが逆に発生します。

ODのページでは、テーマ設定により、参照されているODRの特定の量(最新の10個)が表示されます。現時点ではビューやパネルの関与なしにレンダリングされたエンティティとして表示されますが、必要に応じて変更することもできます。

各ODRには返信フォームの独自のインスタンスがあり、引用機能が強化されています。

また、ODRは、カスタムフロントエンドフォームを介して、特定のロールからのコメントを受け入れることもできます。

要求事項:

1)以前の(すべてまたはバッチの)応答をAJAXでロードする方法が必要です。現在、jQuery ajaxコールバックを起動して、それに応じて以前のODRをフェッチするビューページにアクセスし、それらのHTMLをDOMに挿入しています。これは機能しますが、200を超えるノードが参照されるテストケースシナリオでは、時間がかかるようです

2)一定の時間間隔の後、新しいODRを探し、それらに追加して、ODに「ライブライク」な動作を与える方法が必要です。現時点ではこれを同じ方法で行っていますが、問題なく動作するようです。

3)Drupal動作をサイトに来る新しい要素に適用して、コンテキストリンクが機能するようにするなど)にいくつかの効率的な方法が必要です。Drupal.attachBehaviors(context)を使用してそれを行いました;しかし問題があります。

これまでの問題:

I.同じページ上の同じフォームの複数のインスタンス。
Drupalは最初のODページのロード時にdrupal_html_id()を処理しますが、AJAXを使用すると、IDの一意性が失われます。たとえば、私の初期ロードに10のフォームがあり、AJAXを介して2つ追加します。全体として生成されたビューのHTMLを取得するため、最初の2つのIDが繰り返されます。

II。 「以前のすべてのODRをロードする」ケースでのパフォーマンスの問題。かなり自明です。 200以上のエンティティをプルし、それらのHTMLを挿入することは、かなり大変な作業です。

III。 Drupal.attachBehaviors-私が説明したようにAJAXを使用すると、コンテキストリンクのHTMLは問題なく生成されます。それに関連するJavaScriptで問題が発生します。これに関するドキュメンテーションはほとんどありません、私はDrupal問題をかなり解決する動作に遭遇しましたが、対処する新しい一連の問題を与えました:

  • onLoadイベントが動作中となり、AJAXイベントが発生するたびに実行され、複数のイベントバインディングが発生します(現時点ではバインドソリューションの前にバインド解除))
  • 複数のフォームが使用するtextareasの折りたたみなど、一部のonLoadイベントは、ユーザビリティの問題を引き起こします。たとえば、返信またはコメントを入力すると、定期的なajax呼び出しによって新しいODRがサイトに送信され、テキスト領域が折りたたまれます。
  • jQueryを介してすべての可能性を確実に処理するためにコードを管理するのはかなり面倒で段階的に困難

それで、最後に、質問:

Drupalコンテキストで、説明されている望ましい結果を達成するためのベストプラクティスは何ですか?

7
magtak

まず第一に、あなたはここで質問が多すぎます。この小説全体をスタック交換にダンプして誰かがあなたの問題をすべて解決するのではなく、この問題を小さなチャンクに分割して、それぞれを解決することをお勧めします。

多分それは厳しいように聞こえるかもしれませんが、まだ返信がないのには理由があります。

Drupalのonce関数 を紹介します。これは、少なくともonLoadの難問に対処するのに役立ちます。 (ヒント:これまではonLoadを使用しないでください。)

一般に、Drupalでサイトを構築していて、希望することを実行するためのモジュールが見つからず、PHPまたはJavaScriptまたはカスタムwhat-持っている場合は、新しいアプローチを検討することをお勧めします。

あなたが達成しようとしている振る舞いを達成するためのライブラリをおそらく提供する多くのフロントエンドフレームワークがあります。問題の解決に近づき、負荷がかかってもうまく機能するものを見つけて、それを使用に合わせて調整してください。

2
aaronbauman