Leere Kategorien ausblenden und Cache neu erstellen

Hallo zusammen, da es bei Shopware die Funktion nicht gibt habe ich einen kleinen Cron geschrieben welcher die Kategorien, die leer sind ausschaltet. Wir aktualisieren Mengen und Preise direkt in der Datenbank und daher rutschen immer mal leere Kategorien durch bzw. sind wieder gefüllte Kategorien nicht aktiv. Das ganze klappt auch recht gut. Das Script ist sicher nicht perfekt aber es erfüllt seinen Zweck. Anbei mal der Code zur allgemeinen Verwendung oder Optimierung. [code]<?php //Datenbank Daten
$servernameSM = “";
$usernameSM = "
”;
$passwordSM = “";
$dbnameSM = "
”;

// Create connection
$connSM = new mysqli($servernameSM, $usernameSM, $passwordSM, $dbnameSM);
// Check connection
if ($connSM->connect_error) { die("Connection failed: " . $connSM->connect_error); } //SQL Befehl auslesen der letzten Kategorien der Datenbank $sqlLastCat = “SELECT cat.id, cat.parent, cat.description FROM s_categories as cat WHERE NOT EXISTS (SELECT * FROM s_categories WHERE cat.id = parent) AND stream_id IS NULL”; $resultSqlLastCat = $connSM->query($sqlLastCat); if ($resultSqlLastCat->num_rows > 0) { //Alle letzten Kategorien durchlaufen while($rowLastCat = $resultSqlLastCat->fetch_assoc()) { //Auslesen Anzahl der Kategorien mit 0 Produkten $sqlActiveProducts = “SELECT COUNT(s_articles.active) as anzahl FROM s_articles, s_articles_categories WHERE s_articles.id = s_articles_categories.articleID AND s_articles_categories.categoryID = “.$rowLastCat[“id”].” AND s_articles.active = 1”; $resultActiveProducts = $connSM->query($sqlActiveProducts); while($rowCountActive = $resultActiveProducts->fetch_assoc()) { //Wenn Anzahl 0 Kategorie ausschalten if ($rowCountActive[“anzahl”] == 0) { $sqlDeactivateCategories = "UPDATE s_categories SET active = 0 WHERE id = ".$rowLastCat[“id”]; $connSM->query($sqlDeactivateCategories); } //Wenn Anzahl nicht 0 Kategorie anschalten else { $sqlActivateCategories = "UPDATE s_categories SET active = 1 WHERE id = ".$rowLastCat[“id”]; $connSM->query($sqlActivateCategories); } } } } $connSM->close(); ?>[/code] Wie gesagt das ganze klappt soweit recht gut. Das einzige Problem ist noch der Templatecache. Die neu ausgeschalteten Kategorien werden erst nach aufwärmen des caches ausgeblendet. Frage wäre jetzt kann ich diesen direkt in dem Script neu erstellen lassen? Habe dazu den Aufruf gefunden engine/Shopware/Components/HttpCache/ Wenn ich das in den Browser hacke wird der Zugang verweigert. Kann mir jemand helfen. Vielen Dank!

Hallo, auch wenn ich mich mal wieder als unwissender oute. Wie binde ich denn diesen CronJob vernünftig ein ? Um Ihn im Backend zu verwenden müsste ich das ganze ja als PlugIn verpacken. Oder stehe ich jetzt auf dem Schlauch? Schönes Wochenende Ingo

Hi Ingo, so wie ich das Script verstehe, läuft das komplett eigenständig und außerhalb von Shopware, direkt auf der DB. Es ist also kein Plugin. @sep1703: Für dich gibt es verschiedene Lösungen. Grundsätzlich dürfte weniger das *aufwärmen* des Caches als das *Leeren* des Caches das Problem sein. Ich vermute auch eher, dass nicht der Template-Cache, sondern der HTTP-Cache das Problem ist, den hast du da ja auch angegeben. Dir fehlt die sogenannte Cache-Invalidierung - nachdem du eine Kategorie entfernt hast, möchtest du dem HTTP-Cache sagen, dass die entsprechenden Seiten nicht mehr aktuell sind. Das ist viel besser, als immer den gesamten HTTP-Cache zu leeren (was aber manchmal auch nötig sein kann). Den Cache komplett leeren kannst du ja einfach, indem du var/cache/clear_cache.sh aufrufst - das ist natürlich die Holzhammer-Methode, die ich eher nicht empfehlen würde. Die zweite Variante wäre das Leeren des Caches mittels der Rest-API, vgl https://developers.shopware.com/develop … rce-cache/. Auch da wird jeweils der gesamte Cache geleert. Falls du diesen Weg gehst, kannst du mit dem Konsolen-Commando php bin/console sw:warm:http:cache den Cache danach neu aufbauen. Möglichkeit drei (und eigentlich die schönste Variante), ist, die Cache-Invalidierung manuell aus deinem Script heraus anzustoßen. Das kannst du dir hier einfach abschauen: \Shopware_Plugins_Core_HttpCache_Bootstrap::invalidateCacheId. Da siehst du, dass wir mittels eines HTTP-Clients einen BAN-Request gegen den Cache machen und mittels des Headers “x-shopware-invalidates” dann bspw. die Cache-ID “c-15” leeren - also alle Seiten, die Kategorie 15 beinhalten. Besten Gruß, Daniel

Hallo Daniel, danke für Deine Ausführungen. Die Frage die sich mir stellt, wie binde ich innerhalb von Shopware (also über das Backend) einen Cron-Job ein ? Gibt es da irgendeine Vorlage/HowTo in welches ich dann nur noch dieses Script reinkopieren müsste. Oder muss ich auf die Kommandozeile und das direkt in Linux irgendwie einbinden. Ingo