it-swarm.com.de

Wie füge ich Felderfassungswerte programmgesteuert ein und aktualisiere sie?

Ich möchte Field Collection Werte einfügen und aktualisieren. Ich benutze Drupal 8 mit field_collection 8.x-1.0-alpha1.

Installieren

Ich habe einen neuen Inhaltstyp test_content_type Mit folgenden Feldern erstellt:

  • Titel
  • Körper
  • Testfeldsammlung
    • Maschinenname: field_test_field_collection
    • Typ: field collection

Die Feldsammlung field_test_field_collection Hat nur ein Feld:

  • Beispieltext
    • Maschinenname: field_text
    • Typ: text

Das Problem

Ich habe auch einen Knoten mit Werten erstellt, zum Beispiel Lorem Ipsum Als field_text.value, Aber ich weiß nicht, wie ich den Wert programmgesteuert lesen und definieren soll. Ich habe Folgendes versucht, das body aktualisiert, aber field_text Nicht aktualisiert:

<?php

namespace Drupal\my_module\Controller;

use Drupal;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityStorageInterface;

class FieldCollectionTestController extends ControllerBase {
    /**
     * @return array
     */
    public function content() {
        $nodeId = 1402;

        /** @var EntityStorageInterface $entityStorage */
        $entityStorage = Drupal::entityTypeManager()->getStorage('node');
        $node = $entityStorage->load($nodeId);

        // Dump.
        {
            ob_start();
            var_dump($node->field_test_field_collection->field_text);
            $dump = ob_get_clean();
        }

        // Update node and field collection.
        {
            $exampleText = "Updated at " . time();

            $node->body = $exampleText;
            $node->field_test_field_collection->field_text = $exampleText;

            $node->save();
        }

        $response = [
            '#theme' => 'item_list',
            '#title' => 'Dumps',
            '#items' => [
                [
                    '#type' => 'markup',
                    '#markup' => $dump,
                ],
            ],
        ];

        return $response;
    }
}

Der Wert von $dump Ist null.

Frage

Wie können Sie Feldsammlungen in Drupal 8) einfügen, aktualisieren und löschen?

2
Rayne

Das folgende Snippet (kompatibel mit field_collection 8.x-1.0-alpha1) Verwendet ein vorhandenes FieldCollectionItem erneut oder erstellt bei Bedarf ein neues. Die letzten Zeilen zeigen, wie Sie Felder in FieldCollectionItem ändern.

Wenn eine Feldsammlung mit einem anderen Namen vorhanden ist, sollte es ausreichen, alle Vorkommen von field_test_field_collection Durch den Computernamen der benutzerdefinierten Feldsammlung zu ersetzen.

<?php

// […]

$nodeId = 123;

/** @var EntityStorageInterface $entityStorage */
$entityStorage = Drupal::entityTypeManager()->getStorage('node');

$node = $entityStorage->load($nodeId);
$node->body = 'Body Update: ' . date('c');

/** @var Drupal\Core\Field\FieldItemList $fieldItemList */
$fieldItemList = $node->field_test_field_collection;

// Reuse existing Field Collection.
if (count($fieldItemList))
{
    /** @var \Drupal\field_collection\Plugin\Field\FieldType\FieldCollection $fieldCollection */
    $fieldCollection = $fieldItemList[0];
    $fieldCollectionItem = FieldCollectionItem::load($fieldCollection->value);
}

// Create new Field Collection.
else
{
    $fieldCollectionItem = FieldCollectionItem::create([
        'field_name' => 'field_test_field_collection',
    ]);

    $fieldCollectionItem->setHostEntity($node);

    $node->field_test_field_collection[] = [
        'field_collection_item' => $fieldCollectionItem,
    ];
}

$fieldCollectionItem->set('field_text', 'Last Update: ' . date('c'));

$node->save();

Das Löschen einer vorhandenen Sammlung ist so einfach wie: fieldCollectionItem->delete();

Weitere Informationen finden Sie im Quellcode der Unit-Test-Klasse Drupal\field_collection\Tests\FieldCollectionBasicTestCase.

3
Rayne