Ergebnis 1 bis 13 von 13

Thema: 5.3.x: Datenbankabfrage per Ajax Request?

  1. #1
    Contao-Fan Avatar von grashalm
    Registriert seit
    17.06.2010.
    Ort
    Mainz
    Beiträge
    260
    Contao-Projekt unterstützen

    Support Contao

    Standard 5.3.x: Datenbankabfrage per Ajax Request?

    Hallo zusammen,

    ich nutze Contao 5.3.0 und die aktuellste Visitors-Erweiterung mit PHP 8.2.13. So weit, so gut.
    Ich möchte gerne die Werte im Frontend mithilfe des Templates mod_visitors_fe_all.html5 in
    Intervallen mit einem Ajax request aktualisieren lassen, damit die Werte auch ohne Reload der
    Seite neu geschrieben werden.

    Gibt es in Visitors eine Möglichkeit, diese Abfrage einzubauen, und wenn ja, wie sieht das aus?
    Ein Freund hat mir vor Längerem mal ein Script geschrieben und in das mod_visitors_fe_all.html5-
    Template integriert. Da ich keine Programmierkenntnisse habe, kann ich nicht beurteilen, ob er
    bereits auf dem richtigen Weg war. Das Script hat leider nie funktioniert.

    Hier mal der komplette Code vom Template mit dem angefügten Script:

    HTML-Code:
     <?php $this->extend("block_unsearchable"); ?>
    
    <?php $this->block("content"); ?>
    
    <?php foreach ($this->visitors as $visitor): ?>
    
        <span class="visitor_count invisible"><?= $visitor['VisitorsCounting']; ?></span>
        <div class="visitor_name">
            <div id="VisitorsNameLegend"><?= $visitor['VisitorsNameLegend']; ?></div>
            <div id="VisitorsName"><?= $visitor['VisitorsName']; ?></div>
        </div>
        <div class="visitor_useronline">
            <div id="VisitorsOnlineCountLegend"><?= $this->trans('visitors.VisitorsOnlineCountLegend'); ?></div>
            <div id="VisitorsOnlineCount"><?= $visitor['VisitorsOnlineCountValue']; ?></div>
        </div>
        <div class="visitor_visitstoday">
            <div id="TodayVisitCountLegend"><?= $this->trans('visitors.TodayVisitCountLegend'); ?></div>
            <div id="TodayVisitCount"><?= $visitor['TodayVisitCountValue']; ?></div>
        </div>
        <div class="visitor_visitstotal">
            <div id="TotalVisitCountLegend"><?= $this->trans('visitors.TotalVisitCountLegend'); ?></div>
            <div id="TotalVisitCount"><?= $visitor['TotalVisitCountValue']; ?></div>
        </div>
        <div class="visitor_hitstoday">
            <div id="TodayHitCountLegend"><?= $this->trans('visitors.TodayHitCountLegend'); ?></div>
            <div id="TodayHitCount"><?= $visitor['TodayHitCountValue']; ?></div>
        </div>
        <div class="visitor_hitstotal">
            <div id="TotalHitCountLegend"><?= $this->trans('visitors.TotalHitCountLegend'); ?></div>
            <div id="TotalHitCount"><?= $visitor['TotalHitCountValue']; ?></div>
        </div>
        <div class="visitor_visitsyesterday">
            <div id="YesterdayVisitCountLegend"><?= $this->trans('visitors.YesterdayVisitCountLegend');?></div>
            <div id="YesterdayVisitCount"><?= $visitor['YesterdayVisitCountValue']; ?></div>
        </div>
        <div class="visitor_hitsyesterday">
            <div id="YesterdayHitCountLegend"><?= $this->trans('visitors.YesterdayHitCountLegend'); ?></div>
            <div id="YesterdayHitCount"><?= $visitor['YesterdayHitCountValue']; ?></div>
        </div>
        <div class="visitor_pagehits">
            <div id="PageHitCountLegend"><?= $this->trans('visitors.PageHitCountLegend');?></div>
            <div id="PageHitCount"><?= $visitor['PageHitCountValue']; ?></div>
        </div>
        <div class="visitor_average">
            <?php if ($visitor['AverageVisits']): ?>
                <div id="AverageVisitsLegend"><?= $this->trans('visitors.AverageVisitsLegend'); ?>&nbsp;&Oslash;</div>
                <div id="AverageVisits"><?= $visitor['AverageVisitsValue']; ?></div>
        <?php endif; ?>
    </div>
    <?php if ($visitor['VisitorsStartDate']): ?>
        <div class="visitor_countsince">
           <div id="VisitorsStartDateLegend"><?= $this->trans('visitors.VisitorsStartDateLegend'); ?></div>
            <div id="VisitorsStartDate">&nbsp;<?= $visitor['VisitorsStartDateValue']; ?></div>
        </div>
    <?php endif; ?>
    
    <script>
    
        // Fügen Sie diese Funktion hinzu, um die Daten vom Server abzurufen und die HTML-Elemente zu aktualisieren
            function updateVisitorData() {
            var iWidth  = window.innerWidth  || (window.document.documentElement.clientWidth  || window.document.body.clientWidth);
            var iHeight = window.innerHeight || (window.document.documentElement.clientHeight || window.document.body.clientHeight);
            var sWidth  = screen.width;
            var sHeight = screen.height;
            var visitorId = <?= $visitor['VisitorsKatID']; ?>;
            var visitorUrl = '<?= $this->route('visitors_frontend_screencount') ?>?vcid=' + visitorId +'&scrw='+sWidth+'&scrh='+sHeight+'&scriw='+iWidth+'&scrih='+iHeight+'';
            console.log('url: ', visitorUrl);
                                                                   try {
    
                        fetch( visitorUrl, { method: 'GET' , headers: { 'X-Requested-With': 'XMLHttpRequest', } } )
                          .then(response => response.json())
                            .then(data => {
                                document.querySelectorAll(".visitor_count").forEach(el => {
                                    el.innerHTML = data.VisitorsCounting;
                                });
                                document.querySelectorAll("#VisitorsName").forEach(el => {
                                    el.innerHTML = data.VisitorsName;
                                });
                                document.querySelectorAll("#VisitorsOnlineCount").forEach(el => {
                                    el.innerHTML = data.VisitorsOnlineCountValue;
                                });
                                document.querySelectorAll("#TodayVisitCount").forEach(el => {
                                    el.innerHTML = data.TodayVisitCountValue;
                                });
                                document.querySelectorAll("#TotalVisitCount").forEach(el => {
                                    el.innerHTML = data.TotalVisitCountValue;
                                });
                                document.querySelectorAll("#TodayHitCount").forEach(el => {
                                    el.innerHTML = data.TodayHitCountValue;
                                });
                                document.querySelectorAll("#TotalHitCount").forEach(el => {
                                    el.innerHTML = data.TotalHitCountValue;
                                });
                                document.querySelectorAll("#YesterdayVisitCount").forEach(el => {
                                    el.innerHTML = data.YesterdayVisitCountValue;
                                });
                                document.querySelectorAll("#YesterdayHitCount").forEach(el => {
                                    el.innerHTML = data.YesterdayHitCountValue;
                                });
                                document.querySelectorAll("#PageHitCount").forEach(el => {
                                    el.innerHTML = data.PageHitCountValue;
                                });
                                document.querySelectorAll("#AverageVisits").forEach(el => {
                                    el.innerHTML = data.AverageVisitsValue;
                                });
                                document.querySelectorAll("#VisitorsStartDate").forEach(el => {
                                    el.innerHTML = data.VisitorsStartDateValue;
                                });
                            })
    
                        .catch( error => console.error('error:', error) );
    
                    } catch (r) {
    
                        return;
                  }
    
           }
    
        // Fügen Sie diese Funktion hinzu, um den Timer alle 10 Sekunden zu starten
        function startVisitorTimer() {
            setInterval(updateVisitorData, 10000);
        }
        // Starten Sie den Timer, wenn das Dokument geladen ist
        document.addEventListener('DOMContentLoaded', startVisitorTimer);
    
    </script>
    
    <?php endforeach; ?>
    <?php $this->endblock(); ?>
    Hat jemand eine Ahnung, wie das Script evtl. umgeschrieben werden muss, damit es funktioniert?
    Vielen Dank für Eure Hilfe!
    Geändert von grashalm (24.02.2024 um 00:46 Uhr)
    wie gut, dass es contao gibt! wie gut, dass es spooky und euch alle gibt!

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    das wäre eine ggf. Variante gewesen https://github.com/szonn/contao-ajax-reload-element/ läuft aber noch nicht mit C5 - Du könntest den Entwickler mal anschreiben

  3. #3
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Das ganze Modul per Ajax zu laden wäre fatal, weil dann jedesmal dieser Request als Zugriff gezählt werden würde.
    Es gibt derzeit keine Möglichkeit per Ajax nur an die Statistikdaten zu kommen.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  4. #4
    Contao-Fan Avatar von grashalm
    Registriert seit
    17.06.2010.
    Ort
    Mainz
    Beiträge
    260
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Danke Euch beiden für Eure Einschätzung.

    BugBuster
    Das ganze Modul per Ajax zu laden wäre fatal, weil dann jedesmal dieser Request als Zugriff gezählt werden würde.
    Es gibt derzeit keine Möglichkeit per Ajax nur an die Statistikdaten zu kommen.
    Meinst Du damit das gesamte Template oder nur das Script im Template?
    Gibt es eventuell noch eine andere Möglichkeit abseits von Ajax?
    wie gut, dass es contao gibt! wie gut, dass es spooky und euch alle gibt!

  5. #5
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    455

    Standard

    Zitat Zitat von grashalm Beitrag anzeigen
    Danke Euch beiden für Eure Einschätzung.
    Meinst Du damit das gesamte Template oder nur das Script im Template?
    Gibt es eventuell noch eine andere Möglichkeit abseits von Ajax?
    Es wäre weiterhin über einen asynchronen request auf eine URL-Route (AJAX, fetch, wie man es heutzutage auch nennt) möglich,
    aber mit einem Controller, welche eine Route bereitstellt, über jene nur die Daten der Datenbank abgerufen werden.

    Diese könnten wie auch in deinem Beispiel über JavaScript die Daten alle x Sekunden aktualisieren.

    Eventuell als Feature-Request und beauftragen? Ist eine schnelle Sache und sicherlich ne schöne Contribution.

  6. #6
    Contao-Fan Avatar von grashalm
    Registriert seit
    17.06.2010.
    Ort
    Mainz
    Beiträge
    260
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Es wäre weiterhin über einen asynchronen request auf eine URL-Route (AJAX, fetch, wie man es heutzutage auch nennt) möglich,
    aber mit einem Controller, welche eine Route bereitstellt, über jene nur die Daten der Datenbank abgerufen werden.

    Diese könnten wie auch in deinem Beispiel über JavaScript die Daten alle x Sekunden aktualisieren.

    Danke für Deine Ergänzung, zoglo.

    Ich hatte das Feature 2019 schon mal in BugBuster's Wünsche-Forum gepostet, aber ich vermute, dass einfach keine Zeit dafür da war.
    Kann sich jemand vorstellen, mir das gegen eine entsprechende Finanzierung zu programmieren?
    Wenn Du sagst, das ist eine schnelle Sache, dann sollten sich die Kosten ja auch im Rahmen halten...
    Am liebsten wäre mir natürlich, wenn Du, BugBuster, das selber übernehmen würdest. Aber wenn die Zeit einfach nicht reicht, dann auch
    gerne jemand anderes, der die programmiertechnischen Fähigkeiten hat - ich habe sie leider nicht...

    Wer würde mir das gerne programmieren?
    wie gut, dass es contao gibt! wie gut, dass es spooky und euch alle gibt!

  7. #7
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von grashalm Beitrag anzeigen
    Danke Euch beiden für Eure Einschätzung.



    Meinst Du damit das gesamte Template oder nur das Script im Template?
    Gibt es eventuell noch eine andere Möglichkeit abseits von Ajax?
    Ich bezog mich da auf die Erweiterung szonn/contao-ajax-reload-element/
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  8. #8
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von grashalm Beitrag anzeigen
    Danke für Deine Ergänzung, zoglo.

    Ich hatte das Feature 2019 schon mal in BugBuster's Wünsche-Forum gepostet, aber ich vermute, dass einfach keine Zeit dafür da war.
    Kann sich jemand vorstellen, mir das gegen eine entsprechende Finanzierung zu programmieren?
    Wenn Du sagst, das ist eine schnelle Sache, dann sollten sich die Kosten ja auch im Rahmen halten...
    Am liebsten wäre mir natürlich, wenn Du, BugBuster, das selber übernehmen würdest. Aber wenn die Zeit einfach nicht reicht, dann auch
    gerne jemand anderes, der die programmiertechnischen Fähigkeiten hat - ich habe sie leider nicht...

    Wer würde mir das gerne programmieren?
    In deinem gezeigtem angepasstem Template ist bereits eine Route von mir enthalten, die aber nur zum Senden von Daten vorgesehen ist.
    Für die Abfrage aktueller Werte müsste ich eine weitere Route + Controller bauen.
    Das wäre im Prinzip kein Problem, nur müsste ich mich damit beschäftigen wie ich das genau zurückgeben muss , das es wie in deinem Beispiel auszuwerten wäre.

    Hab das mal in ein Ticket verpackt.
    https://github.com/BugBuster1701/con...dle/issues/160
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  9. #9
    Contao-Fan Avatar von grashalm
    Registriert seit
    17.06.2010.
    Ort
    Mainz
    Beiträge
    260
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo, BugBuster!

    Super, vielen lieben Dank!

    Solltest Du das eines Tages umgesetzt haben, sag mir Bescheid. Dann können wir gerne mal über eine finanzielle (oder anders geartete) Anerkennung reden.
    Bis dahin währt meine Vorfreude...
    wie gut, dass es contao gibt! wie gut, dass es spooky und euch alle gibt!

  10. #10
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Zwischenstatus: Sieht gut aus :-)
    Fehlen noch Kleinigkeiten, siehe Ticket

    Es darf aber noch nicht CSP (Content-Security-Policy) im Startpunkt eingeschaltet sein, das wäre das nächste Ticket.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  11. #11
    Contao-Fan Avatar von grashalm
    Registriert seit
    17.06.2010.
    Ort
    Mainz
    Beiträge
    260
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo BugBuster,

    super, ich freue mich schon wie ein Kind auf Weihnachten!!! ;-)
    Im Moment habe ich CSP auch noch nicht aktiviert (weil ich gar nicht weiß, was ich da eingeben sollte).
    Bis ich das weiß, und bis ich das eventuell mal aktiviere, hast Du möglicherweise das erwähnte Folgeticket
    auch schon bearbeitet...

    Herzliche Grüße, grashalm
    wie gut, dass es contao gibt! wie gut, dass es spooky und euch alle gibt!

  12. #12
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    455

    Standard

    Zitat Zitat von grashalm Beitrag anzeigen
    Im Moment habe ich CSP auch noch nicht aktiviert (weil ich gar nicht weiß, was ich da eingeben sollte)
    Ah, hab es mal im Slack geschrieben aber ist auch passend, gerade für die Cookiebar in Version 2

    Für Skripte und Styles deiner eigenen Seite:
    Code:
    default-src 'self' data:;
    script-src 'self';
    style-src 'self';
    Das hier ist ein Beispiel für Google Analytics mit Google Tag Manager
    Code:
    default-src 'self' data:;
    script-src 'self' https://*.googletagmanager.com;
    style-src 'self';
    img-src 'self' https://*.google-analytics.com https://*.googletagmanager.com;
    connect-src 'self' https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com
    Und hier einmal alle Hinweise zu CSP


    Und wenn man externe Dienste nutzt, hat jeder Dienst nochmal schöne Dokus:

  13. #13
    Contao-Fan Avatar von grashalm
    Registriert seit
    17.06.2010.
    Ort
    Mainz
    Beiträge
    260
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ja super, vielen Dank, zoglo!
    Dann muss sich BugBuster ja doch beeilen mit der Bearbeitung des Folgetickets...

    Grüße, grashalm
    wie gut, dass es contao gibt! wie gut, dass es spooky und euch alle gibt!

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •