Liste der Anhänge anzeigen (Anzahl: 1)
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):
Anhang 22384
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