Modul Entwicklung Denkanstöße gesucht.

am 11.12.2012 - 19:58 Uhr in
Hi,
da viele Wege zur Realisierung meines Vorhabens gescheitert sind und die vorhanden Module einfach nicht passen, bin ich jetzt dran mein Vorhaben in einem Modul zu verwirklichen.
Was das Modul machen soll:
-> Vor dem Abspeichern eines Nodes(Filter:Typ)
-> nimmt das Modul den Inhalt eines Feldes
- >führt ein paar Berechnungen durch (mein Php Skript)
-->$fertigeberrechnung
->füge $fertigeberrechnung in ein anderes Feld des Nodes ein
-> Node abspeichern
Die 2 Aufgabe die das Modul hat ist das Feld, in dem die Fertige Berrechnung kommt, während des Erstellens der Seite zu verstecken.
-> Entweder mit css,aber lieber wäre mir aber es iwie per field_access zu machen.
Was ich bisher gemacht habe:
Das Modul erstellt, den Inhaltstyp per Install erstellt
Meine Fragen:
1.Wie kann ich den Node abrufen, wenn man diesen gerade abspeichern will?? Ist das hook_node_presave?
2.Wie kann ich ein Feld Wert abrufenß
3. Wie kann ich einen Wert in einem Feld speichern??
4. Wie kann ich anschließend den Node speichern?
5.Gibt es auch einen Hook um einem Feld eine Edit Berechtigung zu vergeben??
Gesucht sind Drupal Interne Funktionen, da ich diese nicht kenne.
- Anmelden oder Registrieren um Kommentare zu schreiben
Wenn Du mit hook_node_presave
am 11.12.2012 - 23:01 Uhr
Wenn Du mit hook_node_presave arbeitest, wird der Node danach automatisch gespeichert. Das brauchst Du nicht selbst zu tun. Du kannst mittels dsm($node) in Deinem Modul Dir den Node in seiner gesamten Struktur anzeigen lassen und das ist das Feld ein Bestandteil eines Node-Objekts, dem Du ganz einfach Werte zuweisen kannst. Wo ist also das Problem?
Beste Grüße
Werner
Danke
am 13.12.2012 - 17:01 Uhr
Danke. Wollte nur wissen ob es so möglich ist.
Jetzt habe ich bereits mein Skript fast fertig geschrieben. Es fehlt nur noch die Speicherung einer Variable in ein Feld. Bloß wie kann ich diese jetzt zuweisen??
Probiert habe ich einfach mal frei Schnauze:
$url = $node->field_url['und']['0']['value'];
$videostream = $node->field_videostream['und'];
$url = $videostream;
Jedoch wird der Wert des Feldes Videostream ja in $node->field_videostream['und']['0']['value'] gespeichert. Ich verstehe zwar nicht wieso drupal hier unnötige arrays erstellt aber ok.
Wäre über deine und andere Hilfe sehr dankbar.
Wenn Du ein Modul schreiben
am 13.12.2012 - 18:03 Uhr
Wenn Du ein Modul schreiben willst, solltest Du Dich schon etwas mit der Datenstruktur von Drupal vertraut machen.
['und'] ist die Language und => undefined
[0] das erste von vielen möglichen Werte-Feldern
['value'] der eingetragene Wert (da gab es auch mal 'save_value' für bereits gesäuberte Einträge)
Dateien werden aber anders behandelt, da die in der File-Tabelle eingetragen werden. Also mußt Du dafür sorgen, daß das auch passiert. Da wäre dies der passende Beitrag zum Einstieg.
Beste Grüße
Werner
Es ist ja eigentlich keine
am 13.12.2012 - 18:10 Uhr
Es ist ja eigentlich keine Datei. Sondern nur ein Text. Ich wollte bloß einem Feld den Text eines anderen Feldes übergeben.
Da das Feld,welches befüllt werden soll aber leer ist, ist nur Sprache undefined. Also muss ich ein Array erstellen. Danke! Wollte nur wissen ob es dafür eine Funktion gibt ein Feld zu befüllen. Bei den Hooks habe ich leider nix gefunden.
Liebe Grüße
Lirius
Die Berechnung läßt sich mit
am 14.12.2012 - 05:28 Uhr
Die Berechnung läßt sich mit Rules umsetzen. dazu brauchst du kein Modul
Das habe ich davor probiert.
am 14.12.2012 - 10:37 Uhr
Das habe ich davor probiert. Leider ging das ganze nicht so gut mit der Umsetzung. Da Rules Probleme machte, wenn es einen html code in ein html feld einfügen sollte. Das Modul soll später aber auch noch erweitert werden und ich wollte dabei auch was lernen. Leider komm ich echt momentan nicht weiter, Es gibt doch sicher einen hook zum befüllen eines Feldes.
Ein Feld stellt sich als ein
am 14.12.2012 - 10:53 Uhr
Ein Feld stellt sich als ein Teil z.B. einer Node-Struktur dar. Werte können dort ganz normal Programm technisch zugewiesen werden (
$node->feldname['und'][0]['value'] = 4711;
). Wieso sollte man für die einfach Zuweisung eines Wertes einen Hook benötigen?Beste Grüße
Werner
So hab ich die Zuweisung auch
am 14.12.2012 - 11:00 Uhr
So hab ich die Zuweisung auch gemacht, aber der Wert wird dann anschließend nicht bei Ende der node_presave function in der Datenbank gespeichert. Es geht mir also um die Speicherung des Wertes in der Datenbank.
Ist das Feld denn Bestandteil
am 14.12.2012 - 11:08 Uhr
Ist das Feld denn Bestandteil des Datentyps? Wenn Du Dir die Felder des Datentyps ansiehst, ist dieses Feld dabei? Sonst mußt Du erst das Feld über entsprechende Hooks definieren in einem eigenen Modul und/oder mittels der zugehörigen Hooks den Datentyp um dieses Feld erweitern. (Oder Du legst den Datentyp über die Benutzeroberfläche mit diesem Feld an.) Wenn Drupal nicht weiß, daß Dein Feld ein Bestandteil des Nodes ist, wird das Feld selbstverständlich auch nicht gesichert.
Beste Grüße
Werner
Hab meinen Fehler gefunden.
am 17.12.2012 - 15:10 Uhr
Hab meinen Fehler gefunden. Steige wieder in Php ein, deswegen passieren mir manchmal dumme Fehler. Ich habe $node->field_url['und']['0']['value'] einer Variable zugewiesen und dieser dann einen Wert zugewiesen. :P
Herzlichen Dank!
Edit: Bin weiterhin am erweitern des Moduls. Gibt es einen Hook, der überprüft ob ein Node existiert, welcher in Feld A den Wert A hat und in Feld B den Wert B??
Nein, so etwas gibt es nicht
am 17.12.2012 - 18:23 Uhr
Nein, so etwas gibt es nicht als Hook, da die doch etwas andere Aufgabenstellungen haben. Du könntest das aber mittels Views basteln. In den Einstellungen zu Views kannst Du angeben, daß Du die zugehörige Query bei der Vorschau sehen möchtest. Die nimmst Du dann, überarbeitest sie noch mal ein wenig und baust sie dann in Dein Modul ein. Sieh Dir dazu die Datenbank API von Drupal an.
Beste Grüße
Werner
Vielen Dank für deine Tips :D
am 25.12.2012 - 12:58 Uhr
Vielen Dank für deine Tips :D
Edit: Wie kann ich in Drupal überprüfen, ob der $link in Drupal existiert, also das ein Inhalt gefunden wurde.
-> Hab es jetzt selbst eine Funktion geschrieben, da es anscheinend keine funktionen dafür gibt.
Danke für die Hilfe!