Verständnisfrage zu Fields
am 05.09.2013 - 14:15 Uhr in
Hi,
ja es tut mir Leid, dass ich euch mit wahrscheinlich trivialen Fragen nerven muss. Aber, ich finde einfach keine Lösungen zu diesem Thema:
Ich lege ein Liste|Text Feld an und übergebe dieser Liste mehrere Werte, wenn ich nun einen Node anlege (ein Wert der Liste ist also verwendet) und nach diesem Text in der DB suche, finde ich ihn unter field_data_fieldname und unter field_revision_fieldname. Ändere ich diesen Wert ändert sich in der Ansicht rein gar nichts. Weiterhin ist mir unschlüssig, wie die Liste gespeichert wird, wenn noch gar kein Node mit dem Feld angelegt ist, dann ist kein Wort der Liste zu finden. Kann mir das jemand eventuell erklären?
mit freundlichem Gruß
Jens
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich habe dein Problem nicht verstanden
am 05.09.2013 - 18:06 Uhr
aber generell solltest du NIEMALS irgendetwas in der Datenbank ändern, außer es ist ausdrücklich in einer Anleitung beschrieben.
Drupal ist hochgradig relational, und die Art und Weise, wie Informationen abgelegt werden ist keineswegs trivial.
Versuche zu beschreiben, was du tun möchtest, dann können wir leichter helfen.
Für Listen, die mit Einträgen verlinkt werden, ist am besten Taxonomy zu benutzen.
Grüße
Ronald
Hi, danke für die Antwort.
am 06.09.2013 - 05:58 Uhr
Hi,
danke für die Antwort. Das NIEMALS habe ich befürchtet. Drupal ist nur die Schnittstelle für andere Bibliotheken und Scripst in unserem System. So starten wir einige Prozesse über entsprechende Nodes. Wenn diese Prozesse laufen bzw. beendet sind, ändern sich auch einige Attribute (Fields-Werte) des Nodes und diese möchte ich nicht manuell ändern, daher muss ich das über die Datenbank machen, es sei denn es gibt (PHP-) Funktionen, an die ich die entsprechenden neuen Werte übergeben kann.
mit freundlichem Gruß
Jenne
das mit den Listen lassen wir erstmal, da ging es mir darum, wenn ich ein List|Text-Field erzeuge und mit Werten fülle, dann sind die Werte in der Datenbank nicht zu finden.
Sieh dir für diese Zwecke Feeds an
am 06.09.2013 - 08:09 Uhr
Mit feeds (und Zusatzmodulen) kannst du Inhalte aus anderen Systemen (auch automatisiert) in Drupal holen, oder aus Drupal ausspielen.
Ob XML oder CSV bleibt dir überlassen.
Darüber lassen sich auch Taxonomy-Listen pflegen.
Grüße
Ronald
Okay, damit werde ich mich
am 06.09.2013 - 10:07 Uhr
Okay, damit werde ich mich jetzt einmal näher beschäftigen. Ich möchte aber dennoch explizit nur ein einziges Feld eines bestehenden Nodes ändern, dass muss doch auch möglich sein.
mfg
Jens
In einem eigenen Modul kannst
am 06.09.2013 - 13:23 Uhr
In einem eigenen Modul kannst Du so etwas leicht realisieren. Du definierst in Deinem Modul einen Pfad, über den eine von Dir geschriebene Routine aufgerufen wird. Die kann sich jetzt von Irgendwo, z.B. mittels eines HTTP-Request auf einer anderen Webseite, die Informationen abholen, den Node laden und das Feld verändern. Aber da mußt Du Dir jetzt kreativ etwas überlegen.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hi, vielen Dank, das scheint
am 09.09.2013 - 07:01 Uhr
Hi,
vielen Dank, das scheint auch irgendwie das richtige Vorgehen zu sein. Doch kriege ich das eventuell auch mit einem einfachen php-Script hin?
Hier stellt sich mir natürlich die Frage, wie ich die Drupal-Api eingebunden bekomme
<?php
$nid = 10;
$node = node_load($nid);
$title = $node->title;
var_dump($node);
?>
mfg
Jens
Es ist viel einfacher, ein
am 09.09.2013 - 08:33 Uhr
Es ist viel einfacher, ein eigenes Drupal Modul zu schreiben:
Du überlegst Dir einen eindeutigen Namen für Dein Modul [MODUL].
Du legst ein sites/all/modules einen Ordner mit diesem Namen an.
Da hinein kommen zwei Dateien [MODUL].info und [MODUL].module (das ist PHP-Code)
[MODUL].info:
name = Lesbarer Name für Dein Modul (erscheint auf der Modul Seite)
description = Beschreibung der Funktion Deines Moduls (erscheint auf der Modul Seite)
core = 7.x
Evtl. kann man dependencies eintragen.
dependencies[] = modulname (immer eine neue Zeile pro Modul, das man als Voraussetzung braucht)
[MODUL].module
<?php
/**
* Implements hook_menu().
*/
function [MODUL]_menu() {
$items = array();
$items['Dein/Pfad'] = array(
'title' => 'ein Titel',
'description' => 'Eine Beschreibung',
'page callback' => '[MODUL]_function_name',
'access callback' => TRUE,
);
return $items;
}
function [MODUL]_function_name() {
/*
Dein Code Hier
*/
}
?>
Die untere PHP-Klammer sollte man immer weglassen. Die dient hier nur zum Syntax Highlighting.
Dann hast Du ein funktionierendes Modul, das Du über die Drupal Modul-Seite aktivieren kannst und in dem die gesamte Drupal-API zur Verfügung steht.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hallo Werner, ich danke dir
am 10.09.2013 - 06:37 Uhr
Hallo Werner,
ich danke dir für dein Input. Leider scheine ich das Prinzip, trotz einiger Tutorials nicht ganz zu verstehen. Mein Ansatz sieht ja jetzt so aus, nur leider habe ich keine Ahnung, wie ich die Funktion jetzt vernünftig ansprechen kann.
<?php
/**
* Implements hook_menu().
*/
function nodeupdate_menu() {
$items = array();
$items['admin/config/Modul'] = array(
'title' => 'NodeUpdate',
'description' => 'mit Hilfe dieses Moduls, soll es möglich werden ein Nodeupdate durchzuführen',
'page callback' => 'nodeupdate_function_nodeupdate',
'access callback' => TRUE,
);
return $items;
}
function nodeupdate_function_nodeupdate($nodeid,$newfieldvalue) { //Nodeid muss vorhanden sein
$node = node_load($nodeid);
$node->field_status[$node->language][0]['value'] = $newfieldvalue;
node_save($node);
}
?>
Reicht das nun aus oder muss da noch deutlich mehr rein?
mit freundlichem Gruß
Jenne
p.s. das Drupal Modul fivestars habe ich aus dem Drupal 7 - Buch schon nach gebaut, nur leider fehlt mir hier jeglicher Ansatz, denn ich brauche keine Oberfläche oder sonstiges.
Ich sehe zwei Probleme, der
am 10.09.2013 - 07:01 Uhr
Ich sehe zwei Probleme, der Pfad ist nicht korrekt (Du solltest keinen Pfad aus dem Admin-Bereich dafür nutzen) und der hat außerdem keinen Parameter, denn wie sollen zweitens Deine Argumente in die aufgerufene Funktion kommen?
Sieh Dir doch mal das Node-Modul an. Da siehst Du wie man so etwas macht. Du brauchst in hook_menu noch weitere Angaben im Items-Array. Sieh Dir dazu die API Dokumentation an.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hi, vielen Dank. Das mit dem
am 10.09.2013 - 07:08 Uhr
Hi, vielen Dank. Das mit dem Pfad erschließt sich mir.Gehörst du einer Softwareschmiede oder einem Dienstleister an?
mfg
Jenne
Hi, also, wenn ich jetzt
am 10.09.2013 - 12:22 Uhr
Hi, also, wenn ich jetzt folgenden Code ausführe, nach der function_hook_menu - Anweisung der API, sollte ich eigentlich auch den fisch ausgegeben bekommen. Das bekomme ich aber nicht, wenn ich drupalbeispiel.de/nodeupdate/fleisch/ aufrufe bekomme ich lediglich die "echo"s und das wort fleisch übergeben. Wie schaffe ich es dass ich da mehrere Werte abfangen und übergeben kann?
mit freundlichem gruße
Jens
p.s.@Werner ich werde mich sicherlich in Zukunft einmal beruflich bei dir melden, bzw. jemand aus der Firma
<?php
/**
* Implements hook_menu().
*/
function nodeupdate_menu() {
$items = array();
$items['nodeupdate'] = array(
'title' => 'NodeUpdate',
'description' => 'mit Hilfe dieses Moduls, soll es möglich werden ein Nodeupdate durchzuführen',
'page_arguments'=> array(1,'fisch'),
'access callback' => TRUE,
'page callback' => 'nodeupdate_function_nodeupdate',
);
return $items;
}
function nodeupdate_function_nodeupdate($arg) { //Nodeid muss vorhanden sein
$nodeid=12;
$newfieldvalue="huhu";
var_dump($arg);
echo $nodeid;
echo $newfieldvalue;}
?>
Okay, ich habe es gerafft, wenn ich mehrer Parameter an die URL hänge, dann übergebe ich die einfach indem ich die Funktion erweitere:
<?php
function nodeupdate_function_nodeupdate($arg1,$arg2....) { //Nodeid muss vorhanden sein
$nodeid=12;
$newfieldvalue="huhu";
var_dump($arg1);
var_dump($arg2);
....
echo $nodeid;
echo $newfieldvalue;}
?>
Aber geht das nicht irgendwie eleganter? mit nodeupdate?wert1=ads&wert2=das
Du übergibst 2 Argumente bei
am 10.09.2013 - 12:23 Uhr
Du übergibst 2 Argumente bei page_arguments, den Wert #### aus der URL bei nodeupdate/#### und den String 'fisch'. In der Funktion
function nodeupdate_function_nodeupdate($arg)
hast Du aber nur ein Argument angenommen.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Okay, das ich jetzt mehrere
am 10.09.2013 - 12:28 Uhr
Okay, das ich jetzt mehrere Werte ausgelesen bekomme, habe ich hinbekommen, jedoch nicht die 'page_arguments'. Naja nach und nach werde ich dahinter kommen.
mfg
Jens
Sieh Dir mal die
am 10.09.2013 - 12:31 Uhr
Sieh Dir mal die API-Dokumentation an zu drupal_get_query_parameters.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
He, vielen lieben Dank, ich
am 10.09.2013 - 13:49 Uhr
He, vielen lieben Dank, ich habe es jetzt auch hinbekommen, nur glaube ich das nicht alle Instanzen des Feldes, abgeändert werden, vielleicht kannst du mir noch einen Ratschlag geben.
<?php
<?php
/**
* Implements hook_menu().
*/
function nodeupdate_menu() {
$items = array();
$items['nodeupdate'] = array(
'title' => 'NodeUpdate',
'description' => 'mit Hilfe dieses Moduls, soll es möglich werden ein Nodeupdate durchzuführen',
'page_arguments'=> array(1,'foo'),
'access callback' => TRUE,
'page callback' => 'nodeupdate_function_nodeupdate',
);
return $items;
}
function nodeupdate_function_nodeupdate($nodeid,$wert) { //Nodeid muss vorhanden sein
//var_dump(node_load($nodeid));
//var_dump($wert);
//$node = node_load($nodeid);
//var_dump(node_load($nodeid));
$node = node_load($nodeid);
//$field = $node->field_running['und'][0]['value'];
//var_dump($node->field_running['und'][0]['value']);
$node->field_running['und'][0]['value'] = $wert;
node_save($node);
//var_dump($node);
}
?>
Der Aufruf nodeupdate/12/wert ändert jetzt für Node 12 den Wert des field_running in "wert", reicht das echt schon? Wie schaut es mit den revisions aus? werden die auch abgeändert?
mfg
Jens
Da bin ich jetzt nicht
am 10.09.2013 - 16:37 Uhr
Da bin ich jetzt nicht sicher, da ich das noch nicht ausprobiert habe. Ich vermute, daß node_save eine neue Version des Nodes erzeugt. Wieso sollten auch die alten Feldwerte geändert werden? Das widerspricht doch gerade dem Revisioning.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hi, okay. Also bis jetzt
am 12.09.2013 - 05:46 Uhr
Hi, okay. Also bis jetzt scheint das alles prima zu laufen, ich beschäfftige mich jetzt nur noch mit der Query-Mehtode, damit die URL "anständiger" abgefragt wird und auch dem defacto Standard entspricht.
Ich werde die entsprechende Funktion posten.
mfg
Jens