it-swarm.com.de

Wie wende ich einen Feldformatierer programmgesteuert auf ein Knotenfeld an?

Ich habe den folgenden Code, um den Wert zu erhalten, der in einem Feld gespeichert ist

$nid = 76;
$node = \Drupal::service('entity.manager')->getStorage('node')->load($nid);
foreach ($node->field_aaaa as $delta) {      
  dpm($delta->value);
}

Damit kann ich den richtigen Wert erhalten, sagen wir:

 * id_string1
 * id_string2
 * id_string3

Aber mein Feld hat einen Feldformatierer namens title_formatter, Der die Zeichenfolge id_string1 Nimmt und ungefähr Folgendes anzeigt:

String 1

In der Benutzeroberfläche funktioniert dies einwandfrei, wenn ich meinen Titelformatierer (title_formatter) für das Feld ausgewählt habe. Beim Anzeigen meines Knotens wird 'String' Angezeigt.

Aber wie kann man den Feldformatierer programmgesteuert auf die Feldwerte anwenden?

3

Der Builder für Entitätsansichten bietet eine Methode zum Erstellen eines Renderarrays für ein einzelnes Feld mithilfe eines Feldformatierers:

Drupal\Core\Entity\EntityViewBuilderInterface::viewField()

  /**
   * Builds a renderable array for the value of a single field in an entity.
   *
   * The resulting output is a fully themed field with label and multiple
   * values.
   *
   * This function can be used by third-party modules that need to output an
   * isolated field.
   * - Do not use inside node (or any other entity) templates; use
   *   render($content[FIELD_NAME]) instead.
   * - The FieldItemInterface::view() method can be used to output a single
   *   formatted field value, without label or wrapping field markup.
   *
   * The function takes care of invoking the prepare_view steps. It also
   * respects field access permissions.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $items
   *   FieldItemList containing the values to be displayed.
   * @param string|array $display_options
   *   Can be either:
   *   - The name of a view mode. The field will be displayed according to the
   *     display settings specified for this view mode in the $field
   *     definition for the field in the entity's bundle. If no display settings
   *     are found for the view mode, the settings for the 'default' view mode
   *     will be used.
   *   - An array of display options. The following key/value pairs are allowed:
   *     - label: (string) Position of the label. The default 'field' theme
   *       implementation supports the values 'inline', 'above' and 'hidden'.
   *       Defaults to 'above'.
   *     - type: (string) The formatter to use. Defaults to the
   *       'default_formatter' for the field type. The default formatter will
   *       also be used if the requested formatter is not available.
   *     - settings: (array) Settings specific to the formatter. Defaults to the
   *       formatter's default settings.
   *     - weight: (float) The weight to assign to the renderable element.
   *       Defaults to 0.
   *
   * @return array
   *   A renderable array for the field values.
   *
   * @see \Drupal\Core\Entity\EntityViewBuilderInterface::viewFieldItem()
   */
  public function viewField(FieldItemListInterface $items, $display_options = []);

Um diese Methode auf ein Feldobjekt anzuwenden, können Sie $field->view() verwenden. Wenn Sie nur einen einzelnen Wert aus einem mehrwertigen Feld ohne Wrapper und Beschriftung möchten, können Sie ihn auch für ein Feldelement (Delta) verwenden.

EDIT : Mit diesem Code finden Sie die Werte, die Sie benötigen.

$nid = 76;
$node = \Drupal::service('entity.manager')->getStorage('node')->load($nid);
foreach ($node->field_aaaa as $i => $delta) {   
  dpm($delta->value);
  dpm((string) \Drupal::service('renderer')->render($delta->view(array('type' => 'title_formatter'))));
}
4
4k4

Ich bin sicher, dass dies nicht die beste Option ist, aber zumindest funktioniert es.

Gehen Sie zu admin/structure/types/manage/YOUR_CONTENT_TYPE/display und wählen Sie Title Formatter für Ihr Feld, und verwenden Sie dann diesen Code:

$nid = 76;
$node = \Drupal::service('entity.manager')->getStorage('node')->load($nid);
foreach ($node->field_aaaa as $i => $delta) {   
  dpm($delta->value);
  dpm($node->field_aaaa->view('full')[$i]['#markup']);
}

Sie werden dies sehen:

* id_string1
* String 1
* id_string2
* String 2
* id_string3
* String 3

BEARBEITEN: Der richtige Weg mit der Antwort @ 4k4 lautet:

$nid = 76;
$node = \Drupal::service('entity.manager')->getStorage('node')->load($nid);
foreach ($node->field_aaaa as $i => $delta) {   
  dpm($delta->value);
  dpm((string) \Drupal::service('renderer')->render($delta->view(array('type' => 'title_formatter'))));
}
3