[gelöst] Datenbankanfragen richtig stellen
am 25.10.2013 - 17:08 Uhr in
Hallo liebe Drupalprofis,
ich quäle mich seit geraumer Zeit damit eigene Datenbankanfragen in Drupal zu formulieren. Ziel ist es den Titel eines Nodes nach einem bestimmten Schema zu vergeben.
Ich habe dazu das Modul Profil2 im Einsatz und darin ein Profil generell generiert in dem sich das Feld Startnummer befindet.
Dann habe ich das Modul Automatic Nodetitle um den Titel des Nodes zu überschreiben.
Zunächst habe ich dann erst einmal den Titel immer um eins erhöht:
$data = db_query("SELECT MAX(nid) FROM {node}")->fetchCol();
$nid = sprintf("%03d", $data[0] + 1);
return $nid;
Funktioniert! Aber nun möchte ich ja die Startnummer aus dem Profil bekommen. Habe mir nun einen View erstellt und mir dort die DB-Anfrage angesehen, aber ich komme damit
nicht weiter: SELECT profile.pid AS pid, 'profile2' AS field_data_field_generell_start_profile2_entity_type FROM {profile} profile WHERE (( (profile.type IN ('generell')) )) LIMIT 1 OFFSET 0.
Das sollte ja nun zumindest eine Startnummer ausgeben, wenn auch nicht unbedingt die für den einen user - Fehlanzeige. Mir fehlt das Verständnis für den Aufbau der Datenbank.
Gibt es da nicht irgendwie eine Anleitung? Ein Schema nach dem man arbeiten kann?
Für Hilfe wäre ich wie immer sehr dankbar!
Viele Grüße Sandra
- Anmelden oder Registrieren um Kommentare zu schreiben
Hilfe?
am 27.10.2013 - 18:42 Uhr
Das Problem scheint schwieriger zu sein oder meine Frage ist einfach dumm oder falsch gestellt.
Nun ja, ich habe mir die Datenbank genauer angesehen und eine Tabelle field_generell_start gefunden
in deren Feld field_data_field_generell_start die gewünschte Nummer drin steht. Also:
$data = db_query("SELECT field_generell_start_value FROM field_data_field_generell_start WHERE ????;")->fetchCol();
???? = wie sind diese Daten in irgendeiner Weise mit einer user_id verknüpft? Die Felder entity_id und revision_id helfen
mir da irgendwie nicht weiter.
Es gibt keine dumme
am 27.10.2013 - 19:22 Uhr
Es gibt keine dumme Fragen.
Ich vermute, Du kriegst keine Antwort, weil Dein Ansatz soviele Dinge durcheinanderwirft. Im Grundsatz solltest Du in Drupal eigentlich nie selber eine DB-Anfrage selber machen müssen, weil es für fast alles ein eigenes Modul gibt. Ansonsten schreibst Du ein eigenes Modul, das ist aber wieder ein anderes Thema.
Zu Deinem aktuellen Problem: Ich habe mal nach "drupal node increment serial" gegoogelt. Unter anderem ist das da rausgekommen, was mir ziemlich zielführend erscheint.
lg leda
"Du liebst es, Du brauchst es oder Du gibst es weg"
www.leda.ch
Das dürfte...
am 27.10.2013 - 19:53 Uhr
...mein Problem nicht lösen. Es geht mir ja nicht nur darum, dass ich für jeden Node einzeln einen Counter haben möchte
(das würde meine erste DB-Anfrage oben lösen), sondern dass der Benutzer einen Startwert im Profil festlegen kann und
dieser dann in einem _anderen_ Inhaltstypen übernommen wird. Außerdem wird der Wert nicht einfach um eins erhöht,
sondern nach einem bestimmtem Schema.
dann wirst du an einem eigene Modul
am 27.10.2013 - 23:58 Uhr
Nicht vorbeikommen.
Je nachdem wie gut du in php und speziell in Drupal zu Hause bist, kann das etwas länger dauern.
Grüße
Ronald
SandraNetthoefel schrieb Ziel
am 28.10.2013 - 12:20 Uhr
Ziel ist es den Titel eines Nodes nach einem bestimmten Schema zu vergeben.
Könntest Du das Schema bitte mal genauer erläutern? Am besten, Du erklärst mal im Ganzen, was Du erreichen möchtest. Eventuell brauchst Du gar keinen Query selber bauen.
Schema
am 28.10.2013 - 20:58 Uhr
Hallo,
das ist die Anforderung an die Kundennummer:
Vergabe einer Kundennummer: 1000131 der nächste dann 1000132
der hundertste 1010130
13 ist das Jahr, als nächstes Jahr 14
Die 1 vorne ist eine Konstante
die Konstante setzen wir dann auf 2 wenn die Nummerierung verbraucht ist
Muss nicht genauso sein, geht auch ähnlich.
Viele Grüße Sandra
eine etwas gewöhnungsbedürftige Logik
am 28.10.2013 - 21:07 Uhr
Müsste aber realisierbar sein.
Der Witz ist jedoch, wo wird die laufende Nummer verwaltet?
Da reicht ein Zähler und dann eine Funktion (ein Modul), die den Zählerstand zerlegt und das Jahresdatum einschießt.
Das ist ein Dreizeiler.
Grüße
Ronald
Irgendwie erschließt sich mir
am 29.10.2013 - 09:27 Uhr
Irgendwie erschließt sich mir der Zusammenhang zwischen dieser "Startnummer", der Kundennummer und dem Node, dessen Title offenbar programmatisch gesetzt werden soll, nicht wirklich.
Um aber an die Startnummer zu kommen, gibt diverse Möglichkeiten.
1. Custom Query: Eine Abfrage von einer Tabelle allein macht natürlich keinen Sinn. Du musst die Tabelle(n) finden, wo die Entity ID aus field_data_field_generell_start mit einer uid verknüpft sind, diese joinen und die entsprechende(n) WHERE Klausel(n) formulieren. (Würde jetzt am ehesten die Profile 2 Tabellen vermuten) Und wenn Du schon eigene Query's baust, dann bitte die Drupal DB API nutzen.
2. Mit Views ist das kein Problem. Wenn das bei Dir nicht klappt, ist die View falsch konfiguriert.
3. Das P2 Profile liegt in Drupal als Objekt vor. In einem custom Module kannst Du das via
$obj->field_startnummer['und'][0]['value']
(Beispiel) holen und weiterverarbeiten. Das Devel Module zeigt Dir alle Elemente des Objekts genau. Mit mit field_get_items() kommst Du ebenfalls ran. Die Variante mit dem custom Module würde ich, wie ronald auch, favorisieren, da der Startwert ja ohnehin weiterverarbeitet werden muss.Eigenes Modul...
am 29.10.2013 - 10:42 Uhr
Ein eigenes Modul habe ich natürlich noch nie gebaut. Ich denke ich werde mir erst einmal die genannten Module ansehen.
Vielleicht erschließt sich mir das ja dann Schritt für Schritt. Der Zusammenhang zwischen Startnummer im Profil2 und
Kundennummer ist im Prinzip nur, dass der Benutzer sagen kann, dass man erst bei 100 anfängt.
Vielen Dank erst einmal,
ich schaue mir mal an, ob ich mit der DB API weiterkomme.
Zitat:Eventuell brauchst Du
am 29.10.2013 - 17:32 Uhr
[EDIT] ..ups... hab das Posting nicht korrekt gelesen...
meine ANtwort passt hier garnicht ..:)
insbesondere wegen derAnforderung an der Formstierung
Vergabe einer Kundennummer: 1000131 der nächste dann 1000132
der hundertste 101013
Ich würde behaupten, das das mit Rules machbar ist
[/EDIT]
########## meine vorherige Antwort ##########
Eventuell brauchst Du gar keinen Query selber bauen.
ja genau, das würde ich auch sagen!
Wenn du das Feld field_generell_start
in dem Profil des Users angelegt hast,
der User das Feld auch befüllen kann,
egal in welchem Schema,
dann kannst du das in Views auch in der Ausgabe
mit dem Titel zusammen setzen,
wenn Du die eben als Felder ausgibst,
sind diese auch als Token ("Ersetzungsmuster")
verfügbar, und per "Rewrite Output" kannst du
die beiden verbinden:
<?php
[field_generell_start] -- [title]
?>
oder du löst das per Theme
vg
stef
Token in PHP richtig nutzen
am 24.11.2013 - 21:07 Uhr
Hallo noch einmal,
ich habe mir das alles noch einmal angesehen und mir steht das Feld an sich als Token zur Verfügung:
Knr.-Start [current-user:profile-generell:field_generell_start] Feld Ganze Zahl.
Knr.-Start [current-user:profile-generell:field-generell-start] Feld "field_generell_start"
Wie greife ich aber per PHP darauf zu? Mit return '[current-user:profile-generell:field_generell_start]'; komme ich da nicht weiter.
Vielen Dank für eure Hilfe
Was funktioniert ist...
am 25.11.2013 - 17:00 Uhr
Es funktioniert, wenn ich folgendes nutze:
<?php
$nid = [current-user:profile-generell:field_generell_start];
return $nid;
?>
Hatte wahrscheinlich etwas mit einem fehlenden Update zu tun, denn ich bin fest überzeugt das gestern schon 2-3 mal
probiert zu haben. Aber eine Manipulation a la [current-user:profile-generell:field_generell_start] = [current-user:profile-generell:field_generell_start] + 1;
funktioniert nicht. Da müsste ich wieder auf die DB zugreifen?!
Es funktioniert mit Rules...
am 26.11.2013 - 11:23 Uhr
Tatsächlich konnte ich die Datenmanipulation nun mit Rules lösen. Etwas seltsam ist, dass das Feld unter "Daten" nicht auftaucht,
ich es aber manuell angeben kann.
Lieben Dank an alle die einen Ansatz geliefert haben und mich so zur richtigen Lösung hingeleitet haben.