Contao-Camp 2024
Ergebnis 1 bis 4 von 4

Thema: 4.7.: Nachrichtenmenü mit Datum vor 1970 SQl-Statement updatesicher?

  1. #1
    Contao-Nutzer
    Registriert seit
    03.03.2010.
    Ort
    82194 Gröbenzell
    Beiträge
    188

    Frage 4.7.: Nachrichtenmenü mit Datum vor 1970 SQl-Statement updatesicher?

    Hallo,

    Ich habe ein Archiv "gebastelt" mit dem Nachrichtenmodul. Das Archiv beginnt im Jahr 1960 bis heute.

    Dazu habe ich unter webspacepfad/app/Resources/contao/dca die tl_news.php angelegt und mit diesem Code gefüllt:

    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
    /** Hoffentlich die Anpassung für mein Newsproblem
    **/

    $GLOBALS['TL_DCA']['tl_news']['fields']['date']['sql'] = "bigint(20) NOT NULL default '0'";
    $GLOBALS['TL_DCA']['tl_news']['fields']['time']['sql'] = "bigint(20) NOT NULL default '0'";

    ?>
    Damit kann die Datenbank mit negativen Timestamps gefüllt werden. Die Nachrichten können dann mit dem entsprechenden Datum versehen werden (1960-02-15).

    Das Modul Nachrichtenarchiv-Menü bekommt das Archivformat Monat. Leider werden im Modul die Werte nicht als Datum ausgelesen.

    Deshalb habe ich unter webspace/vendor/contao/news-bundle/src/Resources/contao/modules in der Datei ModuleNewsMenu.php das SQL geändert.
    PHP-Code:
    protected function compileYearlyMenu()
        {
            
    $arrData = array();
            
    $time Date::floorToMinute();

            
    // Get the dates
            //Anpassung für Jahre < 1970
            /* Original
            $objDates = $this->Database->query("SELECT FROM_UNIXTIME(date, '%Y') AS year, COUNT(*) AS count FROM tl_news WHERE pid IN(" . implode(',', array_map('\intval', $this->news_archives)) . ")" . ((!BE_USER_LOGGED_IN || TL_MODE == 'BE') ? " AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND published='1'" : "") . " GROUP BY year ORDER BY year DESC");
            */
            
    $objDates $this->Database->query("SELECT YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL date SECOND)) AS year, COUNT(*) AS count FROM tl_news WHERE pid IN(" implode(','array_map('\intval'$this->news_archives)) . ")" . ((!BE_USER_LOGGED_IN || TL_MODE == 'BE') ? " AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time 60) . "') AND published='1'" "") . " GROUP BY year ORDER BY year DESC");
            
            while (
    $objDates->next())
            {
                
    $arrData[$objDates->year] = $objDates->count;
            } 
    und

    PHP-Code:
    protected function compileMonthlyMenu()
        {
            
    $arrData = array();
            
    $time Date::floorToMinute();

            
    // Get the dates
            /* Anpassung für Jahre < 1970
            Original:
            $objDates = $this->Database->query("SELECT FROM_UNIXTIME(date, '%Y') AS year, FROM_UNIXTIME(date, '%m') AS month, COUNT(*) AS count FROM tl_news WHERE pid IN(" . implode(',', array_map('\intval', $this->news_archives)) . ")" . ((!BE_USER_LOGGED_IN || TL_MODE == 'BE') ? " AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time + 60) . "') AND published='1'" : "") . " GROUP BY year, month ORDER BY year DESC, month DESC");
            */
            
    $objDates $this->Database->query("SELECT YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL date SECOND)) AS year, MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL date SECOND)) AS month, COUNT(*) AS count FROM tl_news WHERE pid IN(" implode(','array_map('\intval'$this->news_archives)) . ")" . ((!BE_USER_LOGGED_IN || TL_MODE == 'BE') ? " AND (start='' OR start<='$time') AND (stop='' OR stop>'" . ($time 60) . "') AND published='1'" "") . " GROUP BY year, month ORDER BY year DESC, month DESC");

            while (
    $objDates->next())
            {
                
    $arrData[$objDates->year][$objDates->month] = $objDates->count;
            } 
    Das DATE_ADD wandelt die negativen Timestamps in korrekte Datumswerte um. Das Menü sieht dann auf der Webseite so aus (Intranet, deshalb kann ich keinen Link bieten):
    s_05.06.2019-09-01.png

    Mir ist bewusst, dass das nicht updatsicher ist. Deshalb die Frage: bekomme ich das irgendwie updatesicher hin? Kann ich den Select irgendwohin auslagern? Oder muss ich ein eigenes Modul schreiben?

    Vielen Dank für Eure Hilfe.

    Gruß Armin

  2. #2
    Contao-Fan Avatar von Stefko
    Registriert seit
    25.10.2012.
    Ort
    Karlsruhe
    Beiträge
    771
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von armin41 Beitrag anzeigen
    Deshalb die Frage: bekomme ich das irgendwie updatesicher hin? Kann ich den Select irgendwohin auslagern? Oder muss ich ein eigenes Modul schreiben?
    zB in dcaconfig.php schau mal hier:
    https://community.contao.org/de/show...l=1#post449182
    Grüße, Stefko

  3. #3
    Contao-Nutzer
    Registriert seit
    03.03.2010.
    Ort
    82194 Gröbenzell
    Beiträge
    188

    Standard

    Hallo Stefko,

    den Thread kenne ich, daher habe ich ja die Lösung in webspacepfad/app/Resources/contao/dca/tl_news.php die Datumsfelder in biginit umzuwandeln. Das funktioniert auch updatesicher.

    In webspace/vendor/contao/news-bundle/src/Resources/contao/modules/ModuleNewsMenu.php gibt es die Funktion compileYearlyMenu() und compileMonthlyMenu(), dort habe ich das SQL angepasst. Diesen Select würde ich gerne updatesicher machen.

    Gruß Armin

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.883
    Partner-ID
    10107

    Standard

    Dazu musst du ein eigenes Modul machen, dass das reguläre Archivmodul ersetzt bzw. als neues Modul zur Verfügung steht.

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
  •