git – Ändern der Groß-/Klein-Schreibweise von Ordnern

Neulich stieß ich auf das Problem, dass ich die Schreibweise eines Verzeichnisses geändert hatte. In der lokalen Working-Kopie wurde die Schreibweise korrekt angezeigt, GitLab zeigte mir die Änderung auch korrekt, jedoch änderte sich am Server nichts. Dort blieb die alte Schreibweise :-(

Eine simple und schnelle Lösung fand ich nach einigem Suchen:

git mv src/Mydir src/mydirs
git mv src/mydirs src/mydir
git commit -m "Rename folder Mydir to mydir"

Quelle

Thunfisch-Steaks auf Lauchgemüse

Ein schönes, einfaches und schnelles Rezept:
Thunfisch-Steaks auf Lauchgemüse

Der Flüssigkeitsanteil im Gemüse erschien mir etwas wenig, weshalb es verdoppelt wurde. Während des Essens zeigte sich, dass das Gemüse auch etwas wenig war – hier könnte auch die doppelte Menge nicht schaden.

Fazit:
Nächstes Mal
– 4 (statt 2) Lauch
– 100ml Wein sowie 100ml Brühe/Sahne

(als PDF-Backup)

Kategorien in EXT:solr nutzen

Schnell kommt man an den Punkt, an dem man Solr zusammen mit Kategorien bzw. Hierarchien als Facetten nutzen möchte. Die kurze Zusammenfassung meiner ersten Erfahrungen und Lösungswege:

Datenstruktur

Die zu kategorisierenden Datensätze müssen mittels System Kategorien (sys_category) gruppiert werden. Hierfür braucht gar nicht viel im TCA rumhantiert zu werden, da der TYPO3 Core das passende Hilfsmittel (ExtensionManagementUtility::makeCategorizable()) liefert .

Kategorien indizieren

Wie die Kategorie-Zuordnung mit indiziert wird, erklärt Steffen in seinem Blog-Beitrag „EXT:solr – Use categories as hierarchical facets„.
(Inzwischen ist „category“ als Feld in Solr vorhanden, sodass kein dynamisches Feld mehr nötig ist (category_stringM => category))

plugin.tx_solr.index {
  fieldProcessingInstructions {
    category = categoryUidToHierarchy
  }
  queue.MYTYPE.fields {
    category = SOLR_RELATION
    category {
      localField = categories
      foreignLabelField = uid
      multiValue = 1
    }
  }
}

Durch den Beitrag stößt man auch auf die Details der Implementierung, v.a. die Field Processors und den konkreten categoryUidToHierarchy (Classes/FieldProcessor/CategoryUidToHierarchy.php). Beim Blick in den Code wird klar, dass er nur mit Systemkategorien arbeitet.

Frontend-Ausgabe

Seit die Solr-Extension auf Fluidtemplates aufbaut, ist die Konfiguration der Facette vereinfacht (Früher war ein HMENU nötig):

plugin.tx_solr {
  search {
    faceting {
      facets {
        category {
          label = Category
          field = category
          type = hierarchy
        }
      }
    }
  }
}

Damit nutzt Solr automatisch das Hierarchy-Partial, und man bekommt einem Baum aus Kategorie-UIDs und der Anzahl der enthaltenen Datensätze angezeigt.

Und die Kategorie-Titel? Dafür braucht es einen kleinen Kniff mit TypoScript und eine kleine Änderung am Fluid-Template.

Via TypoScript legen wir uns ein cObject bereit, das uns den Titel einer System-Kategorie ausgibt:

lib.tx_solr.sys_category_title = RECORDS
lib.tx_solr.sys_category_title {
   source.current = 1
   tables = sys_category
   dontCheckPid = 1
   conf.sys_category = TEXT
   conf.sys_category.field = title
   conf.sys_category.htmlSpecialChars = 1
}

Im Hierarchy-Partial ersetzen wir in der Section ‚hierarchyTree‘ das {childNode.label} gegen:

<f:cObject typoscriptObjectPath="lib.tx_solr.sys_category_title">{childNode.label}</f:cObject>

 

Fertig!

 

Links

(Artikel basiert auf TYPO3 8.7.16 und EXT:solr 8.0.3)

French Rolls – Bacon & Frischkäse

Leider hat mich bisher noch niemand drauf hingeweisen gehabt. Aber French Rolls haben einiges an Potential!
Im konkreten Fall hatte ich etwas viel Chili-Flocken (bzw. zu scharfe) erwischt – das war schade. Aufpassen sollte man auch auf die BBQ-Sauce; mir wurde sie schwarz, was die knusprig gegrillte Bacon-Hülle leider geschmacklich verdarb :-( Bei der Menge an Bacon sind die Rezepte im Netz sehr verschieden. Hatte relativ lange Bacon-Steifen, sodass jeweils 1/2 Streifen genügte, sodass ich mit 20 Scheiben (ca 400g) gut zurecht kam.
Bacon French Rolls
(als Backup-PDF)

Hirschrücken mit Salbeipesto im Speckmantel

Zutaten

  • 1,5 kg Hirschrücken ohne Knochen
  • 10 Scheiben Schwarzwälder Schinken
  • 1,5 kg Gnocchi
  • Pesto:
    • 50g Mandeln, geröstet
    • 50g Pinienkerne, geröstet
    • 50g Parmesan
    • 10 Blatt Salbei
    • Olivenöl

Zubereitung

Aus den Mandeln, Pinienkernen, Parmesan, Salbeiblättern und Olivenöl ein Pesto mixen.
Die Schinkenscheiben einzeln auslegen und mit Pesto bestreichen. Nun die Filets darin fest einrollen und von allen Seiten scharf anbraten. Anschließend alles in einem Bräter im Backofen bei 180°C für 8-10min fertiggaren.
Etwas Olivenöl in eine Pfanne geben und die Gnocchi anbraten, sowie den Rest des Pestos beimengen.
Die Fleischrollen aufschneiden und mit den Gnocchi angerichtet servieren.

Caching Framework: automatisch Cache leeren bei Datensatzänderung

Das Caching Framework lässt sich gut verwenden, um aufwändig generierte/abgefragte Daten zur Wiederverwendung schneller parat zu haben. Die prinzipielle Funktionsweise haben wir in „Caching Framework nutzen“ erklärt und findet sich auch in der Doku sowie in zahlreichen anderen Blogs.
Was aber oftmals fehlt: wie aktualisiert man den Cache bzw. invalidert ihn bei Veränderung der Daten?

Häufig hängt der Inhalt des Caches von Datensätzen ab. D.h. der Cache-Inhalt veraltet, wenn sich ein Datensatz verändert. Und damit ist auch der Ansatzpunkt für die Invalidierung klar: der processDatamap_afterDatabaseOperations-Hook im DataHandler. Er wird immer nach Datenbankoperationen („new“ bzw. „update“) aufgerufen und bekommt auch den Taballennamen mit übergeben. Somit ist es recht einfach, die eigenen Datensätze zu erkennen und auf die Veränderung zu reagieren:

EXT:my_extension/Classes/Hooks/DataHandler.php:

<?php
namespace MyVendorName\MyExtension\Hooks;

use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class DataHandler
{
    public function processDatamap_afterDatabaseOperations($status, $tableName, $recordId, array $databaseData, \TYPO3\CMS\Core\DataHandling\DataHandler $dataHandler)
    {
        if ($tableName === 'tx_myextension_domain_model_example') {
            $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('myCache');
            $cache->flushByTag('tag_123');
        }
    }
}

Dann noch am Hook registrieren, und fertig:

EXT:my_extension/ext_localconf.php

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['myextension_clearcfcache'] = 'MyVendorName\\MyExtension\\Hooks\\DataHandler';

Links