Ausgewählten Wert einer Auswahlliste per php auslesen
am 28.01.2014 - 11:54 Uhr in
Hallo,
ich habe mir eine neue Namenskonvention für meine Inhaltstypen vom Typ 'Datei' ausgedacht, und schreibe jetzt ein Modul, dass mir meine Nodes auf die neue Namenskonvention prüft und bei Bedarf ändert. Der Inhaltstyp enthält eine Datei, sowie einige Metadaten, die man beim hochladen angeben muss, z.B. aus welchem Jahr die Datei stammt oder zu welcher Kategorie sie gehört.
Im Node-Title soll nun die Kategorie und der Dateiname enthalten sein, die Kategorie wird über eine Auswahlliste ausgewählt.
Wie liest man per php den gewählten Wert einer Auswahlliste aus?
Die möglichen Werte einer Auswahlliste werden ja in einer Datei in der Datenbank gespeichert. In der Tabelle des Auswahlfeldes steht unter field_fieldname_value der key, z.B. value_1. Wie wird jetzt aber dieser 'key' seinem Wert zugeordnet (value_1|Wert 1) und wie kann ich den Wert per php auslesen?
Gruß
Frank
- Anmelden oder Registrieren um Kommentare zu schreiben
HAllo, so ganz klar ist mir
am 28.01.2014 - 13:10 Uhr
HAllo,
so ganz klar ist mir die Sache nicht, die Du willst.
Aber erster Anlaufpunkt sollte eigentlich die API sein und keine selbstgestrickten PHP-Abfragen. Ich schätze, das hier was dabei ist für Dich: https://api.drupal.org/api/drupal/modules!field!field.info.inc/7
Gruß
Christian
Don't code today what you can't debug tomorrow
Ariya Hidayat
Hallo,danke für deine
am 28.01.2014 - 13:44 Uhr
Hallo,
danke für deine Antwort.
Ich versuche in meinem Modulcode herauszubekommen, welche Kategorie ein Benutzer einem neuen Inhalt vom Typ 'Datei' gegeben hat, z.B. Neubau, Altbau, etc.. Wenn ich mir den Node über node_load hole, und dann auf das Feld zugreife und mir das mal probehalber ausgeben lasse steht da nur 'Array'. Was ich brauche ist ein Weg bis auf den tatsächlich ausgewählten Wert zuzugreifen, z.B. 'Neubau', damit ich dies als Teil des neuen Nodetitles benutzen kann.
Ich hoffe ich konnte mich halbwegs klar ausdrücken. Hier noch etwas Code:
<?php
$query = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('type', 'datei', '=')
->execute();
$array = array();
while ($record = $query->fetch()) {
$pos = strpos($record->title, '=>');
if ($pos === FALSE) {
$node = node_load($record->nid);
$kategorie = $node->field_kategorie;
$string = "Kategorie: " . $node->field_kategorie;
$array[] = $string;
}
?>
wenn Du 'print_r($string)'
am 28.01.2014 - 13:32 Uhr
wenn Du 'print_r($string)' machst (was ich dann aber umbenennen würde ;) ), siehst Du doch deine Werte, oder?, und kannst dann darauf zugreifen.
Don't code today what you can't debug tomorrow
Ariya Hidayat
Nein, leider nicht. In
am 28.01.2014 - 13:45 Uhr
Nein, leider nicht.
In '$kategorie' steht nach einem '$kategorie = $node->field_kategorie;' nur 'Array', kein Wert.
Ein print_r($node->field_kategorie); gibt einfach nur '1' zurück.
mach eine var_dump
am 28.01.2014 - 14:15 Uhr
auf das $node object.
Das liefert dir dann zwar sehr viel, aber eben auch die gewünschte Struktur, aus der du dann den richtigen Zugriff ableiten kannst.
Grüße
Ronald
das hier gibt die Kategorie
am 28.01.2014 - 14:48 Uhr
das hier gibt die Kategorie im Klartext aus, kannst Du ja einbauen:
$values = field_info_field('field_kategorie');
print_r ($values['settings']['allowed_settings']);
ob das so ganz konform ist (multilingual usw.. usw...), weiß ich jetzt nicht, ist jetzt mal eine Anregung - schau Dir auch mal das Array genauer an.
Gruß
'Christian
edit:
so in der Art könntest Du eine Zuweisung dann machen, (geht sicher viel schöner..)
$values = field_info_field('field_kategorie');
$key = $node->field_kategorie['und'][0]['value'];
print $values['settings']['allowed_values'][$key];
Don't code today what you can't debug tomorrow
Ariya Hidayat
Vorerst ist das die Lösung
am 28.01.2014 - 20:00 Uhr
Hallo,
nach einigen weiteren Stunden des Rumprobierens und vie Lesens, zusammen mit Christians Tip, ist das vorerst die schönste Lösung die ich gefunden habe:
$items = field_info_field('field_kategorie');
$wrapper = entity_metadata_wrapper('node', $nid);
$key = $wrapper->field_kategorie->value();
$value = $items['settings']['allowed_values'][$key];
So muss man sich wenigstens nur einmal von Array zu Array hangeln. Der entitiy_metadata_wrapper steht einem zur Verfügung wenn man das Modul Entity installiert hat. Hier noch ein paar Links zu Seiten, die letztendlich zum Ergebnis geführt haben:
http://comm-press.de/de/blog/keine-angst-vor-entitymetadatawrapper
http://deeson-online.co.uk/labs/programatically-access-field-data-using-...
Ob das die empfohlene Lösung ist, weiß ich nicht, wie es mit multilinugual aussieht weiß ich auch nicht. Wenn jemand eine schönere Lösung weiß, nur her damit ;-)
Grüße
Frank
Hallo, wenn Du nur an den
am 28.01.2014 - 20:46 Uhr
Hallo,
wenn Du nur an den Feldwert rankommen musst, geht auch:
$values = field_view_field('node', $node, 'field_kategorie');
$value = $values[0]['#markup'];
Gruß
Christian
Don't code today what you can't debug tomorrow
Ariya Hidayat
Ja, ich muss nur an den
am 28.01.2014 - 21:01 Uhr
Ja, ich muss nur an den Feldwert rankommen, dass hatte ich heute mittag aber auch zweimal beschrieben.
Man, da hätte ich mir auch ne Menge Nerven in den letzten Stunden sparen können.
Na ja, wieder was dazu gelernt ;-)
Gruß
Frank