Meine Projekte
Mein aktuelles Projekt
Seit 2015 habe ich mich intensiv mit Laravel und anderen modernen Webtechnologien zu beschäftigen. (siehe auch Mein Lernen). Darauf hin habe ich begonnen viele meiner bisherigen Ideen und Konzepte von früheren Projekten nach Laravel zu übertragen.
Ich konzentriere mich dabei auf die Gestaltung eines universalen Backends (Admin-Bereich) das für jedes beliebige Projekt im Frontend geeignet ist. (E-Commerce, E-Learning usw.) Solche Backends werden auch ‚Boilerplate‘ genannt. Ich habe eine klare Verstellung was so eine Boilerplate leisten muss und habe einen großen Teil bereits fertiggestellt. Ich arbeite täglich mit viel Spass und Energie weiter an diesem Projekt.
Die Boilerplate beinhaltet eine Vielzahl von User-Interfaces die ajax-basiert mit der Datenbank verknüpft sind. Mehr dazu weiter unten…
Die jeweils aktuelle Version meiner Boilerplate finden Sie in meinem Git-Repository. Wegen der fehlenden Datenbank ist die Version nicht lauffähig, aber aussagekräftig hinsichtlich meines Codes. Die Live-Version finden Sie hier. Gern gehe ich mit Ihnen die Highlights in der Anwendung gemeinsam durch, am besten per Fernverbindung (Teamviewer).
Weitere, detaillierte Informationen finden Sie in meinen Blog Beiträgen. Dort habe ich auch einige Videos und Code-Snippets zu Demonstration der verschiedenen User-Interfaces eingefügt.
Bisherige Projekte
2011-2015: Entwicklung eines Shop-Systems mit der Möglichkeit das Frontend individuell zu gestalten. Hier zwei Beispiele:
dos Santos, ein Shop zu Vertrieb von Lizenzen für Virenscanner der Marken Kaspersky und G-Data.
gay mega store – ein Shop zum Verkauf von Videos, Büchern und sonstige Artikel der Gay-Szene.
Beide Shops, obwohl Welten auseinander verwenden das gleiche Backend. Besonderheiten des Backends:
- Beliebige Sprachen, alle Texte können automatisch übersetzt werden.
- Import von beliebigen WOW-Slidern für den Header.
- Assistenten für die Gestaltung der Blocks und Boxen (Widgets) auf der Startseite.
- Bonuskarte und alternativ Promo-Codes. Bis zu 10 Promo-Codes gleichzeitig, dabei Beschränkung auf Warengruppen oder Hersteller-Marken möglich. Zusätzlich individuelle Gutschriften an Kunden die eingelöst werden mit einem Code (wie Promo-Codes).
- Video-Manager zur Verwaltung und Anzeige beliebiger Videos, inkl. Video Galerie. (YouTube, Vimeo oder lokale Videos auf eigenem Server)
- Diverse Assistenten für Konfiguration und Design.
- Seiten-Editor für beliebige individuelle Seiten. Mehrsprachig.
- Saferpay SIXT und PayPal als Zahlungsschnittstellen.
- Coole Suchfunktion auf der Startseite.
- Produkt-Tags für neu, wieder lieferbar, Hot usw.
- Umfangreiches Backend mit vielen weiteren Features.
- Bearbeitungsmodus für das Frontend. Nur sichtbar für privilegierte Administratoren.
- Und viele weitere gute Ideen bei der Umsetzung individueller Kundenwünsche.
Weitere Projekte: CNC Dynamix Musikhaus Grimm
Meine Vorstellung eines universellen Backends – meine Boilerplate
Eine Boilerplate ist ein wieder verwendbares Grundgerüst das bereits mit einiger Funktionalität ausgestattet ist. In diesem Sinne ist bereits das pure Laravel-Framework eine Boilerplate.
Meine Vorstellung einer universellen Boilerplate oder Backends geht jedoch weit darüber hinaus. Egal ob E-Commerce oder anderes, alle Anwendungen gliedern sich in Frontend und Backend. Die Erfahrung zeigt das im Backend immer wieder die gleichen Basis-Anforderungen zu erfüllen sind.
Im Folgenden einige Dinge die ich in meiner Version einer universellen Laravel-Boilerplate bereits realisiert habe. Viele weitere sind in Vorbereitung. Alles ist ‚work in progress‘ und wird fortlaufend optimiert.
CRUD – create read update delete
Ein gut entwickeltes CRUD-System spart dem Developer fraglos viele Stunden. Den Ansatz über php artisan make:migration benutze ich eher selten.
In der Praxis sind bereits Tabellen der Datenbank gefüllt mit Daten vorhanden. Eventuell notwendige Änderungen an der Struktur nehme ich zunächst mit phpMySQL vor. Mit einem einzigen Befehl wie:
php artisan infyom:scaffold Languages --fromTable --tableName=languages --save --paginate=20
erstelle ich für die Tabelle Languages ein Model, Controller, Repository und Routes sowie im Ordner views/backend/languages folgende Blade-Files: create, edit, fields, index, show, show_fields und table.
Dies basiert auf dem CRUD-Genrator von infyom dessen Stubs ich um viele Funktionen erweitert, und auf Bootstrap4 angepasst habe. Meine zusätzlichen Funktionen (von oben nach unten):
- Kopfzeile (editierbar/übersetzbar)
- Neu erfassen öffnet in einem Popup.
- Hilfe (Erläuterung siehe weiter unten) (editierbar/übersetzbar).
- Konfigurations-Assistent für diese Seite/Tabelle in der Hilfe. (Erläuterung siehe weiter unten) (editierbar/übersetzbar).
- Dev Notes. Notizblatt als Popup für ToDos und Änderungen. Sichtbar nur für den Developer.
- Suche nach. Sucht nach einem Suchbegriff in allen Spalten. Markiert Funde mit gelben Hintergrund.
- Tabellen exportieren. Im Format .xls, .xlsx, .csv, PDF
- Tabelle filtern. Erstellt im Controller eine Dummy-Funktion. Erlaubt die manuelle Erstellung beliebiger Filter.
- Spalten ausblenden. Erlaubt das manuelle ein/ausblenden beliebiger Spalten der Tabelle.
- Records pro Seite erstellt dynamisch (auf Basis total records) die Optionen im Select.
- Sort-Order UI. Hier mit sofortigem Reload der Seite bei Änderung. Wird als Option erstellt für jedes Feld einer Tabelle mit dem Namen ’sort_order‘. (Im Quellcode zunächst auskommentiert!)
- Switches. Hier ohne Page-Reload aber mit sofortiger Speicherung inkl. Caching.
- Action-Buttons: View und Edit als Popups. Delete mit Sweet-Alert2 Sicherheitsabfrage.
- Debug-Bereich für den Dev einblenden. Nur sichtbar für den Developer.
- Die Anzeige aller dieser Elemente ist optional. Siehe Konfigurations-Assistent für diese Seite/Tabelle.
Bei Änderungen an der Struktur der Tabelle Languages kann ich entweder das Model manuell anpassen oder das ganze Scaffolding löschen und neu erstellen. Die Rückabwicklung erfolgt mit:
php artisan infyom:rollback Languages scaffold
User-Interfaces – UIs
Hier ein einfaches Beispiel: Switches (logische Ein-Aus Schalter) wie oben in der Tabelle Languages sichtbar.
Der Schalter wird für die Tabelle Languages (in table.blade.php innerhalb des @foreach($dataset as $dataset) so implementiert:
{!! get_checkbox_any_table( $this_table_name, 'status', $dataset->id, $id_field ='id', $with_comment=false, $hint_key = $this_table_name.'_status_checkbox', $label_text = '', $with_panel = false, $ax_response = true, $input_style= '', $label_style = 'font-weight:normal', $with_tooltip = false, $tt_class = '', $tt_width = '', $with_page_reload = false, $this_value = $dataset->status, $from_inside_loop = true, $as_switch = true, //otherwise as checkbox $switch_size = 'no' //xs, sm, no, lg ); !!}
oder an anderen Stellen für ein key/value Paar in der Tabelle diverses so:
echo get_checkbox_any_table( $table= 'diverses', $field = 'div_res', $id = 'is_dev', $id_field ='div_what', $with_comment=false, $tt_hint_key = 'is_dev', $label_text = 'use any indiv. Text here or leave blank...', $with_panel = false, $ax_response = true, $input_style= '', $label_style = 'margin-right:12px;font-weight:normal;', $with_tooltip = true, $tt_class = 'tip', // tip or tip_lu for appearance right or left from icon $tt_width = '400px', //size of popup $with_page_reload = true, $this_value = '', // !!! only if $from_inside_loop = true fill with {$model->fieldname} $from_inside_loop = false, // auto lookup for current value if set to false $as_switch = true, //display as checkbox or switch? $switch_size = 'no' //xs, sm, no, lg );
Der Schalter ist ajax-basiert und erzeugt je nach Konfiguration eine Bestätigung oder einen Page-Reload. Er lässt sich durch einen Tooltip erweitern. Der Tooltip enthält Hilfe-Text zum aktuellen Schalter, und zwar in allen aktivierten Sprachen. Die Textanzeige basiert auf der aktuellen Session-Sprache. Tooltips bieten ferner einen Link zum Editieren aller Texte inkl. automatischer und oder manueller Übersetzung in alle Sprachen, aber nur für priviligierte User (DEV, Admin und eventuelle Translator).
Ein Tooltip bei Mouseover, die angezeigte Sprache gemäß Session. Hier mit Edit-Link zum allgemeinen Editor und Übersetzer der sich immer im Popup öffnet:
Tooltips lassen sich auch unabhängig von einem Schalter an beliebiger Stelle einfügen und dienen so der Bediener-Führung und Unterstützung, und zwar genau dort wo der User die Hilfe benötigt. Zur Erstellung ist nur ein Key für die Tabelle diverses erforderlich.
echo function tooltip( $t_key ='table_display_cols_hint', $class = 'tip', $style = '', $icon = '' // force an icon other than default icon )
Jede Tabelle hat optional einen Hilfe-Button. Der öffnet ein Popup wie folgt:
Beachten Sie das alle Hilfe-Texte mit einem ‚Edit‚-Link versehen sind. Ein Klick auf ‚Edit‘ öffnet den allgemeinen Editor/Übersetzer für lange Texte (über 255 Zeichen) oder für kurze Texte (bis 255 Zeichen):
Das bedeutet das alle Hilfe-Texte in allen Sprachen zu dieser Tabelle direkt von hier aus bearbeitet werden. Es können Bilder und Links eingefügt werden. Mit einem Klick lässt sich jeder Text in die anderen Sprachen automatisch übersetzen. Bei Bedarf kann manuell berichtigt werden. Mehrere Versuche der automatischen Übersetzung mit unterschiedlichem Ausgangstext sind möglich. (deutsch nach französisch, oder englisch nach französisch, englisch in alle anderen Sprachen außer deutsch usw.)
Der vierte Tab ganz rechts mit dem Titel ‚Konfiguration‘ öffnet den Konfigurations-Assistenten für diese Tabelle:
Die linke Box enthält Konfigurations-Schalter für die aktuelle Tabelle. Die mittlere Box wird zur Zeit nicht verwendet und wird wohl wieder verschwinden. Die rechte Box ist sichbar nur für den DEV (Developer) und/oder für priviligierte User (Admins).
Bitte beachten Sie das alle aufgezeigten Features automatisch erstellt wurden mit einem einzige Befehl:
php artisan infyom:scaffold Languages --fromTable --tableName=languages --save --paginate=20
So kann ich natürlich auch sehr schnell jede beliebige andere Tabellen erstellen, wie z.B. die Folgende:
100% Mehrsprachigkeit
Um eine 100% Mehrspachigkeit für Backend und Frontend zu erreichen sind die von Laravel angebotenen lang-Ordner nicht wirklich brauchbar. Ich verwende ein Laravel-Package das die Inhalte aller lang-Ordner in ein Google-Spreadsheet exportiert. Die Sprachen für den Export sind wählbar. Dort können die Übersetzungen von einem Übersetzer manuell bearbeitet werden. Im Spreadsheet ist bereits erkennbar das die Übersetzungen lückenhaft sind.
Nach manueller Bearbeitung kann das Spreadsheet zurück importiert werden wobei die Arrays in den lang-Ordnern entsprechend aktualisiert werden. Spreadsheet öffnen…
Ich habe das Package erweitert so das bei Export und Import des Spreadsheets die aktuellen Übersetzungen ebenfalls in eine Tabelle (language_lines) der DB geschrieben werden. Screenshot dieser Tabelle:
Die blauen Buttons links öffnen den allgemeinen Editor und Übersetzer für kurze Texte wieder als Popup:
Die allgemeinen Editoren/Übersetzer (für kurze und für lange Texte) zeigen nur die Sprachen an die in der Tabelle Languages zur Zeit aktiviert sind. Die Reihenfolge der Sprachen ergibt sich sich aus der sort_order in der Tabelle Languages die ebenfalls beliebig ist.
Natürlich sind auch die allgemeinen Editoren/Übersetzer selbst, mit allen Text-Elementen, mehrsprachig!
Der WYSIWYG-Editor für lange Texte ist ckEditor. Er ist von Haus aus mehrsprachig. Beim Laden wird die Session-Language automatisch an den ckEditor übergeben.
Beachten Sie auch das der ckEditor stets in zwei Versionen angeboten wird (‚Basic‘ und ‚mit allen Funktionen‘ – umschaltbar direkt im allgemeinen Editoren/Übersetzer für lange Texte).
Den ckEditor habe ich erweitert mit dem Laravel File-Manager. So lassen sich Bilder und Dokumente auf dem Server direkt in Texte einfügen, ohne sie jedesmal hochladen zu müssen.
Key/Value Management
Ich verwende eine key/values Tabelle mit integrierten Hilfe Texten. Die Tabelle heißt diverses und wird demnächst umbenannt und umstrukturiert im Rahmen eines Refactorings.
Diese Key/Values bilden die Grundlage für fast alle User-Interfaces. Hier als Beispiel ein einfacher logischer Schalter für die Anzeige der linken Sidebar im Backend mit dem key dashboard_settings_sidebar_minimized:
Hier in ausführliche Form (parameter $with_panel = true):
Das selbe in französisch:
Falls die automatische Übersetzung nicht stimmt können Sie jederzeit mit einem Klick auf ‚Modifier‘ den Text manuell bearbeiten! Selbst das Wort ‚Modifier‘ kann verändert werden, in der Tabelle diverses. Die Anzeige des keys rechts unten ist nur sichtbar für den Developer oder priviligierte User.
Hier in verkleinerte Form (parameter $with_panel = false):
Hier wird der Hilfe-Text erst angezeigt bei Mouseover auf dem blauen Tooltip.
Hier eine noch kleinere Darstellung, integriert an beliebiger Stelle, hier mal ohne Tooltip:
Alle Darstellungen werden mit der selben Funktion angezeigt, wobei lediglich die Parameter varieren:
$what = 'dashboard_settings_sidebar_minimized'; echo get_checkbox_div( $what, //the key in table 'diverses' in field 'div_what' $label_text = '', //label is only available if $with_panel == false $label_style = 'font-weight:bold; margin-right:6px; ', $with_panel = true, //wrap all in a box? $data_on = 'On', $data_off = 'Off', $wrapper_style = 'padding:2px 9px 0 9px;margin:0 0 4px 0;', $ax_response = false, //if true: a little tick appears for confirmation after change $ax_response_with_page_reload = false, //if true: page will be reloaded on change $with_tooltip = true, //defaults to false if $with_panel == true $tt_class = 'tip', // tip (right) or tip_lu (left) $tt_width = '450px' //width of tooltip popup )
Alle 3 Darstellung verwenden das selbe key/value Paar:
(key = dashboard_settings_sidebar_minimized – value = 1 oder 0)
Alle Texte kurz oder lang inkl. aller Übersetzungen sind im selben Datensatz vorhanden. Bei z.Zt. 34 Sprachen in Languages hat die Tabelle diverses also entsprechend viele Spalten. Die Anzahl der Sprachen lässt sich beliebig erweitern.
Die Google Translation-API unterstützt viel mehr als 34 Sprachen. Beachten Sie daß für einige Sprachen bereits Google’s ‚Neural translation Technology‘ eingesetzt wird die auf KI basiert und deutlich bessere Ergebnisse liefert. Tipp: Übersetzen Sie immer zunächst nach englisch und dann von englisch in die anderen (noch leeren) Sprachen. Meine Translation-UI geht automatisch so vor (optional) bei Aktivierung des Switches ‚translate_to_english_first‘.
Diese einfache Umsetzung von key/values in ‚mehrsprachige‘ Assistenten erlaubt die Kombination von Konfigurations-Assistenten zu Konfigurations-Seiten wie z.B. diese:
Key/Values sind natürlich nicht auf logische Schalter begrenzt. Andere UIs nach dem gleichen Prinzip:
Selects:
echo get_select_by_t_key( $t_key='categories_images_width', $t_key_arr ='', $pref='', $suff='px', $arr_from = '10' , $arr_to = '800', $style='font-size:1.2em;', $arr_step = '1', $with_tooltip = false, $tt_class = 'tip', $tt_width = '300px' );
oder dieses Select:
echo get_select_by_t_key( $t_key = 'cache_minutes_selection', $t_key_arr = 'kein Caching,kurzes Caching,normales Caching,extremes Caching', $pref='', $suff='', $arr_from = null, $arr_to = null, $style='font-size:1.2em;', $arr_step = null, $with_tooltip = false, $tt_class = 'tip', $tt_width = '300px' );
Color-Picker:
oder in kompakter Form:
get_colorpicker_by_t_key( $t_key, $wrapper_style = 'margin:0 0 4px 0;', $with_panel = false, //makes it compact $with_tooltip = true, //becomes false if $with_panel = true $tt_class= 'tip', //tip or tip_lu $tt_width = '450px' )
Der Colorpicker basiert auf http://bgrins.github.io/spectrum/
Wirkliche 100% Mehrsprachigkeit
Wie oben beschrieben habe ich die Laravel-eigenen Übersetzungen aus den lang-Ordnern bereits in eine Datenbank überführt (language_lines), und die key-basierten Übersetzungen sind in der Tabelle diverses. Der nächste logische Schritt ist die Zusammenfassung in eine einzige Tabelle. Damit habe ich die Möglichkeit für alle Texte aus beiden Tabellen die UI für automatische Übersetzung zu nutzen sowie beliebige neue Sprachen zu integrieren.
In der Tabelle language_lines ist der key die Spalte ‚full_key‚, in der Tabelle diverses ist der key ‚div_what‚, beide haben einen uniqe Index. Die Zusammenfassung (demnächst) stellt eine großartige Verbesserung dar.
Nun gibt es aber noch die Texte die ich beim normalen, täglichen Development einfüge. Zum Beispiel in Links, Selects, Headers usw. Ich füge die Texte normalerweise zunächst einfach in deutsch ein und kümmere mich später um die Übersetzung.
Laravel bietet bekanntermaßen diese Funktion an um Texte aus den lang-Ordner zu übersetzen:
echo __('messages.welcome');
Da ich in Zukunft auf den Inhalt der lang-Ordner verzichten möchte und statt dessen die Tabelle in der Datenbank abrufe ist meine Funktion beim Einfügen eines neuen Textes wie folgt.
function get_tr($content, $from_lang_code = null, $overwrite = false, $re_translate = false) { $content = trim($content); if (empty($from_lang_code)) $from_lang_code = session_lang_code(); $key = substr($content, 0, 120); $key = trim($key); $key = str_slug($key, '.'); //create key if not exists - with content into session_lang_code() create_dv($key, $content, true, $field = 'div_res_' . session_lang_code()); //if exists ?? if ($overwrite) { set_dv($key, $content, 'div_res_' . session_lang_code()); //gets cached } if ($re_translate) { translate_to_all_other_langs($key, $content, session_lang_code(), $method = 'all'); } else { translate_to_all_other_langs($key, $content, session_lang_code(), $method = 'all_empty'); } $translation = get_dv($key, 'div_res_' . $from_lang_code); if (get_dv('first_letter_in_translation_always_display_uppercase')) { return ucfirst($translation); } return $translation; }
Nehmen wir folgenden Fall an:
$r = '<a title="hier klicken für weitere Aktionen im Popup" ';
…ändere ich einfach manuell zu:
$r = '<a title="' . get_tr("hier klicken für weitere Aktionen im Popup") . '"';
Die Funktion get_tr()
- erstellt automatisch den key aus dem Text ($content) mit str_slug()
- prüft ob der key bereits in der Tabelle existiert mit create_dv()
- übersetzt den Text nach englisch und von englisch aus in alle anderen Sprachen mit translate_to_all_other_langs()
- liest die Übersetzung aus der Tabelle auf Basis des session_lang_code() mit get_dv() und gibt sie zurück.
Dabei werden alle Datenbank-Zugriffe gecached! Somit echt schnell. Mehr unter Performance/Caching…
Die Tabelle diverses sieht dann so aus (oberster Datensatz):
Die integrierte Such-Funktion hilft bei der Suche nach Texten. Die Möglichkeit beliebig Spalten der Tabelle ein- oder auszublenden vereinfacht das Arbeiten. Filter wie ‚zeige nur Sprachen an die in Languages aktiviert sind‚ ebenso.
Die beiden Buttons ‚kurz‚ und ‚lang‚ öffnen wieder den jeweiligen allgemeinen Editor und Übersetzer als Popup wie bereits oben beschrieben. Somit sind alle Übersetzungen auch von hier aus manuell veränderbar.
Performance/Caching
Das alle oben genannten Funktionen sehr datenbank-intensiv wären habe ich folgendes für das Caching entwickelt. Die üblichen Caching-Methoden basieren darauf ganze Records der Tabelle zu cachen. Ich gehe einen Schritt weiter und Cache jedes einzelne Field im Record einer Tabelle.
Ich nutze dazu Redis auf meinem lokalen Webserver und File auf meinem Hosting (HostEurope VPS) da hier Redis nicht unterstützt wird. Dank Laravel ist die Konfiguration leicht zu ändern.
Die zentrale Funktion ist diese:
function cache_it($c_key, $value, $minutes = CACHE_MINUTES) { //$c_key = $table.'.'.$field.'.'.$id_field.'.'.$id; Cache::forget($c_key); Cache::put($c_key, $value, $minutes); return true; }
Eine Datenbank-Abfrage sieht dann so aus:
function get_dv($what, $field = 'div_res') { $what = trim($what); //caching in lookup() !! $res = lookup('diverses', $field, $what, $id_field ='div_what' ); return $res; }
Wobei alle Abfragen immer über die Funktion lookup() gehen:
function lookup($table, $field, $id, $id_field ='id' ) { if(is_null($id) or $id=='') return ''; $c_key = $table.'.'.$field.'.'.$id_field.'.'.$id; $res = Cache::remember($c_key, CACHE_MINUTES, function () use ($table, $field, $id, $id_field) { return DB::select("select $field from $table where $id_field = ?", [$id]); }); if(is_string($res)) return $res; if(! is_null($res) and count($res)>0 ) { $arr = (array)$res; return $arr[0]->$field; }else{ return ''; } }
Jeder Key im Cache folgt also dem Muster:
$c_key = $table.'.'.$field.'.'.$id_field.'.'.$id;
Das $id_field ist mit Ausnahme der Tabelle diverses immer ID. Somit ist dies für jede Tabelle der Datenbank verwendbar.
Beim Schreiben in die Datenbank sieht es so aus:
function set_dv($what, $value, $field = 'div_res') { $what = trim($what); App\Models\Diverses::where('div_what', '=', $what)->update([$field => $value], ['updated_at' => NOW()]); $c_key = 'diverses'.'.'.$field.'.'.'div_what'.'.'.$what; cache_it($c_key,$value); //forgets old value and caches new value }
Das lässt sich leicht für beliebige, andere Tabellen anpassen.
Das Prüfen ob ein Key in der Tabelle bereits vorhanden ist:
function create_dv($what, $value = '',$first=false, $field = 'div_res') { $what = trim($what); $c_key = 'diverses'.'.'.$field.'.'.'div_what'.'.'.$what.'.count'; $count = 0; $count = Cache::remember($c_key, CACHE_MINUTES, function () use ($what,$field) { return App\Models\Diverses::where(['div_what' => $what])->count(); }); if ($count == 0) { App\Models\Diverses::create(['div_what' => $what, $field => $value]); $c_key = 'diverses'.'.'.$field.'.'.'div_what'.'.'.$what.'.count'; cache_it($c_key,1); //here always value = 1 because it was just created //if value=='' or $first indicates the very first creation of key - don't cache it yet if($value<>'' and ! $first) { $c_key = 'diverses' . '.' . $field . '.' . 'div_what' . '.' . $what; cache_it($c_key, $value); } } }
Und zuletzt das Löschen eines ganzen Datensatzes in einer Tabelle (könnte man mit einem Ereignis-Observer im Model verknüpfen):
function forget_all_cached_fields_for($table, $id) { //before actually delete a record in table: //if we delete a record in a table we want also all cached items for this record being removed if ($table == 'diverses' and is_numeric($id)) { //in table diverses we use div_what rather than id for the unique identifyer $id_field = 'div_what'; $div_what = get_div_what_by_id($id); $id = $div_what; } else { $id_field = 'id'; } // get all fields from table structure $arr = get_columns_from_table_as_array($table); $c_key = ''; foreach ($arr as $field) { $c_key = $table . '.' . $field . '.' . $id_field . '.' . $id; Cache::forget($c_key); $c_key = $c_key . '.count'; // important for create_dv()/check if exists - count must be null again Cache::forget($c_key); } return true; }
-weitere ausführliche Beispiele folgen in meinen Blog-Beiträgen
Weiter zu: Ziele