Auf einer Seite lasse ich mir ca. 10 Events als Liste ausgeben. Jeder Event hat im Schnitt 8-10 Bilder in einer Galerie (srcset).
Der Debugmodus zeigt mir ca. !380! Queries.... Kann das sein? Habe ich evtl. einen Fehler gemacht?
Viele Grüße,
Florian
Druckbare Version
Auf einer Seite lasse ich mir ca. 10 Events als Liste ausgeben. Jeder Event hat im Schnitt 8-10 Bilder in einer Galerie (srcset).
Der Debugmodus zeigt mir ca. !380! Queries.... Kann das sein? Habe ich evtl. einen Fehler gemacht?
Viele Grüße,
Florian
Es kommt ja noch mehr aus der Datenbank. Das Theme und die Stylesheets und Menü...
Das ist ja auch normal. Das sind aber nur so ca. 20 - max. 40 je nach Seite.
Die Eventlist holt jedes mal den kompletten Batzen aus der DB.
Schön wäre es, wenn man die Felder eingrenzen könnte. In einer Listenansicht brauche ich ja nicht die komplette Galerie... Die will ich in der Vorschau ja nicht anzeigen.
Grüße,
Florian
Das ist leider ein Nachteil der Core Module wie news und calendar. Die laden auch für die Liste alles aus der Datenbank (da du ja prinzipiell alle Daten in jedem Template zur Verfügung hast bzw. haben sollst).
Hier müsstest du dir etwas eigenes basteln.
Danke für die Info! Hab ich leider schon vermutet. Für eine „normale” Website sollte es ja kein Problem darstellen.
Schön wäre es aber, wenn man da in Zukunft etwas nachbessern könnte.
Programmatisch sollte sich der Aufwand ja einigermassen in Grenzen halten...
Grüße,
Florian
Naja, das ist eben nicht so einfach: Welche Felder sollen denn ausgegeben werden? Das müsste man also selbst bestimmen können
Dazu müsste dann eine Auswahl her.. das kannst du dir dann ja mal bei MetaModels anschauen. Das ist nicht unbedingt das was der normale Admin in Contao machen möchte vom Aufwand ;-)
Viele Grüße
Schön wärs aber schon, wenns die Möglichkeit irgendwann mal im Core gibt :)
Viele Grüße,
Florian
Solche Anforderungen sprengen den Rahmen der Core Module, denke ich.
Aber ein News/Eventlist Modul zu schreiben, das nur genau das lädt, was du brauchst, ist denke ich relativ schnell geschrieben (solange es nicht sehr flexibel sein muss) und damit wäre das Problem auch relativ schnell umgangen ;).
// hm, aber vielleicht wäre das ja doch etwas für den Core. Für die Performance der News/Eventlist reicht es ja oft (wie auch in diesem Fall), wenn einfach der Content nicht mitgeladen wird, sprich man könnte in den Modulen eine Checkbox einbauen (die für die backwards compatibility by default aktiv ist), mit der man steuern kann, ob auch der Content mitgeladen wird oder nicht und je nachdem wird dann dieser Block nicht ausgeführt. Oder man lässt den Inhalt sowieso nur on-demand direkt im Template laden.
Sowas in der Art z.B.!
Viele Grüße,
Florian
Das finde ich auch eine gute Idee. Nachrichteninhalte können sehr umfangreich sein, da wäre es schon sinnvoll, diese nur zu laden, wenn es ausdrücklich gewünscht ist.
Ja, vor allem wenn in den Nachrichteninhalten jeweils noch ne größere Galerie ist....
find die Idee von Spooky auch gut!
Feature request?
edit: Für Contao < 3.5.4:
Ich musste jetzt auch gerade in einem Projekt verhindern, dass für die Listenansicht der Events die tl_content ausgelesen wird. Die Ladezeit der Startseite, auf der 10 Events angezeigt werden verringerte sich durch den Eingriff von 12 auf 4 Sekunden, obwohl eigentlich nur Textelemente und Einzelbilder auf den Detailseiten der Events vorhanden sind.
SgdModuleEventlist.php:
ich wollte hier mal meine Lösung für Contao 3.4 rein stellen, falls jemand auch sowas braucht.PHP-Code:/**
* Class SgdModuleEventlist
* This class was introduced, because Events->addEvent(...) took too long to load all content
* elements, although those elements are not needed in the event lists
*
* it is connected to lists via config.php:
* $GLOBALS['FE_MOD']['events']['eventlist'] = "SgdModuleEventlist";
*
* @package Sgd
*/
class SgdModuleEventlist extends ModuleEventlist
{
/**
* Add an event to the array of active events
* @param object
* @param integer
* @param integer
* @param string
* @param integer
* @param integer
* @param integer
*/
protected function addEvent($objEvents, $intStart, $intEnd, $strUrl, $intBegin, $intLimit, $intCalendar)
{
if($objEvents->source == 'default') {
$objEvents->source = 'fake'; // 2016-06-14 ME: normally, source is 'default', and this 'fake' prevents addEvent from loading tl_content
}
parent::addEvent($objEvents, $intStart, $intEnd, $strUrl, $intBegin, $intLimit, $intCalendar);
}
}
Man muss seine Klasse natürlich dem ClassLoader über die autoload.php bekannt machen und in der config.php die Originalklasse zur Handhabung von Eventliste-Modulen ersetzen, was natürlich nur geht, wenn man in seinem Projekt angibt, dass das Veranstaltungsmodul vorher geladen werden soll.
config.php:
autoload.ini:PHP-Code:$GLOBALS['FE_MOD']['events']['eventlist'] = "SgdModuleEventlist";
autoload.php:PHP-Code:requires[] = "calendar"
PHP-Code:/**
** Register the classes
**/
ClassLoader::addClasses(array
(
'Sgd\SgdModuleEventlist'=> 'system/modules/sgd/classes/SgdModuleEventlist.php'
));
Man muss einfach nur auf Contao 3.5.4 oder besser aktualisieren, dort wird der Inhalt nicht mehr automatisch für jedes Event mit geladen, sondern nur wenn es in einem Template ausgegeben werden muss.
ah, gut zu wissen, danke.
Leider kann der Projekt-Server nur PHP 5.3 und ich muss noch eine Weile auf Contao 3.4 bleiben.
Wie genau wurde es denn jetzt gelöst?
edit:
Wird also immer noch der Content geladen, aber eben nur für die Events, die tatsächlich angezeigt werden (Limit, Pagination, ...), anstatt für alle, die noch nicht vorüber sind, hab ich das richtig verstanden?
das addEvent in 3.5.12 sieht nämlich immer noch so aus, dass bei source=='default' immer alles geladen wird ($strDetails .= $this->getContentElement()):
PHP-Code:// Display the "read more" button for external/article links
if ($objEvents->source != 'default')
{
$arrEvent['details'] = true;
$arrEvent['hasDetails'] = true;
}
// Compile the event text
else
{
$id = $objEvents->id;
$arrEvent['details'] = function () use ($id)
{
$strDetails = '';
$objElement = \ContentModel::findPublishedByPidAndTable($id, 'tl_calendar_events');
if ($objElement !== null)
{
while ($objElement->next())
{
$strDetails .= $this->getContentElement($objElement->current());
}
}
return $strDetails;
};
$arrEvent['hasDetails'] = (\ContentModel::countPublishedByPidAndTable($id, 'tl_calendar_events') > 0);
}
Also prinzipiell ist es so, dass nun nicht mehr von Haus aus die Content Elemente der News und Events geladen werden. Stattdessen ist nun die Variable "text" bzw. "details" in den News bzw. Event Templates eine Funktion, die dann die Inhaltselemente lädt. Somit werden die Inhalts Elemente immer nur dann geladen, wenn sie tatsächlich irgendwo ausgegeben werden.
Sieh dir den Code nochmal genauer an ;). Dort wird Details nur mit einer Funktion befüllt. Diese Funktion lädt die Inhaltselemente. Die Inhaltselemente werden also erst geladen, wenn diese Funktion ausgeführt wird. Und das passiert in den Templates, zB mitPHP-Code:<?= $this->details ?>
Du hast natürlich vollkommen recht :D
jetzt stopft man schon Funktionen in ein array... Sachen gibt's... da muss man erstmal drauf kommen.