Korrigieren Sie die AJAX-Praktiken

7

Ich habe Inhaltstypen namens "Online-Diskussion", im Folgenden als OD bezeichnet, und einen Inhaltstyp namens "Online-Diskussionsantwort", im Folgenden als ODR bezeichnet. Entitätsreferenzen (drupal.org/project/entityreference) zueinander haben.

Wenn ein ODR erstellt wird (über ein benutzerdefiniertes Front-End-Formular), verweist es auf sein "übergeordnetes Element" (das OD, dessen Seite erstellt wurde), und über entsprechende Entitätsreferenzen (drupal.org/project/cer) geschieht dasselbe umgekehrt.

Auf der Seite eines OD wird über das Theming eine bestimmte Anzahl von referenzierten ODRs angezeigt, die 10 neuesten. Sie werden derzeit als gerenderte Einheiten ohne Beteiligung von View oder Panel dargestellt, aber ich bin offen dafür, dies bei Bedarf zu ändern.

Jeder ODR verfügt über eine eigene Instanz des Antwortformulars, die um Angebotsfunktionen erweitert wurde.

Außerdem können die ODRs Kommentare von bestimmten Rollen über ein benutzerdefiniertes Front-End-Formular akzeptieren.

Die Anforderungen:

1) Ich brauche eine Möglichkeit, um frühere (alle oder in Stapeln) Antworten mit AJAX zu laden. Derzeit starte ich einen jQuery-Ajax-Rückruf auf eine Ansichtsseite, die die vorherigen ODRs entsprechend abruft, und füge deren HTML in das DOM ein. Das funktioniert, aber in einem Testfallszenario mit über 200 referenzierten Knoten scheint dies einige Zeit zu dauern

2) Ich brauche eine Möglichkeit, nach einem festgelegten Zeitintervall nach neuen ODRs zu suchen und diese anzuhängen, um dem OD ein "lebhaftes" Verhalten zu verleihen. Im Moment mache ich das genauso und es scheint ziemlich gut zu funktionieren.

3) Ich brauche eine effiziente Methode, um Drupal-Verhalten auf die neuen Elemente anzuwenden, die auf die Site kommen, damit ihre Kontextlinks funktionieren usw. Ich habe dies mit Drupal.attachBehaviors (Kontext) getan. aber es gibt Probleme.

Die bisherigen Probleme:

I. Mehrere Instanzen desselben Formulars auf derselben Seite.
Obwohl Drupal beim ersten Laden der OD-Seite drupal_html_id () verarbeitet, wird die ID-Eindeutigkeit durch die Art und Weise, wie ich AJAX verwende, unterbrochen. Wenn ich zum Beispiel 10 Formulare in meinem anfänglichen Laden habe und 2 weitere über AJAX bringe, werden die IDs für die ersten 2 wiederholt, da ich den HTML-Code der als Ganzes generierten Ansicht greife.

II. Leistungsprobleme in einem Fall "Alle vorherigen ODRs laden". Ziemlich selbsterklärend. Das Ziehen von mehr als 200 Entitäten und das Einfügen von HTML ist ziemlich schwer.

III. Drupal.attachBehaviors - Wenn Sie AJAX wie beschrieben verwenden, wird der HTML-Code für den Kontextlink einwandfrei erstellt. Das Problem tritt mit dem darin enthaltenen Javascript auf. Nachdem ich einige Stunden lang recherchiert hatte, stieß ich auf Drupal-Verhalten, das dieses Problem so gut wie löste, mir aber eine Reihe neuer Probleme gab, mit denen ich mich befassen konnte, da es nur sehr wenige Unterlagen dazu gibt:

  • onLoad-Ereignisse, die sich jetzt in einem Verhalten befinden, werden jedes Mal ausgeführt, wenn ein AJAX-Ereignis ausgelöst wird, wodurch mehrere Ereignisse gebunden werden (im Moment vor der Bindungslösung die Bindung aufheben).
  • Einige onLoad-Ereignisse, wie der Zusammenbruch der Textbereiche, die von mehreren Formularen verwendet werden, verursachen Usability-Probleme. Wenn Sie beispielsweise eine Antwort oder einen Kommentar eingeben, wird über den wiederkehrenden Ajax-Aufruf ein neuer ODR auf die Site übertragen und Ihr Textbereich reduziert.
  • ziemlich chaotisch und inkrementell schwierig, Code zu verwalten, um sicherzustellen, dass ich alle Möglichkeiten über jQuery handhabe

Also endlich die Frage:

Was sind die Best Practices in einem Drupal-Kontext, um das gewünschte beschriebene Ergebnis zu erzielen?

Magtak
quelle
Wie Sie sehen können, diktiert Facebook heutzutage alles;)
magtak
3
Sie sollten Ihren Titel von "Best" ändern, da eine verrückte Person vorbeikommt und "Best" sieht und die Frage sofort schließt, anstatt sie zu lesen. Es passiert. Sie mögen das Wort "am besten" bei Stack Exchange nicht.
o_O

Antworten:

2

Zunächst einmal haben Sie hier viel zu viele Fragen. Ich empfehle, dieses Problem in kleinere Teile aufzuteilen und zu versuchen, sie jeweils zu lösen, anstatt diesen ganzen Roman in den Stapelaustausch zu werfen, damit jemand alle Ihre Probleme für Sie löst.

Vielleicht klingt das hart, aber es gibt einen Grund, warum Sie noch keine Antworten haben.

Ich kann Sie auf die einmalige Funktion des Drupal hinweisen , die Ihnen hilft, zumindest Ihr onLoad-Rätsel zu lösen. (Hinweis: Sie sollten onLoad niemals verwenden.)

Wenn Sie eine Site in Drupal erstellen und kein Modul finden, mit dem Sie das tun können, was Sie möchten, und wenn Sie viel PHP, Javascript oder benutzerdefiniertes What-Have-You schreiben, sollten Sie dies in Betracht ziehen ein neuer Ansatz.

Es gibt viele Front-End-Frameworks, die wahrscheinlich Bibliotheken anbieten, um das Verhalten zu erreichen, das Sie erreichen möchten. Versuchen Sie, eine zu finden, die Ihrem Problem nahe kommt, unter Last eine gute Leistung erbringt, und passen Sie sie dann an Ihre Verwendung an.

Aaronbauman
quelle
PLZ erweitern weiter
Monymirza