Ajax - Liste nachladen

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Ajax - Liste nachladen

Beitrag von Coach83 » 01.03.2014, 13:52:31

ich hab mal wieder eine Frage: Auf meiner Seite hab ich mittels DC und Template eine Liste aktueller News eingeblendet. Wird durch einen Benutzer ein Eintrag verändert, muss sich die Sortierung ändern - weil die Liste nach dem Modification bzw. CreationTimestamp geordnet wird.
Das würde ich doch am Einfachsten mittels Ajax-Request durchführen und das News-Div updaten. Kann ich dieses Template direkt ansteuern?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Ajax - Liste nachladen

Beitrag von dr.e. » 02.03.2014, 00:51:39

Hallo Coach,

das funktioniert ohne Probleme. Schreibe dir dazu einfach eine Front-Controller-Action, die nur das Template rendered, das du haben möchtest.

Eine erste Idee kann dir http://wiki.adventure-php-framework.org ... _einbinden geben. Dort wird gezeigt, wie du den Page-Controller nutzen kannst um dein Template zu rendern. Für deinen Anwendungsfall reicht daher (vermutlich) ein:

Code: Alles auswählen

class AjaxNewsAction extends AbstractFrontcontrollerAction {

   public function run() {

      $page = new Page();
      $page->loadDesign('VENDOR\..\news\templates', 'news');
      $output = $page->transform();

      echo OutputFilterChain::getInstance()->filter($output);

      exit;
   }

} 
Bei Bedarf kannst du noch die Parameter deines Action-Requests an die Page übergeben oder in das $_REQUEST mappen.

Davor natürlich noch ein

Code: Alles auswählen

use APF\core\frontcontroller\AbstractFrontcontrollerAction;
use APF\core\filter\OutputFilterChain;
Hoffe das hilft dir! :)
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Ajax - Liste nachladen

Beitrag von Coach83 » 03.03.2014, 12:51:00

Danke, das tat es. Musste nur noch den Context entsprechend mit

Code: Alles auswählen

        $page->setContext($this->getContext());
setzen.
Danke :-)!

Noch ne zwei weitere Frage hab ich jetzt allerdings:
1. Ich will die News so sortieren, dass sie nach Creation+ ModificationTimestamp absteigend sortiert ist. D.h. wenn eine News editiert wurde, soll sie nach oben rücken.
Ist das mit dem GORM einfach umsetzbar?

2. Wie kann ich es denn am Einfachsten realisieren, dass die News automatisch erscheinen (ohne Page-Refresh oder ständige Anfrage mittels AJAX-Script), wenn ein anderer Autor eine News geschrieben hat?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Ajax - Liste nachladen

Beitrag von dr.e. » 03.03.2014, 23:45:13

Hallo Coach,
1. Ich will die News so sortieren, dass sie nach Creation+ ModificationTimestamp absteigend sortiert ist. D.h. wenn eine News editiert wurde, soll sie nach oben rücken.
Ist das mit dem GORM einfach umsetzbar?
Der GORM verwaltet intern die Felder CreationTimestamp und ModificationTimestamp. Beide kannst du nutzen um deine Abfrage zu formulieren. Mit einem GCO geht das in etwa so:

Code: Alles auswählen

$orm = ...;
$crit = new GenericCriterionObject();
$crit
      ->addOrderIndicator('CreationTimestamp', 'DESC')
      ->addOrderIndicator('ModificationTimestamp', 'DESC');
$news = $orm->loadObjectListByCriterion('News', $crit); 
Alternativ kannst du deine Liste auch per loadObjectListByTextStatement() laden.
2. Wie kann ich es denn am Einfachsten realisieren, dass die News automatisch erscheinen (ohne Page-Refresh oder ständige Anfrage mittels AJAX-Script), wenn ein anderer Autor eine News geschrieben hat?
Das kannst du beispielsweise per Web-Socket (siehe z.B. http://de.wikipedia.org/wiki/WebSocket) realisieren. Alternativ lassen sich auch lange geöffnete HTTP-Anfragen nutzen, die vom Server nur dann Inhalte zurück geben und sich schließen, wenn ein neuer Post da ist. Facebook hat/hatte das IMHO für seinen Chat so realisiert.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Ajax - Liste nachladen

Beitrag von Coach83 » 04.03.2014, 22:54:56

Danke erst mal für die Antwort.

Wird beim GORM dann nicht zuerst nach dem Erstellungs- und erst dann dem Modifizierungsdatum sortiert?
Ich möchte ja quasi ne Mischform: Ist eine modifizierte News neuer, soll sie vor dem nächst-älteren Erstellungsdatum liegen.

Auf der Suche nach einem Socket bin ich auf socket.io gestoßen - hast Du damit Erfahrungen? Oder gibts "bessere" für meinen Anwendungsfall?


Warum erhalte ich eigentlich keine Mail mehr bei neuen Beiträgen :-)?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Ajax - Liste nachladen

