Drupal 8 field: Datum und laufende Nummer (pro Monat)
am 10.07.2017 - 10:48 Uhr in
In Drupal 8 gibt es bei einem Inhaltstyp zwei Datumsfelder (jeweils unlimited, also mehrere Werte möglich):
Es soll in diesem Inhaltstyp nun ein drittes Feld geben, welches eine Art monatliche Seriennummer / laufende Nummer darstellt mit folgendem Inhalt:
2017_07_01 .. für den ersten Inhalt mit Datum Juli
2017_07_02 .. für den zweiten Inhalt mit Datum Juli
2017_07_xx .. bei Nodes mit Datum Juli, laufende Nummer xx erhöht sich automatisch, xx startet jedes Monat bei 1
2017_08_01 .. für den ersten Inhalt mit Datum August
2018_01_01 .. für den ersten Inhalt mit Datum Jänner 2018
usw.
Zu beachten ist, dass das Datum (Monat und Jahr) nicht vom Erstellungsdatum der Nodes sondern von den 2 Datumsfeldern abgeleitet wird: Es wird das niedrigste Datum genommen, falls mehrere Werte gesetzt sind. Es wird das 2. Datumsfeld genommen, falls das 1. leer ist.
Das resultierende Feld soll überall verwendet werden können, also auch als Views-Feld.
Wie kann man so eine monatsbasierte und Datumfeld-basierte laufende Nummer in Drupal 8 realisieren? Danke!
- Anmelden oder Registrieren um Kommentare zu schreiben
Hiund warum nimmt nimmst Du
am 10.07.2017 - 11:27 Uhr
Hi
und warum nimmst Du nicht einfach die Node ID des Inhalts als letzte Sequenznummer?
Dann brauchst Du nicht einmal ein drittes Feld!
2017_07_123456
2017_07_123460
....
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Dann wäre es einfach
am 10.07.2017 - 13:27 Uhr
Ja, das wäre einfach, aber es wird eben gewünscht, dass dies eine laufende Nummer pro Monat ist (sozusagen die Inhalte für jeden Monat hochgezählt werden).
Aber wie schon gesagt, nicht das Erstellungsdatum der Nodes sondern das Datum von den 2 Datumsfeldern werden genutzt, um monatsweise hochzuzählen! (Da wird es ja dann noch schwieriger, wenn man das Datum danach auch noch ändert, aber das lassen wir mal weg um es einfacher zu machen und überhaupt eine Lösung zu finden).
Eventuell könnte das Modul "Computed Field" helfen, weiß aber nicht, wie man hier den Custom Code schreiben könnte:
Ich würde mit dem Custom Code direkt auf die Datenbank zugreifen, die Nodes zählen, welche vom Datumsfeld in das eine Monat fallen, welches das selbe ist, wie bei dem neuen Node, welcher gerade erstellt wird. So zählt man 1 hoch und schon hat man den richtigen Wert für den neuen Inhalt.
Allerdings wie beginnen (Code-Beispiel)?
Wie greift man in Drupal 8 korrekt auf die Datenbank zu? usw ...
Na, dann bin ich mal gespannt
am 10.07.2017 - 14:05 Uhr
Na, dann bin ich mal gespannt wie Du diese Sequenzen hochzählst, wenn mehrere Benutzer gleichzeitg einen Node erstellen!
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Grundsätzliche Lösung gesucht
am 10.07.2017 - 15:37 Uhr
Dass gleichzeitig eine Node erstellt wird, das kommt nicht vor in diesem Fall, oder man kann es ignorieren. In dem Fall würde man einfach den einen Inhalt (wenn das in 20 Jahren einmal vorkommt) noch einmal editieren oder mit Node_clone duplizieren und schon hätte man das gelöst.
Also es geht wirklich darum, wie man das grundsätzlich lösen kann, wie ein Code-Snippet ungefähr aussehen könnte ... Zugriff auf Datenbank-Tabellen unter Drupal 8 Mittels eigenem PHP-Code? Entweder unter Nutzung des Moduls "Computed Field" oder im .theme file oder in einem kleinen D8 Modul oder ganz anders?
Ach so, und wenn dann ein
am 10.07.2017 - 23:53 Uhr
Ach so, und wenn dann ein Node gelöscht wird, berechnest Du alle Menü Links, Referenzen und Sequenzen neu?
Viel Spass dabei!
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Computed Field
am 11.07.2017 - 09:56 Uhr
Nein, beim Löschen bleibt alles unverändert. Es könnte aber Auswirkungen auf die Programmierung haben, denn man muss es dann so schlau programmieren, dass gelöschte Nodes nicht dazu führen, dass die nächsten Nodes, die angelegt werden, dann doppelte laufende Nummern haben.
Du hast jetzt die Schwierigkeiten bei dieser Aufgabenstellung aufgezählt in mehreren Postings, das ist schon eine gute Hilfe, denn wenn man beginnt, das zu programmieren, denkt man vielleicht nicht an alles.
Jetzt wäre es aber noch schön, wenn Du ein Code-Beispiel der einen konkreten Lösungsvorschlag wüsstest.
Ich werde es jedenfalls mit "Computed Field" versuchen und den Code dafür selbst schreiben. Vielleicht gibt es ja noch bessere Lösungswege ... Ich finde keinen Beispiel-Code für Drupal 8, darum geht es ja.
Sorry,aber wenn die Nummern
am 11.07.2017 - 10:13 Uhr
Sorry,
aber wenn die Nummern in dem Fall ja sowieso nicht fortlaufend sind,
frage ich mich warum Du nicht die Node id nimmst, die eindeutig und j aauch nicht fortlaufend ist?
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
So programmieren, dass es funktioniert
am 11.07.2017 - 11:42 Uhr
Aber das hast Du ja schon oben geschrieben und das wurde ja schon besprochen.
Warum wiederholst Du dich?
Natürlich wird die fortlaufende Nummer eindeutig sein, dafür muss der Code eben sorgen.
Ich bin es gewohnt, dass man, wenn man ein Problem lösen will, nicht die ganze Zeit an die Probleme denkt, sondern an die Lösung denkt und beim Umsetzen der Lösung eben alle Eventualitäten berücksichtigt - oder anders ausgedrückt: Das nennt man Programmieren!
1.Was für Code möchtest Du
am 11.07.2017 - 12:23 Uhr
1.
Was für Code möchtest Du für etwas, das so nicht funktioniert?
Du schreibst zwar, dass nodes nicht gleichzeitig gespeichert werden,
aber das wiederspricht dem Multithreading!
Du könntest Apache zwar in einem Single Threaded Modus betreiben,
aber das wäre gelinde gesagt "Bullshit"
2.
Hast Du Dir in der Datenbank mal die keys mit auto_increments oder die node ids angesehen!
Sind die fortlaufend?
3.
Sorry, aber das ist nicht Programmieren und ich wünsche Dir bei so einer Lösung viel Spass!
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Aufgabenstellung ist halt so wie sie ist
am 11.07.2017 - 13:58 Uhr
Warum glaubst Du mir eigentlich nicht? Wenn Du den Leuten glauben würdest, wäre alles viel einfacher:
1. dieser Inhaltstyp wird nicht für alle sondern nur für Editoren (Benutzerrolle) freigegeben. Und es wird vielleicht nur 1 Editor geben, auch wenn es 2 oder 3 Editoren wären, wird es niemals vorkommen, dass zwei Editoren in der gleichen Zehntelsekunde oder Millisekunde gleichzeitig einen Inhalt von diesem Inhaltstyp erstellen.
Wie schon oben geschrieben, fällt das Problem also weg, und wenn es in 20 Jahren einmal vorkommen würde, merkt das der Editor und löst das Problem mit einem node_clone oder ähnlich. Wieso willst Du auf einem nicht existierenden Problem ewig herumreden? Warum glaubst Du den Leuten nicht? Wenn die Aufgabenstellung so ist, dass es eben nicht vorkommt, dass zwei Nodes glz. erstellt werden, dann ist die Aufgabenstellung! Jeder Programmierer hält sich an die Aufgabenstellung.
2. Natürlich, kenne solche ids mit auto_increments in der Datenbank seit 15 Jahren. Wozu soll ich mir das anschauen, wenn die Aufgabenstellung doch eine andere ist?
3. Für Dich ist es nur deswegen nicht Programmieren, weil Du mit Gewalt die Aufgabenstellung abändern willst. In dem Fall, wo man das mit Gewalt macht, stimmen deine Aussagen doch, aber darum geht es hier doch nicht. Ich werde eine Lösung für die korrekte Aufgabenstellung umsetzen und für die korrekte stimmen deine Annahmen eben nicht.
Aber es wäre doch so einfach für dich, wenn Du einfach schreiben würdest:
"Wenn es tatsächlich stimmt, dass es niemals vorkommt, dass zwei Nodes gleichzeitig erstellt werden, dann ist es einfach und Du kannst folgendermaßen vorgehen .."
Ich klink mich dann hier aus.
Ein Webserver ist halt mal
am 11.07.2017 - 14:12 Uhr
Ein Webserver ist halt mal dafür gedacht auch mehrere Requests gleichzeitig zu empfangen.
Du solltest nochmal die Architektur Deiner Anforderungen überdenken.
Bin gespannt auf die Lösung
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)