[gelöst]Node-Titel soll manipuliert werden mit preprocess_page_title(&$variables) - brauche Text statt Value einer Text-Liste
Eingetragen von montviso (2188)
am 19.05.2017 - 07:25 Uhr in
am 19.05.2017 - 07:25 Uhr in
Titel eines Templates soll manipuliert werden mit preprocess_page_title(&$variables) .
Klappt soweit gut, nur finde ich einfach nicht, wie ich aus einem Node-Listenfeld den Text raus finde, statt dem Value.
Dieser soll vor den Titel geschrieben werden.
ich habe folgendes getestet:
<?php
$node->field_name->getValue();
$node->field_name->getString();
$node->field_name->value;
?>
Ich bekomme immer nur den Wert der Option, statt den Text.
Ich finde einfach in allen Dokus nicht die richtige Syntax dafür.
-----Edit: Titel der Frage wurde geändert ------------
- Anmelden oder Registrieren um Kommentare zu schreiben
Hallo,
am 19.05.2017 - 10:46 Uhr
wäre es nicht einfacher die setTitle getTitle Funktionen der Node Entity zu benutzen?
https://api.drupal.org/api/drupal/core!modules!node!src!Entity!Node.php/function/Node%3A%3AsetTitle/8.2.x
Tipp:
$node->field_name müsste ein Array sein wenn das Feld mehrere Werte haben kann!
Daher kann das nicht richtig sein $node->field_name->getValue();
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
$node->field_name->getValue()
am 19.05.2017 - 11:25 Uhr
$node->field_name->getValue(); gibt den Value (key) aus den Optionen wieder.
Das funktioniert schon so.
$node->field_name ist ein Array und irgendwo in seinen tiefsten Innereien gibt es die für diesen Feldtyp erlaubten Werte (Key / Value).
Da könnte ich den Wert - statt Key - im Notfall raus bekommen.
Aber das muß doch eleganter gehen.
Ob $this->set('title', $title); eleganter wäre?
Keine Ahnung...ich dachte, dafür ist die Template-Funktion gedacht.
Der Titel darf ja nur in der Ausgabe an der einen Stelle auf der Oberfläche geändert werden, nicht grundsätzlich für den Node.
Manipuliert diese Funktion nicht den Node in der Datenbank?
Es ändert jedenfalls nicht mein Problem, daß ich erst mal an den Text statt Key der Optionen-Liste kommen muß.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Hi, solange nicht
am 19.05.2017 - 12:28 Uhr
Hi,
solange nicht $node->save();
aufgerufen wird wird es nicht gespeichert.
Wenn $node->field_name ein Array ist, was erwartest Du denn dass $node->field_name->getValue() zurückgibt?
Probier mal:
dpm($node->toArray());
dpm(sizeof($node->field_name));
Um den ganzen Node als Array auszugeben und um zu sehen wieviele Werte Dein Feld hat.
Ich denke es müsste eher so etwas sein.
$node->field_name[0---x]->getString();
PS:
Ich habe nicht viel Erfahrung mit D8
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
"Ich habe nicht viel
am 19.05.2017 - 14:54 Uhr
"Ich habe nicht viel Erfahrung mit D8"
Haha....da sind wir schon zu Zweit. ;-)
Ich versuche es noch mal besser darzustellen.
ich habe eine Feld mit einer mehrzeiligen Text-Liste:
<select>
<option value='key1'>value 1</option>
<option value='key2'>value 2</option>
<option value='key3'>value 3</option>
</select>
Die o.g. Funktionen, die ich getestet habe (weil so dokumentiert) machen den gleichen Fehler:
Sei liefern den key, aber nicht den value.
Ich brauche eine Funktion, die statt dem Key den Value ausgeben.
Das sollt eigentlich möglich sein, ohne mehrstufig verschachtelten Arrays nachzuspüren.
Ich habe einfach noch nicht die richtige Syntax gefunden - trotz stundenlangem Suchen.
Vielleicht liest ja auch noch jemand mit, der sowas in Drupal 8 schon mal gemacht hat.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Hmm,dieser HTML Code ist
am 19.05.2017 - 17:18 Uhr
Hmm,
dieser HTML Code ist aber für ein Single Select Feld!
Wenn das Feld mehrere hat, Werte müsste das Select doch ein "multiple" Attribut haben.
Ist es denn nun ein Feld das mehrere Werte haben kann oder nur einen?
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
PS: field_name->getLabel(); h
am 19.05.2017 - 17:36 Uhr
PS:
field_name->getLabel();
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Field%21FieldConfigBase.php/function/FieldConfigBase%3A%3AgetLabel/8.2.x
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Das Select Feld kann nur
am 19.05.2017 - 20:10 Uhr
Das Select Feld kann nur einen Wert haben.
Hoi...das mit dem getLabel() klingt gut.
Werde ich morgen testen.
Heute ist Feierabend, danke jedenfalls schon mal!
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Jetzt habe ich es
am 20.05.2017 - 16:39 Uhr
Jetzt habe ich es getestet:
Mit getLabel() wird die das Label der Select-Box ausgegeben - wie ich befürchtet habe.
Mit getName() wird der Feldname ausgegeben.
Sowas wie getText() scheint es nicht zu geben.
Jedenfalls finde ich nichts.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Hallo, in Views wirst Du nur
am 20.05.2017 - 17:43 Uhr
Hallo, in Views wirst Du nur die Value(index) bekommen da in der DB nur dieser Wert gepeichert wird.
Woher kommen denn die Optionen des Select Feldes ?
Sollten Sie statisch sein hast Du ja den Index und kennst Die dazu gehörigen Strings.
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Von Views war nie die
am 20.05.2017 - 19:24 Uhr
Von Views war nie die Rede.
Es handelt sich um einen Node, der ausgegeben wird.
Das Feld ist ein Listen-Feld (Text) dieses Node-Typs.
Wie kommst Du darauf, daß der Wert nicht in der DB gespeichert wird?
Der ist das schon gespeichert.
Ich schrieb ja, daß irgendwo in der tiefsten Verschachtelung der $variables auch ein array mit allowed fields mit key/value Paaren angegeben ist.
Dort könnte ich das ja raus holen.
Und natürlich könnte ich die Werte auch in der Function fest eintragen und mit dem Key ermitteln.
Die Werte werden vielleicht einmal im Jahr ergänzt.
Aber das ist doch keine saubere Lösung.
Ich bin sicher, die gibt es, ich kenne sie nur noch nicht.
Ich gehe jetzt mal zu stackexchange.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Sorry,mein Fehler es ging
am 20.05.2017 - 20:43 Uhr
Sorry,
mein Fehler es ging gar nicht um einen Views Hook.
das hatte ich wohl falsch gelesen.
Wie ich darauf komme dass das Label der Select Option nicht in der DB gespeichert wird?
Das liegt daran wie ein Post Request einer solchen Form ausgeführt wird und
dabei werden bei einem Single Select Field eigentlich nur der Name des Select Feldes und die Value(bzw. index) der Option
gesendet.
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Ja, Du hast ja recht...da muß
am 22.05.2017 - 08:32 Uhr
Ja, Du hast ja recht...da muß ich mich auch erst dran gewöhnen, daß nicht alles in der Daba steht.
Also, ich denke mal laut vor mich hin:
die Option-Labels stehen in der Datei field.storage.node.field_name.yml
settings:
allowed_values:
-
value: key1
label: 'Value 1'
-
value: key2
label: 'Value 2'
-
value: key2
label: 'Value 2''
Man bräuchte also sowas in der Art:
<?php
$mystring = $node->field_name->getValue()->getLabel();
?>
Das wirft einen Fehler aus.
Aber irgendwie in die Richtung muß es gehen.
Jetzt habe ich jedenfalls eine Idee, welchen Teil der Doku ich brauche.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Jetzt habe ich alles zusammen
am 22.05.2017 - 09:00 Uhr
Jetzt habe ich alles zusammen gebaut. ;-)
Danke Hyp1 für den Anstoß, die Config außerhalb der Datenbank zu suchen.
Theoretisch weiß ich das ja, aber dann bin ich doch wieder in die alte Denke gefallen.
So sieht das jetzt komplett aus:
<?php
function theme_preprocess_page_title(&$variables) {
$parameters = \Drupal::routeMatch()->getParameters()->all();
//nur bei Nodes
if (isset($parameters['node'])) {
if($node = \Drupal::routeMatch()->getParameter('node')){
//nur bei bestimmtem Inhaltstyp
if ( ($node->bundle() == 'my-node-type') ) {
//hole option-key
$fieldnamekey = $node->field_fieldname->getString();
//hole erlaubte Werte fuer dieses Listen-Feld
$fieldname = $node->field_fieldname->getSettings()['allowed_values'];
//hole Option-Label
$fieldvalue = $fieldname[$fieldnamekey];
$string = "<div id='uebersicht'><a href='/fieldname/".$fieldnamekey."'><i aria-hidden='true' class='fa fa-th'></i></a></div>";
$variables['title'] = Drupal\Core\Render\Markup::create($string."<span class='fieldname'>".$fieldvalue."</span>".$variables['title']);
}
}
}
}
?>
Die Feinheiten der HTML-Container brauchen noch Nachbarbeit, aber jetzt habe ich alle Bausteine.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Hallo, müsste getValue nicht
am 22.05.2017 - 09:03 Uhr
Hallo,
müsste getValue nicht ein array für das Select Field zurückgeben ?
$myarray = $node->field_name->getValue();
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Ja, das gibt ein Array
am 22.05.2017 - 13:53 Uhr
Ja, das gibt ein Array zurück, nur leider nicht mit den gewünschten Werten.
Es gibt nur 0 und value als Keys.
So $node->field_name->getValue()['0']['value'] bekommt man genau das Gleiche, wie mit $node->field_name->getString().
Die Konfigurationswerte sind viel tiefer verschachtelt im Array $variables zu finden.
Das geht besser mit der settings-Methode.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de