Beitrag von dr.e. » 05.03.2014, 00:25:23

Hallo Coach,
Wird beim GORM dann nicht zuerst nach dem Erstellungs- und erst dann dem Modifizierungsdatum sortiert?
Ich möchte ja quasi ne Mischform: Ist eine modifizierte News neuer, soll sie vor dem nächst-älteren Erstellungsdatum liegen.
MIt den o.g. Abfragen kannst du das selbst definieren. Der GORM sortiert per default erst mal nicht.
Auf der Suche nach einem Socket bin ich auf socket.io gestoßen - hast Du damit Erfahrungen? Oder gibts "bessere" für meinen Anwendungsfall?
Nicht direkt, sollte aber für deinen Anwendungsfall ausreichend sein.
Warum erhalte ich eigentlich keine Mail mehr bei neuen Beiträgen :-)?
Hmm. :) :roll: Weiß ich nicht! Hast du das Thema aboniert?
Viele Grüße,
Christian

dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

Re: Ajax - Liste nachladen

Beitrag von dingsda » 05.03.2014, 01:16:31

dr.e. hat geschrieben:Hallo Coach,
Wird beim GORM dann nicht zuerst nach dem Erstellungs- und erst dann dem Modifizierungsdatum sortiert?
Ich möchte ja quasi ne Mischform: Ist eine modifizierte News neuer, soll sie vor dem nächst-älteren Erstellungsdatum liegen.
MIt den o.g. Abfragen kannst du das selbst definieren. Der GORM sortiert per default erst mal nicht.
ich glaub die sortierung wie er sie möchte wir er aber nicht so einfach hinbekommen. hab zwar jetzt noch nicht so genau raus, wie der gorm arbeitet aber ich denke mal

Code: Alles auswählen

     ->addOrderIndicator('CreationTimestamp', 'DESC')
      ->addOrderIndicator('ModificationTimestamp', 'DESC'); 
führt auch nur dazu, dass am ende im sql-query sowas drin steht:

Code: Alles auswählen

... order by 'CreationTimestamp' desc, 'ModificationTimestamp' desc 
das führt dazu, dass primär nach dem CreationTimestamp sortiert wird und wenn zwei einträge zur selben zeit erstellt wurden werden diese dann nach dem ModificationTimestamp sortiert.
also so:

Code: Alles auswählen

id     |     CreationTimestamp   |    ModificationTimestamp 
-------+-------------------------+----------------------------------
5      |   2009-12-04            |    0000-00-00
-------+-------------------------+----------------------------------
4      |   2009-12-01            |    2009-12-02
-------+-------------------------+----------------------------------
3      |   2009-12-01            |    0000-00-00
-------+-------------------------+----------------------------------
2      |   2009-11-20            |    2009-12-05
-------+-------------------------+----------------------------------
1      |   2009-11-10            |    2009-12-06
was er aber eigentlich möchte ist das:

Code: Alles auswählen

id     |     CreationTimestamp   |    ModificationTimestamp 
-------+-------------------------+----------------------------------
1      |   2009-11-10            |    2009-12-06
-------+-------------------------+----------------------------------
2      |   2009-11-20            |    2009-12-05
-------+-------------------------+----------------------------------
5      |   2009-12-04            |    0000-00-00
-------+-------------------------+----------------------------------
4      |   2009-12-01            |    2009-12-02
-------+-------------------------+----------------------------------
3      |   2009-12-01            |    0000-00-00
glaub nicht, dass das so einfach geht, weil das auch keine übliche sortierierung ist.

die einfachste möglichkeit wär für mich den modificationTimestamp auch beim ersten speichern eines objekts auf diesen zeitpunkt zu setzen z.b mit nem trigger. dann braucht man nur noch nach dem modificationTimestamp zu sortieren und hat immer das richtige ergebniss.
gibt aber bestimmt noch andere möglichkeiten

lg

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Ajax - Liste nachladen

Beitrag von Coach83 » 05.03.2014, 10:11:40

Genau das hab ich gesucht. Habe es jetzt wie folgt gelöst:

Code: Alles auswählen

$query = 'SELECT ent_news.*, IF(ModificationTimestamp != "0000-00-00 00:00:00", ModificationTimestamp, CreationTimestamp) '
                    . 'AS myTimestamp FROM ent_news ORDER BY myTimestamp DESC';
            return  $this->ORM->loadObjectListByTextStatement('News', $query);
Wenn also der ModificationTimestamp geändert wurde wird dieser genommen, ansonsten der CreationTimestamp.
Danke euch!

dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

Re: Ajax - Liste nachladen

Beitrag von dingsda » 05.03.2014, 10:45:29

Coach83 hat geschrieben:Habe es jetzt wie folgt gelöst
auch ne möglichkeit. dachte das query würde komplizierter werden, weil ich da mal was kompliziertes in google gefunden hatte. aber das geht ja eigentlich voll.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast